LoginSignup
4
4

More than 5 years have passed since last update.

IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 2: Docker Swarmクラスタの作成

Last updated at Posted at 2015-12-19

 前回構築したDocker1.9のOverlayネットワークにDocker Swarmクラスタを作成します。AWSやDigitalOceanなどDocker Machineの例が多いですが、今回はIDCFクラウド上にConsulを使いシンプルなSwarmクラスタをセットアップしてみます。

このシリーズ

参考

 以下のサイトを参考にしました。

仮想マシン

 前回と同じ仮想マシンを使います。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ソケットも使えるようにします。

/etc/default/docker
#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-1Swarm ManagerSwarm 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-2minion-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-1Swarm ManagerをDockerデーモンに指定してinfoコマンドを実行してみます。SwarmクラスタはNodes: 2になりminion-1minion-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-1Swarm 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を確認します。amb1amb2の名前解決ができるようになっています。

$ 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
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4