Carpe Diem

備忘録

Docker Swarmでマルチホストでクラスタ構築

概要

Docker Swarmでマルチホスト環境上でDockerクラスタを構築します。

事前知識

Docker Swarmで構築する際は以下の3つの要素が必要になります。

  • ノードを管理するDiscovery backend
  • Swarm Manager(マスターノード)
  • Swarm Node(子ノード)

環境

  • Docker 1.11.0
  • Docker-machine 0.7.0
  • Docker-swarm 1.2.1

ノードを管理するDiscovery backend

Swarmノードを管理するためのサーバです。以下4つが利用できます。

  • Docker Hub
  • etcd
  • Consul
  • Zookeeper

今回はシンプルに構築できるよう、Docker HubがホスティングしているTokenベースで構築します。
注意としてDocker Hubの場合はKVSとして機能しないため、VXLANは構築できず別ホスト間のコンテナの通信はできません。
ホスト間での通信を設定したい場合はConsulやetcdなど残り3つの方を利用してください。


Cluster-idの発行

まず適当な名前のDockerホストを構築します。

$ docker-machine create -d virtualbox dummy-vm

起動したらtokenを発行します。

$ eval "$(docker-machine env dummy-vm)"
$ docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm

dd2ca02feeef: Pull complete 
8e8ea52d4475: Pull complete 
397cd9ffad59: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:6ca9b40980e2fcdcd229900ec8933f3e92c14ead22c9404cb09736cb4f3a9248
Status: Downloaded newer image for swarm:latest
b1f8353836d20ffaec06932ebbec4d0a

b1f8353836d20ffaec06932ebbec4d0aを使って管理します。
↑はダミーです。

作成したらdummy-vmは削除してOKです。

$ docker-machine stop dummy-vm
$ docker-machine rm dummy-vm

Swarm Manager(マスターノード)

先ほどのトークンを指定してDockerホストを作成します。

$ docker-machine create \
-d virtualbox \
--swarm \
--swarm-master \
--swarm-discovery token://b1f8353836d20ffaec06932ebbec4d0a \
swarm-manager-01

今回は作成時に設定していますが、作成したDockerホストを後からManagerにすることも可能です。

Swarm Node(子ノード)

今回は2つ作ってみます。先ほどと異なり--swarm-masterを外します。
1つめ

$ docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://b1f8353836d20ffaec06932ebbec4d0a \
swarm-node-01

2つめ

$ docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://b1f8353836d20ffaec06932ebbec4d0a \
swarm-node-02

同じく今回は作成時に設定していますが、作成したDockerホストを後からノードにすることも可能です。

動作確認

操作する際はManagerを扱います。
また通常の時とは異なり、--swarmオプションをつけます。

$ eval $(docker-machine env --swarm swarm-manager-01)

状態を確認します。

$ docker info
Containers: 4
 Running: 4
 Paused: 0
 Stopped: 0
Images: 3
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
 swarm-manager-01: 192.168.99.100:2376
  └ ID: JMFM:5WQA:JPL6:YQQI:Q7EO:DDHI:WFNH:ZOCE:VPYA:BD5G:DKT5:J3XI
  └ Status: Healthy
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=, kernelversion=4.4.8-boot2docker, operatingsystem=Boot2Docker 1.11.1 (TCL 7.0); HEAD : 7954f54 - Wed Apr 27 16:36:45 UTC 2016, provider=virtualbox, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T09:48:35Z
  └ ServerVersion: 1.11.1
 swarm-node-01: 192.168.99.101:2376
  └ ID: KA2J:C5BX:3LTC:GAXX:HAZ7:HYET:2GG3:YDVO:M233:AXUW:O4UF:MXZH
  └ Status: Healthy
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=, kernelversion=4.4.8-boot2docker, operatingsystem=Boot2Docker 1.11.1 (TCL 7.0); HEAD : 7954f54 - Wed Apr 27 16:36:45 UTC 2016, provider=virtualbox, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T09:48:09Z
  └ ServerVersion: 1.11.1
 swarm-node-02: 192.168.99.102:2376
  └ ID: KCSX:F5CG:2D4I:UGTH:PQNR:HSZU:ENA6:ZBGO:M53O:UZAB:33AI:KDXK
  └ Status: Healthy
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=, kernelversion=4.4.8-boot2docker, operatingsystem=Boot2Docker 1.11.1 (TCL 7.0); HEAD : 7954f54 - Wed Apr 27 16:36:45 UTC 2016, provider=virtualbox, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T09:48:06Z
  └ ServerVersion: 1.11.1
Plugins: 
 Volume: 
 Network: 
Kernel Version: 4.4.8-boot2docker
Operating System: linux
Architecture: amd64
CPUs: 3
Total Memory: 3.063 GiB
Name: 2dc78b4dd0e6
Docker Root Dir: 
Debug mode (client): false
Debug mode (server): false
WARNING: No kernel memory limit support

manager、nodeが作成されていることが分かります。
ちなみに以下の形式でもリストを見れます。

$ docker run swarm list token://b1f8353836d20ffaec06932ebbec4d0a
192.168.99.102:2376
192.168.99.101:2376
192.168.99.100:2376

では幾つかコンテナを起動してみます。

$ docker run --name hello01 hello-world
$ docker run --name hello02 hello-world

確認してみます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS                                     NAMES
cf06215ec020        hello-world         "/hello"                 2 seconds ago        Exited (0) 2 seconds ago                                                  swarm-node-02/hello02
448b0055591c        hello-world         "/hello"                 About a minute ago   Exited (0) About a minute ago                                             swarm-node-01/hello01
30b6379dcbd0        swarm:latest        "/swarm join --advert"   7 minutes ago        Up 7 minutes                    2375/tcp                                  swarm-node-02/swarm-agent
15afaaf282e1        swarm:latest        "/swarm join --advert"   15 minutes ago       Up 15 minutes                   2375/tcp                                  swarm-node-01/swarm-agent
5e79a8624d67        swarm:latest        "/swarm join --advert"   19 minutes ago       Up 19 minutes                   2375/tcp                                  swarm-manager-01/swarm-agent
2dc78b4dd0e6        swarm:latest        "/swarm manage --tlsv"   19 minutes ago       Up 19 minutes                   2375/tcp, 192.168.99.100:3376->3376/tcp   swarm-manager-01/swarm-agent-master

ホスト毎にコンテナが作成されていることが分かります。

コンテナが起動する順はDocker Swarm strategiesがベースになっています。
簡単に説明すると、立ち上がっているコンテナの少ないノードから優先的にコンテナを割り当てていきます。

以上です。お疲れ様でした。

ソース