表題の通り。ローカルでSwarm環境を構築してみる。中身は全てDockerの下記ドキュメントを参照している。
Create a Docker Swarm
https://docs.docker.com/swarm/install-w-machine/#create-a-docker-swarm
■ 環境
- Mac OSX (10.10.5)
- Docker 1.8.2
- docker-machine 0.4.1
- swarm
■ token
既に稼働しているdockerホストを利用してSwarmのトークンを払い出す。
$ docker pull swarm
Using default tag: latest
:
Status: Downloaded newer image for swarm:latest
$
$ docker run --rm swarm create
3245a0d77fdc9a1c68f6bc34a3333cdb
$
■ swarm-master
Swarmの管理ノードを内包する(?)、Dockerホストを起動する。
$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://3245a0d77fdc9a1c68f6bc34a3333cdb swarm-master
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env swarm-master
$
Dockerホストの一覧を確認。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
local * virtualbox Running tcp://192.168.99.100:2376
swarm-master virtualbox Running tcp://192.168.99.101:2376 swarm-master (master)
$
“swarm-master“というVMが起動していることを確認。ちなみにここで”swarm-master“上で稼働しているコンテナの一覧を確認してみる。
$ eval $(docker-machine env swarm-master)
$
$ docker-machine active
swarm-master
$
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5384fc519c3b swarm:latest "/swarm join --advert" 4 minutes ago Up 4 minutes 2375/tcp swarm-agent
26fef647a44c swarm:latest "/swarm manage --tlsv" 4 minutes ago Up 4 minutes 2375/tcp, 0.0.0.0:3376->3376/tcp swarm-agent-master
$
“swarm-master“のDockerホスト上で、”swarm-agent“と”swarm-agent-master“の2つのコンテナが起動している。
■ swarm ノード
Swarmは複数のDockerホストをあたかも1つであるかのように見せる(?)ものであると認識しているので、1台でももちろん稼働はするだろうが、複数台のDockerホストでなければ真価を発揮しないであろう。ローカルPCの性能的なものもあるので、Swarmの追加するノードは1台だけで試す。
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://3245a0d77fdc9a1c68f6bc34a3333cdb swarm-agent
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env swarm-agent
$
“swarm-master“との起動オプションの違いは”–swarm-master“だけであるようだ。
起動したDockerホストを含めて一覧を確認する。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
local virtualbox Running tcp://192.168.99.100:2376
swarm-agent virtualbox Running tcp://192.168.99.102:2376 swarm-master
swarm-master * virtualbox Running tcp://192.168.99.101:2376 swarm-master (master)
$
“SWARM“の欄には、該当のDockerホストがどのSwarmクラスタにJOINしているか、が表示されるようだ。
起動した”swarm-agent“にも直接接続し、起動しているコンテナを確認してみる。
$ eval $(docker-machine env swarm-agent)
$
$ docker-machine active
swarm-agent
$
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0932ae21c052 swarm:latest "/swarm join --advert" 3 minutes ago Up 3 minutes 2375/tcp swarm-agent
$
■ Swarmクラスタにアクセス
先ほどは”swarm-master“であるDockerホストに直接アクセスしているが、実際にアクセスを行う先は”Swarmクラスタ“になる。コマンドのオプションに少々追加となるようだ。
$ docker-machine env --swarm swarm-master
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:3376"
export DOCKER_CERT_PATH="/Users/withsin/.docker/machine/machines/swarm-master"
export DOCKER_MACHINE_NAME="swarm-master"
# Run this command to configure your shell:
# eval "$(docker-machine env swarm-master)"
$
“DOCKER_HOST“のポートが”2376“ではなく”3376“になっている。接続先は”swarm-master“の”swarm-agent-master“コンテナに接続されているようである。では実際に行う。
$ eval $(docker-machine env --swarm swarm-master)
$
$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
swarm-agent: 192.168.99.102:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015, provider=virtualbox, storagedriver=aufs
swarm-master: 192.168.99.101:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 2
Total Memory: 2.043 GiB
Name: 26fef647a44c
$
$ docker version
Client:
Version: 1.8.2
API version: 1.20
Go version: go1.5.1
Git commit: 0a8c2e3
Built: Fri Sep 11 01:46:35 UTC 2015
OS/Arch: darwin/amd64
Server:
Version: swarm/0.4.0
API version: 1.16
Go version: go1.4.2
Git commit: d647d82
Built:
OS/Arch: linux/amd64
$
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0932ae21c052 swarm:latest "/swarm join --advert" 10 minutes ago Up 10 minutes 2375/tcp swarm-agent/swarm-agent
5384fc519c3b swarm:latest "/swarm join --advert" 13 minutes ago Up 13 minutes 2375/tcp swarm-master/swarm-agent
26fef647a44c swarm:latest "/swarm manage --tlsv" 13 minutes ago Up 13 minutes 2375/tcp, 192.168.99.101:3376->3376/tcp swarm-master/swarm-agent-master
$
また、この時のVMの一覧を確認。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
local virtualbox Running tcp://192.168.99.100:2376
swarm-agent virtualbox Running tcp://192.168.99.102:2376 swarm-master
swarm-master virtualbox Running tcp://192.168.99.101:2376 swarm-master (master)
$
$ docker-machine active
Error getting active host: Active host not found
$
現在どこにアクセスしているのか、これを見ただけではよくわからない。今後の改善を願う。
■ コンテナの起動
ここまでで稼働しているSwarmクラスタに対して、コンテナを1つ起動してみる。
$ docker run -ti --rm centos /bin/bash
[root@25fb4fb04c0d /]
別の端末から確認してみる。
$ eval $(docker-machine env --swarm swarm-master)
$ docker info
Containers: 4
Images: 3
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
swarm-agent: 192.168.99.102:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015, provider=virtualbox, storagedriver=aufs
swarm-master: 192.168.99.101:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 2
Total Memory: 2.043 GiB
Name: 26fef647a44c
$
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25fb4fb04c0d centos "/bin/bash" About a minute ago Up About a minute swarm-agent/hopeful_kowalevski
0932ae21c052 swarm:latest "/swarm join --advert" 15 minutes ago Up 15 minutes 2375/tcp swarm-agent/swarm-agent
5384fc519c3b swarm:latest "/swarm join --advert" 18 minutes ago Up 18 minutes 2375/tcp swarm-master/swarm-agent
26fef647a44c swarm:latest "/swarm manage --tlsv" 18 minutes ago Up 18 minutes 2375/tcp, 192.168.99.101:3376->3376/tcp swarm-master/swarm-agent-master
$
1つのコンテナしか起動されていなかった”swarm-agent“に、CentOSのコンテナが起動されたようである。
以降、このSwarmクラスタを用いていくつか実験を行ってみることにする。
以上。