はじめに
Docker、とっても便利ですね。
コンテナ間の通信も Docker network を使用しコンテナ名でアクセスできたりして
とっても夢がひろがりんぐ。

ただ、コンテナをどんどん起動していくと Dockerホストを増やしていく必要があります。
Dockerホストをまたいだ通信は大変そうだなと思っていたら
Dockerには Overlay Network なんてすごいものが使えるみたいです。

なんと Dockerホストをまたいだコンテナ間のネットワークが作れるようです。
これは試してみないといけませんね!

というわけで試してみました。


環境情報
VirtualBox内に Ubuntu 15.10 × 3台 でDockerSwarmを構築し、
Overlayネットワークをその中に作ってみます。
各ホストはこんな感じです。

  • 192.168.56.102 consulコンテナ起動用
  • 192.168.56.103 swarm master, node
  • 192.168.56.104 swarm node
  • 192.168.56.105 swarm node

なお、ホストはすべてUbuntu15.10 で Docker1.11.0 をインストール済み。
また、RemoteAPIを有効にしてます。

root@ubuntu:~# uname -a
Linux ubuntu 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 15:35:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


初期環境設定
Docker SwarmクラスタのNode(192.168.56.104〜192.168.56.105 のホスト)に対して以下の設定をします。
これをしないと オーバレイネットワーク作成時に エラーが発生し作れません。

mkdir /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/docker.conf

[Service] ExecStart= ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:2375 –cluster-store consul://192.168.56.102:8500/nodes –cluster-advertise=enp0s8:2375

systemctl daemon-reload systemctl restart docker.service systemctl status docker.service

注意!
ここではまったのは cluster-advertise の設定でした。
NIC と port を設定する必要があるのですが ここで使用するNICは
SwarmNode として認識されたネットワーク(ここでは 192.168.56.0)を使用するNICを使う必要があります。要注意です。

環境の掃除
Swarmクラスタ構築前に全てのコンテナを消しておきます。

docker -H tcp://192.168.56.103:2375 rm $(docker -H tcp://192.168.56.103:2375 stop docker -H tcp://192.168.56.103:2375 ps -a -q)
docker -H tcp://192.168.56.104:2375 rm $(docker -H tcp://192.168.56.104:2375 stop docker -H tcp://192.168.56.104:2375 ps -a -q)
docker -H tcp://192.168.56.105:2375 rm $(docker -H tcp://192.168.56.105:2375 stop docker -H tcp://192.168.56.105:2375 ps -a -q)

Consulの起動
Consulホスト(192.168.56.102)にConsulを立ち上げます。

docker -H tcp://192.168.56.102:2375 pull progrium/consul
docker -H tcp://192.168.56.102:2375 run –name consul -d -p "8500:8500" -h "consul" –restart=always progrium/consul -server -bootstrap

Swarm の最新化
Swarmクラスタ構築前にSwarmの最新イメージをpullしておきます

docker -H tcp://192.168.56.103:2375 pull swarm
docker -H tcp://192.168.56.104:2375 pull swarm
docker -H tcp://192.168.56.105:2375 pull swarm

Swarm クラスタの構築
Swarm Managerを 192.168.56.103 で起動。
順次 Swarm Agentを起動し クラスタを構築します。

docker -H tcp://192.168.56.103:2375 run -d -p 12375:2375 swarm manage –replication –advertise 192.168.56.103:12375 consul://192.168.56.102:8500/nodes
docker -H tcp://192.168.56.103:2375 run -d swarm join –advertise=192.168.56.103:2375 consul://192.168.56.102:8500/nodes
docker -H tcp://192.168.56.104:2375 run -d swarm join –advertise=192.168.56.104:2375 consul://192.168.56.102:8500/nodes
docker -H tcp://192.168.56.105:2375 run -d swarm join –advertise=192.168.56.105:2375 consul://192.168.56.102:8500/nodes

Overlayネットワークの作成
本日のメインイベント、Overlayネットワークを作成します。
ここまでのオペレーションに問題が無ければ以下のコマンドで Overlay ネットワークが作成できます

docker -H 192.168.56.103:12375 network create –driver overlay mynet

Overlayネットワーク のテスト
Overlayネットワーク内に コンテナを順次起動していきます。
Swarm の設定がうまくいっていれば 以下で作成する各コンテナ(con1 〜 con3)はSwarmNode に分散されて起動します。

docker -H localhost:12375 run -dP –name con1 -h con1 –net mynet moremagic/ubuntu-sshd
docker -H localhost:12375 run -dP –name con2 -h con2 –net mynet moremagic/ubuntu-sshd
docker -H localhost:12375 run -dP –name con3 -h con3 –net mynet moremagic/ubuntu-sshd

ここでどこかのコンテナにはいってみて別のコンテナに SSHしてみましょう。
Overlayネットワークがうまくできていれば コンテナのホスト名で
Dockerホストをまたいだアクセスができるようになります。

docker -H localhost:12375 exec -ti con1 /bin/bash

ssh con2 → ログインできる ssh con3 → ログインできる

すごいっ!

参考資料
http://qiita.com/nmatsui/items/2811f2297343e1d50739
http://qiita.com/nmatsui/items/3ed2f21f7ee61d0827ea
https://thinkit.co.jp/article/8414