docker-machineでSwarm環境の構築

表題の通り。ローカルで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クラスタを用いていくつか実験を行ってみることにする。

以上。

■ 関連