Docker Swarm について
通常、Docker では、複数のホストにまたがってコンテナが存在する場合、docker コマンドを実行するたびに-H
オプションを付加して接続先を切り替える必要が有りました。
結果として、複数のホスト上にコンテナが散財する場合、docker コマンドで透過的にコンテナを管理することが困難でした。
そういった問題はDocker Swarm を使うことで軽減することができます。
Docker Swarm は1 つ以上のDocker ホストを1 つのDocker ホスト(Docker Swarm manager) にpool することができるようになり、ユーザはそのDocker Swarm manager ホストに対してコマンドを発行することで、複数のDocker ノードをcluster として透過的に管理することができるようになります。
Docker Swarm は標準的なDocker API を提供しているので、Docker デーモンと既に通信しているツール類はSwarm を複数のホストに透過的に使用ために使うことができるようになります。
Docker Swarm を使うための要件
Docker Swarm はDocker のコンテナとして用意されているので、pull することですぐに使うことができます。
pull したあとはDocker Swarm manager の設定をし、Docker Swarm agent コンテナが起動している他のノードをDocker cluster の一員として追加し、Docker Swarm manager から一元的に操作することができるようになります。
今回の構成
- 構成
OS | IP アドレス | ホスト名 | 備考 |
---|---|---|---|
Ubuntu 15.10 | 192.168.1.121 | swmgr01 | Swarm manager。また、Docker Swarm manager を操作するための管理端末としても使用 |
Debian jessie | 192.168.1.131 | swagt01 | Swarm agent 01 |
Debian jessie | 192.168.1.132 | swagt02 | Swarm agent 02 |
Debian jessie | 192.168.1.133 | swagt03 | Swarm agent 03 |
Docker Swarm のインストールと作成
ここではUbuntu でDocker Swarm のインストールと作成方法について説明してきます。
Ubuntu のDocker Engine を使用してそれらの手順を見ていくことにします。
なお、ここではUbuntu にDocker Engine をインストールする手順については割愛します。
Docker Engine をDocker リポジトリからインストールする(Ubuntu 15.04, 14.04 LTS)
discovery token の発行
まずはDocker Swarm イメージを使用してdiscovery token を発行します。
そのためにdocker run swarm create
コマンドを実行します。
これを実行することで、swarm コンテナ上でswarm create
コマンドが実行され、discovery token が発行されます。
$ docker run --rm swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
d681c900c6e3: Pull complete
188de6f24f3f: Pull complete
90b2ffb8d338: Pull complete
237af4efea94: Pull complete
3b3fc6f62107: Pull complete
7e6c9135b308: Pull complete
986340ab62f0: Pull complete
a9975e2cc0a3: Pull complete
Digest: sha256:c21fd414b0488637b1f05f13a59b032a3f9da5d818d31da1a4ca98a84c0c781b
Status: Downloaded newer image for swarm:latest
8f620653b5157592418a2da287dc722d
上記のコマンドの結果より、8f620653b5157592418a2da287dc722d
のdiscovery token が発行されたました。
このdiscovery token はDocker Swarm エージェントを起動するときに使用するものとなるので、安全な場所に保管しておくようにしてください。
swarm ノードの作成(swagt01-03)
今回用意したDocker ノード(swagt01, swagt02, swagt03)をDocker Swarm agent として起動します。
Docker Swarm agent は、それぞれのモニタ情報を登録し、discovery token のバックエンドで更新をかけます。
本手順ではDocker Hub ベースのtoken ディスカバリサービスを使います。
Docker Swarm agent ノードにログインし、/lib/systemd/system
ファイルのExecStart
の値を次のように変更し、daemon reload を実施してdocker daemon を起動します。
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
$ systemctl daemon-reload
$ systemctl restart docker
Docker Swarm agent をdiscovery サービスに加入させる(swagt01-03)
各Docker Swarm agent をdiscovery サービスに加入させます。
それぞれのDocker Swarm agent のとSwarm Manager が接続可能な状態で、次のコマンドを実行し、discovery サービス上のnode_ip
とcluster_id
を更新します。
$ docker run -d swarm join --addr=<node_ip>:2375 token://<cluster_id>
実際のコマンド例としては次のようになります。
ここではコンテナを作成すると同時に--name
オプションも使用してコンテナ名を指定するようにしています。
$ docker run --name swagt01 -d swarm join --addr=192.168.1.131:2375 token://8f620653b5157592418a2da287dc722d
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
d681c900c6e3: Pull complete
188de6f24f3f: Pull complete
90b2ffb8d338: Pull complete
237af4efea94: Pull complete
3b3fc6f62107: Pull complete
7e6c9135b308: Pull complete
986340ab62f0: Pull complete
a9975e2cc0a3: Pull complete
Digest: sha256:c21fd414b0488637b1f05f13a59b032a3f9da5d818d31da1a4ca98a84c0c781b
Status: Downloaded newer image for swarm:latest
9b73b74bafda6703c0b5dc328f0501422a056079c923a37dbb7d36d89fbff77f
$ docker run --name swagt02 -d swarm join --addr=192.168.1.132:2375 token://8f620653b5157592418a2da287dc722d
......
996de4e921d8902720c8abf3e62da460698b1cda36c73d4c385ded2acb87375e
$ docker run --name swagt03 -d swarm join --addr=192.168.1.133:2375 token://8f620653b5157592418a2da287dc722d
......
bbf0a5bf6e097e5085118c07a4b5087d7808320b30e8a16f4517bf1b73200848
Docker Swarm manager の設定
Docker Swarm agent をコントロールするためのDocker Swarm manager の設定を行っていきます。
Docker Swarm manager の起動
Docker Swarm manager となるマシン上でDocker Swarm manager を起動します。
$ docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
$ docker run --name swmgr01 -d -p 2375:2375 swarm manage token://8f620653b5157592418a2da287dc722d
750562b8fc7fd12ba5e103add01bb12e1ee92a4073958b4f396c82e503492057
Docker Swarm manager の設定確認
Docker Swarm manager が起動したらdocker info
コマンドで設定を確認してみましょう。
コマンドを実行するときは-H
オプションを指定して接続先マネージャのノードを指定します。
$ docker -H tcp://<manager_ip>:2375 info
$ docker -H tcp://192.168.1.121:2375 info
Containers: 0
Images: 0
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 0
CPUs: 0
Total Memory: 0 B
Name: 750562b8fc7f
上記のようにDocker manager の情報が表示されれば成功です。
DOCKER_TLS_VERIFY フラグについて
もしTLS エラーが出力された場合はDOCKER_TLS_VERIFY
環境変数をunset します。
$ unset DOCKER_TLS_VERIFY
docker コマンドを使用してクラスタへ接続する
Docker Swarm cluster へ接続するには、通常のDocker へ接続する時と同様にdocker コマンドを指定することができます。
しかし、docker コマンドを実行するときの接続先-H
はDocker Swarm manager のIP とport を指定する用にしてください。
$ docker -H tcp://<ip:port> info
$ docker -H tcp://<ip:port> run ...
$ docker -H tcp://<ip:port> ps
$ docker -H tcp://<ip:port> logs ...
cluster に参加しているノードをリスト表示する
swarm list
コマンドを実行することでcluster に参加している起動ノードを一覧表示することができます。
$ docker run --rm swarm list token://<cluster_id>
$ docker run --rm swarm list token://8f620653b5157592418a2da287dc722d
192.168.1.133:2375
192.168.1.132:2375
192.168.1.131:2375
以上でDocker cluster 環境の構築は完了です。次はDocker Swarm cluster 上にコンテナを作成していきます。
Docker Swarm 上にコンテナを作成する
Swarm クラスタが正常に構築されていることを確認するために、試しにDebian コンテナを起動してみましょう。
Swarm クラスタ上にコンテナを作成する場合は-H
オプションでDocker Swarm manager のノードを指定します。
今回、Docker Swarm manager は192.168.1.121:2375
になるので、コマンドは次のようになります。
swmgt01~$ docker -H tcp://192.168.1.121:2375 run --name test_busybox -ti busybox /bin/sh
## ...暫く時間がかかります...
/ # id
uid#0(root) gid=0(root) groups10(wheel)
/ # hostname
19486390f2fe
/ #
/ # exit
上記のようにコンテナが作成されれば成功です。
コンテナの所在の確認
先ほど作成したコンテナがどのDocker Swarm ノードに作成されたか確認してみましょう。
こちらも先ほどと同様に-H
オプションでDocker Swarm manager のIP:port
を指定してdocker ps -a
コマンドを実行します。
swmgt01~$ docker -H tcp://192.168.1.121:2375 ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19486390f2fe busybox "/bin/sh" 4 minutes ago Exited (0) 3 minutes ago swagt03/test_busybox
c4366b2190eb swarm "/swarm join --addr=1" 47 minutes ago Up 47 minutes 2375/tcp swagt03/swagt03
f3c3d542c908 swarm "/swarm join --addr=1" 47 minutes ago Up 47 minutes 2375/tcp swagt02/swagt02
65b3c986da3b swarm "/swarm join --addr=1" 48 minutes ago Up 48 minutes 2375/tcp swagt01/swagt01
上記の出力結果を確認すると、swagt03 ノード上にbusybox コンテナが作成されたことがわかります。
このコンテナが本当にswagt03
に作成されているか確認するために、swagt03
ノードにログインし、docker ps -a
コマンドを実行してみましょう。
swagt03~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19486390f2fe busybox "/bin/sh" 11 minutes ago Exited (0) 10 minutes ago test_busybox
c4366b2190eb swarm "/swarm join --addr=1" 54 minutes ago Up 54 minutes 2375/tcp swagt03
すると、上記のようにDocker Swarm manager で見た時と同じコンテナがswagt03
上に作成されていることが確認できると思います。
では、さらにコンテナを作成していくとどのようになっていくかを確認してみましょう。
新しくDocker Swarm cluster 上にdebian のコンテナを作成し、docker -H tcp://IP:port ps -a
コマンドでどこのノードにコンテナが作成されるか確認してみましょう。
swmgr01~$ docker -H tcp://192.168.1.121:2375 run --name test_debian -ti debian /bin/bash
root@0a232282bff7:/#
root@0a232282bff7:/# exit
exit
swmgr01~$ docker -H tcp://192.168.1.121:2375 ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a232282bff7 debian "/bin/bash" 53 seconds ago Exited (0) 38 seconds ago swagt02/test_debian
19486390f2fe busybox "/bin/sh" 21 minutes ago Exited (0) 20 minutes ago swagt03/test_busybox
c4366b2190eb swarm "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp swagt03/swagt03
f3c3d542c908 swarm "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp swagt02/swagt02
65b3c986da3b swarm "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp swagt01/swagt01
すると次はswagt02
上に新しくコンテナが作成されていることが確認できます。
このようにDocker Swarm cluster 上ではcluster に参加しているノードに対して、あたかも1 つのノード上のDocker daemon を操作しているかのような感覚で、透過的に複数ノードにまたがるコンテナを管理することができるようになります。
Docker Swarm cluster 上のコンテナの開始、停止、削除
Docker Swarm cluster 上のコンテナの開始、停止、削除については、コンテナ作成の時と同様にDocker Swarm manager 経由となるようにコマンドを実行して管理することができます。
$ docker -H tcp://<Swarm manager IP>:<port> start <Container>
$ docker -H tcp://<Swarm manager IP>:<port> stop <Container>
$ docker -H tcp://<Swarm manager IP>:<port> rm <Container>
また、その他のオプションについても通常のDocker コマンドと同じものが扱えるようになっています。
例えばコンテナのコマンド実行をするdocker exec
、イメージの削除を行うdocker rmi
、Docker コンテナの状態確認を行うdocker ps
等も同様に-H
オプションでDocker Swarm manager を指定して実行することができます。
参考
- Docker Swarm overview
- https://docs.docker.com/swarm/
- Install and Create a Docker Swarm
- https://docs.docker.com/swarm/install-w-machine/
- Docker Tutorial : Getting Started With Docker Swarm
- http://devopscube.com/docker-tutorial-getting-started-with-docker-swarm/
- Create a swarm for development
- https://docs.docker.com/swarm/install-manual/
- DOCKER SWARM WITH TLS AUTHENTICATION
- http://www.blackfinsecurity.com/docker-swarm-with-tls-authentication/
- Protect the Docker daemon socket
- https://docs.docker.com/engine/articles/https/
- Docker Swarmで複数Dockerホストからクラスタを作る
- http://blog.takanabe.tokyo/2015/11/23/1565/