Docker for Macでswarmを使う
このチュートリアルに従って、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のあるデーモンの以下のポートが解放されている必要がある。
- TCP port 2377 for cluster management communications
- TCP and UDP port 7946 for communication among nodes
- UDP port 4789 for overlay network traffic https://docs.docker.com/engine/swarm/swarm-tutorial/#open-protocols-and-ports-between-the-hosts
隠蔽されているポートを外部に公開するためには、
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番ポートを外部に公開できる。