Docker for Macでswarmを使う

docs.docker.com

このチュートリアルに従って、Docker for Mac上でswarmを試した時にはまったのでメモ。

チュートリアルのように、virtualbox vm上のdocker-machine上で起動したデーモンをmanager nodeとして使う場合には問題にならないが、Docker for Mac上のデーモンをmanager nodeとして使う場合は注意が必要。virtualbox vm上のホストをwork nodeとして、このswarmに追加しようとすると、エラーになる。理由は以下の二つ。

その1

virtualbox vmとホスト間は、host-only-adaptorを使ってやり取りするのだが、このときは専用の(vboxnet0とかいう名前の)ネットワークインターフェースを使う必要がある。IPアドレスも当然違うので、--advertise-addrオプションで指定してあげること。

その2

こっちが問題の根源。Githubのissueにこんな投稿がある。

For security reasons, we choose to not expose that port directly.
https://github.com/docker/for-mac/issues/770

つまり、外部からDocker for MacのデーモンにIPアドレスを使ってアクセスできないということ。だから、(おそらく)virtualbox vm上からアクセスできないから、vm上のデーモンをnodeに追加できないのだろう。swarm joinするためには、(デフォルトで)manager nodeのあるデーモンの以下のポートが解放されている必要がある。

隠蔽されているポートを外部に公開するためには、

docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock

とかすれば隠蔽されているポートを解放することができる。この場合、1234番ポートを外部に公開できる。