前回構築したDocker1.9のOverlayネットワークにDocker Swarmクラスタを作成します。AWSやDigitalOceanなどDocker Machineの例が多いですが、今回はIDCFクラウド上にConsulを使いシンプルなSwarmクラスタをセットアップしてみます。
このシリーズ
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 1: Overlayネットワークの作成
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 2: Docker Swarmクラスタの作成
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 3: OverlayネットワークとDocker SwarmとDocker ComposeでRethinkDBをスケールさせる
参考
以下のサイトを参考にしました。
- Create a swarm for development
- Docker cluster swarm with consul
- docker networkでマルチホストネットワークを試してみた(docker-1.9.0)
仮想マシン
前回と同じ仮想マシンを使います。minion-[1-3]にSwarm Agentをインストールします。またminion-1にはSwarm Managerもインストールします。
| Dockerホストのhostname | Dockerホストのeth0 | Docker Swarm |
|---|---|---|
| minion-1 | 10.3.0.101 | Swarm Manager/Agent |
| minion-2 | 10.3.0.102 | Swarm Agent |
| minion-3 | 10.3.0.103 | Swarm Agent |
Dockerデーモンの起動オプション
minion-[1-3]のDockerデーモンはOverlayネットワークの設定に加えて-H tcp://0.0.0.0:2375フラグをつけて起動します。これによりSwarm agentのリモートAPIをTCPからSwarm managerが利用できるようになります。また-H unix:///var/run/docker.sockフラグをつけてデフォルトのUNIXソケットも使えるようにします。
# DOCKER_OPTS="--cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2376"
DOCKER_OPTS="--cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2376 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
Swarm Managerコンテナ
minion-1のDockerホストにSwarm Managerコンテナをインストールします。SwarmはDockerイメージで公開されています。Swarm Managerはネットワーク上の他のDockerホストから-Hフラグをつけてアクセスできるようにポートをマップします。ここではデフォルトの2375と区別するために3333にしました。
$ docker pull swarm
$ docker run -d \
--name swarm-manage \
-p 3333:2375 \
swarm \
manage \
consul://10.3.0.101:8500/swarm
Swarm Agentコンテナ
minion-1
Swarmクラスタへjoinするためにminion-[1-3]の各DockerホストにSwarm Agentをインストールします。DockerイメージはManagerもAgentも同じDockerイメージを使います。最初にSwarm Managerと同じminion-1です。
--addrフラグはSwarm ManagerがアクセスできるIPアドレスを指定します。minion-1はSwarm ManagerとSwarm Agentの両方のコンテナを起動しますが、localhostではなくeth0のプライベートIPアドレスを指定します。またSwarmクラスタの情報管理する分散KVSはOverlayネットワーク構築のバックエンドと同じConsulクラスタを使います。
$ docker run -d \
swarm \
join \
--addr=10.3.0.101:2375 \
consul://10.3.0.101:8500/swarm
minion-1のDockerホストから-HフラグをつけてDockerデーモンをDocker Managerに指定してからinfoコマンドを実行してみます。Docker Swarmが正常に起動しているようです。
$ docker -H tcp://10.3.0.101:3333 info
Containers: 2
Images: 2
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 1
minion-1: 10.3.0.101:2375
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
CPUs: 2
Total Memory: 8.202 GiB
Name: 397912e89a4d
minion-[2-3]
minion-2とminion-3のDockerホストにはSwarm Agentだけインストールします。以下はminion-2の例です。
$ docker pull swarm
$ docker run -d \
swarm \
join \
--addr=10.3.0.102:2375 \
consul://10.3.0.102:8500/swarm
minion-2からminion-1のSwarm ManagerをDockerデーモンに指定してinfoコマンドを実行してみます。SwarmクラスタはNodes: 2になりminion-1とminion-2が参加したことがわかります。
$ docker -H tcp://10.3.0.101:3333 info
Containers: 3
Images: 4
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
minion-1: 10.3.0.101:2375
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
minion-2: 10.3.0.102:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
CPUs: 4
Total Memory: 16.4 GiB
Name: 397912e89a4d
同様にminion-3にもSwarm Agentコンテナをインストールします。
$ docker run -d \
swarm \
join \
--addr=10.3.0.103:2375 \
consul://10.3.0.103:8500/swarm
minion-3からminion-1のSwarm ManagerをDockerデーモンに指定してinfoコマンドを実行してみます。SwarmクラスタはNodes: 3になり、IDCFクラウドのstandard.M8 (2 CPU 8GB RAM)の3台分が合計されています。
- CPU: 6 CPU
- メモリー: 24.61 GiB
$ docker -H tcp://10.3.0.101:3333 info
Containers: 4
Images: 6
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 3
minion-1: 10.3.0.101:2375
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
minion-2: 10.3.0.102:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
minion-3: 10.3.0.103:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 8.202 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs
CPUs: 6
Total Memory: 24.61 GiB
Name: 397912e89a4d
docker network
Docker Swarmクラスタではdocker networkをリストすると以下のようになります。dnはOverlayネットワークなのでminion-[1-3]で共通のNETWORK IDを持っています。
$ docker -H tcp://10.3.0.101:3333 network ls
NETWORK ID NAME DRIVER
b68b118036d2 minion-1/bridge bridge
f10c0f7978af dn overlay
636664a4f746 minion-1/docker_gwbridge bridge
5d0368bb1be6 minion-3/host host
d839af5031ca minion-3/bridge bridge
bc09b464b0c5 minion-1/host host
a67f3a364d5b minion-2/bridge bridge
63b1b125bd29 minion-2/docker_gwbridge bridge
b29394e7420d minion-2/none null
1d85b701a383 minion-2/host host
8a4889033015 minion-3/none null
87ac747fad87 minion-3/docker_gwbridge bridge
6e0cf0387184 minion-1/none null
テスト用コンテナの作成
minion-1
minion-1のDockerホストからテスト用のコンテナを2つ起動します。amb1コンテナは-HフラグをつけてSwarm ManagerをDockerデーモンに指定しします。
$ docker -H tcp://10.3.0.101:3333 \
run -d -it \
--name amb1 \
-h amb1 \
--net dn \
debian:jessie
amb2コンテナはlocalhostのDockerデーモンで起動します。
$ docker \
run -d -it \
--name amb2 \
-h amb2 \
--net dn \
debian:jessie
psコマンドで確認するとlocalhost(minion-1)のDockerデーモンで起動しているamb2が表示されます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb34e982686 debian:jessie "/bin/bash" 40 seconds ago Up 39 seconds amb2
7c328c08df7a swarm "/swarm join --addr=1" 20 minutes ago Up 20 minutes 2375/tcp dreamy_liskov
397912e89a4d swarm "/swarm manage consul" 24 minutes ago Up 24 minutes 0.0.0.0:3333->2375/tcp swarm-manage
-HフラグでSwarm Managerを指定してpsコマンドを実行すると、minion-2ホストで起動したamb1も表示されます。
$ docker -H tcp://10.3.0.101:3333 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb34e982686 debian:jessie "/bin/bash" 7 seconds ago Up 6 seconds minion-1/amb2
b505e4526019 debian:jessie "/bin/bash" 4 minutes ago Up 4 minutes minion-2/amb1
amb1コンテナはminion-1のDockerデーモンで起動していないのでSwarm Managerを指定しないと見つかりません。
$ docker exec amb1 cat /etc/hosts
Error response from daemon: no such id: amb1
-Hフラグを指定してamb1コンテナの/etc/hostsを確認します。amb1とamb2の名前解決ができるようになっています。
$ docker -H tcp://10.3.0.101:3333 exec amb1 cat /etc/hosts
192.168.0.2 amb1
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.3 amb2
192.168.0.3 amb2.dn
amb2の/etc/hostsにはamb1のエントリーがありません。
$ docker exec amb2 cat /etc/hosts
192.168.0.3 amb2
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.2 amb1
192.168.0.2 amb1.dn
まとめるとテスト用のコンテナは以下のように起動しました。
| コンテナのhostname | コンテナのIPアドレス | Dockerホスト | DockerホストのIPアドレス |
|---|---|---|---|
| amb1 | 192.168.0.2 | minion-2 | 10.3.0.102 |
| amb2 | 192.168.0.3 | minion-1 | 10.3.0.101 |
minion-2
次にminion-2にログインしてコンテナの状態を調べてみます。amb2コンテナはminion-2のDockerデーモンで起動しました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b505e4526019 debian:jessie "/bin/bash" About a minute ago Up About a minute amb1
ce9217effebd swarm "/swarm join --addr=1" 15 minutes ago Up 15 minutes 2375/tcp furious_leakey
-HフラグをつけてSwarm ManagerをDockerデーモンに指定すると、minion-1で起動したamb2も合わせて表示されます。
$ docker -H tcp://10.3.0.101:3333 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb34e982686 debian:jessie "/bin/bash" 2 minutes ago Up 2 minutes minion-1/amb2
b505e4526019 debian:jessie "/bin/bash" 6 minutes ago Up 5 minutes minion-2/amb1
minion-3
最後にminion-3のDockerホストにログインして確認します。minion-3ではSwarm Agentコンテナ以外起動していません。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62458254ec86 swarm "/swarm join --addr=1" 15 minutes ago Up 15 minutes 2375/tcp awesome_babbage
Swarm Managerを指定するとminion-[1-3]はすべて同じ結果が表示されました。
$ docker -H tcp://10.3.0.101:3333 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb34e982686 debian:jessie "/bin/bash" 2 minutes ago Up 2 minutes minion-1/amb2
b505e4526019 debian:jessie "/bin/bash" 6 minutes ago Up 6 minutes minion-2/amb1