概要
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がベースになっています。
簡単に説明すると、立ち上がっているコンテナの少ないノードから優先的にコンテナを割り当てていきます。
以上です。お疲れ様でした。