Docker Multi-Host Networking (4)

Dockerにおいて表題の通り。前回までの続きであるstep2のswarmクラスタ構築を行う。

■ 環境

  • Mac OSX (10.10.5)
  • Apache ZooKeeper 3.4.6
  • Vagrant 1.8.1
  • Ubuntu Vivid

■ Create a Swarm cluster

まずは”swarm“のコンテナイメージをそれぞれ`pull`する。

$ vagrant ssh docker1
vagrant@docker1:~$ docker pull swarm
 :
$ vagrant ssh docker2
vagrant@docker2:~$ docker pull swarm

ZooKeeperを使用したswarmクラスタの構築については下記を参照した。

Docker Swarm discovery
https://docs.docker.com/swarm/discovery/

それぞれのDockerホスト上で”swarm-agent“というコンテナ名で`swarm join`させる。

docker1:

vagrant@docker1:~$ docker run -d --name swarm-agent swarm join --advertise=192.168.33.11:2375  zk://10.0.2.2:2181/

docker2:

vagrant@docker2:~$ docker run -d --name swarm-agent swarm join --advertise=192.168.33.12:2375  zk://10.0.2.2:2181/

ここまででznodeを確認してみると下記のようになっていた。

/
  + docker
    + nodes
      + 192.168.33.11:2375
      + 192.168.33.12:2375
    + swarm
      + nodes
        + 192.168.33.11:2375
        + 192.168.33.12:2375

続いて、”docker1“にて”swarm-manager“を起動する。

vagrant@docker1:~$ docker run -d --name swarm-manager -p 2376:2375 swarm manage zk://10.0.2.2:2181/

ここで再度znodeを確認したが変わりはなかった。

■ check

swarmクラスタが正常に稼働しているかを確認する。

vagrant@docker1:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ee0f2ea65a33        swarm               "/swarm manage zk://1"   2 minutes ago       Up 2 minutes        0.0.0.0:2376->2375/tcp   swarm-manager
2aa9e4f8f877        swarm               "/swarm join --advert"   9 minutes ago       Up 9 minutes        2375/tcp                 swarm-agent
vagrant@docker1:~$
vagrant@docker1:~$ docker -H tcp://localhost:2376 info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 docker1: 192.168.33.11:2375
  └ Status: Healthy
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 2.052 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.19.0-42-generic, operatingsystem=Ubuntu 15.04, storagedriver=devicemapper
 docker2: 192.168.33.12:2375
  └ Status: Healthy
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 2.052 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.19.0-43-generic, operatingsystem=Ubuntu 15.04, storagedriver=devicemapper
CPUs: 2
Total Memory: 4.104 GiB
Name: ee0f2ea65a33
vagrant@docker1:~$

これでswarmクラスタの構築が終了である。

以上。

■ 関連

DockerPlatformをUpgrade

表題の通り。Docker1.9がリリースされてその他もバージョンアップしたようなのでアップグレードする。

■ 環境

  • Docker 1.9.0
  • Docker Machine 0.4.1 => 0.5.0
  • Docker Swarm 0.4.0 => 1.0.0
  • Docker Compose 1.4.2 => 1.5.0
  • Mac OSX (10.10.5)
  • Homebrew

■ 確認

$ brew update
  :
==> Updated Formulae
  :
docker-compose (installed)
docker-machine (installed)
docker-swarm (installed)
elasticsearch (installed)
  :
$
$ brew outdated
  :
docker-compose (1.4.2 < 1.5.0)
docker-machine (0.3.1, 0.4.1 < 0.5.0)
docker-swarm (0.4.0 < 1.0.0)
  :

それぞれアップグレードできそうである。

■ Upgrade

一気にやる。

$ brew upgrade docker-compose docker-machine docker-swarm
==> Upgrading 3 outdated packages, with result:
docker-compose 1.5.0, docker-machine 0.5.0, docker-swarm 1.0.0
  :
$

■ 再度確認

versionだけでも確認しておく。

$ docker-machine --version
docker-machine version 0.5.0 (HEAD)
$
$ docker-compose --version
docker-compose version: 1.5.0
$
$ docker-swarm --version
docker-swarm version 1.0.0 (HEAD)
$

以上。

■ 関連

swarmコマンド

Dockerのドキュメントを読んでいて、`swarm`のコマンドがあるの?と思ったのでメモ。

■ 環境

  • Docker 1.9.0
  • Docker Swarm 0.4.0
  • Mac OSX (10.10.5)
  • Homebrew

■ きっかけ

Docker1.9.2がリリースされてドキュメントを読んでいたところ、下記のような記述があった。

$ swarm create
$ swarm join ...

あれ?下記のようにコンテナの実行でやるんじゃないの?と思った。

$ docker pull swarm
$ docker run --rm swarm create
$ docker run --rm swarm join token://...

1.9.0“から`swarm`コマンドも導入されたのか?と思ったのだが、Homebrewでインストールしているdockerにはインストールはされていない様子。

$ brew ls docker
/usr/local/Cellar/docker/1.9.0/bin/docker
/usr/local/Cellar/docker/1.9.0/etc/bash_completion.d/docker
/usr/local/Cellar/docker/1.9.0/share/fish/vendor_completions.d/docker.fish
/usr/local/Cellar/docker/1.9.0/share/zsh/site-functions/_docker
$

■ docker−swarm

`swarm`コマンドはなかったので検索してみる。

$ brew update
$ brew search swarm

ここで`docker-swarm`が存在することを知った。以前は無かったような気もするのだが。ちょっと確認。

$ cd /usr/local/Library/Formula
$ git log docker-swarm.rb

これによると2015/05/19には既にあったようである。とりあえずインストールして確認してみる。

$ brew install docker-swarm

インストールが完了。

$ docker-swarm --help
Usage: docker-swarm [OPTIONS] COMMAND [arg...]

A Docker-native clustering system

Version: 0.4.0 (HEAD)

Options:
  --debug            debug mode [$DEBUG]
  --log-level, -l "info"    Log level (options: debug, info, warn, error, fatal, panic)
  --help, -h            show help
  --version, -v            print the version

Commands:
  create, c    Create a cluster
  list, l    List nodes in a cluster
  manage, m    Manage a docker cluster
  join, j    join a docker cluster
  help, h    Shows a list of commands or help for one command

Run 'docker-swarm COMMAND --help' for more information on a command.
$

これを見る限り、前述の`swarm`コマンドと同等のように思える。試しに`create`を実行してみる。

$ docker-swarm create
98e6adfe3326c4712a9316d00c27f545
$

`docker`コマンドをwrapしているだけなのだろうか?と思ったが、DockerHostを指定していない状態でも`docker-swarm create`を実行して出力を得られたので、単純なwrapというわけではないようだ。`docker-machine`の”–swarm“オプションとまた違うようなのだろうか、それとも一緒に使用されることはないというイメージなのだろうか。ちょっと触ってみることにする。

以上。

■ 関連

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クラスタを用いていくつか実験を行ってみることにする。

以上。

■ 関連

docker imagesでREPOSITORY指定

Dockerにおいて表題の通り。Dockerのversionの違いによるものかと思っていたのだが、どうやらSwarmが原因であったようなのでメモとして残しておく。

■ 環境

  • Docker 1.8.2, 1.7.1
  • Swarm 0.4.0

■ きっかけ

`docker images`で特定のコンテナイメージの情報だけが欲しい場合、下記のように実行することで取得できる。

$ docker images centos
REPOSITORY   TAG   IMAGE ID       CREATED        VIRTUAL SIZE
centos       6     a005304e4e74   3 months ago   203.1 MB

この動きを期待していたのだが、ある環境においては”コンテナイメージ名(REPOSITORY)“を指定しても全てのコンテナイメージの一覧が表示されてしまい、悩んでいた。

■ docker images [REPOSITORY]

取得できない環境。

どうやらSwarmで複数のDockerホストにまたがっている場合に、`docker images [REPOSITORY]`が効かないようである。下記はAmazonLinuxにおける状態である。

$ docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d/1.7.1
OS/Arch (client): linux/amd64
Server version: swarm/0.4.0
Server API version: 1.16
Go version (server): go1.4.2
Git commit (server): d647d82
OS/Arch (server): linux/amd64
$
$ docker images centos
REPOSITORY   TAG      IMAGE ID       CREATED        VIRTUAL SIZE
java         7        ade42d38879d   7 weeks ago    587.4 MB
centos       6        a005304e4e74   3 months ago   203.1 MB
swarm        latest   207e8b983242   8 weeks ago    10.2 MB
mongo        3.0.3    fa0a6690446b   3 months ago   257.7 MB

当初はDockerのversionによるものかと思ったが、1.7系のドキュメントを確認しても使用はできそうである。

http://docs.docker.com/v1.7/docker/reference/commandline/images/

実際に、Swarmを経由してのアクセスではなく、Dockerホストにログインし`docker images`を実行したところ、思い通りの結果を得ることができた。

現状では、Swarmを使用した環境では使えないオプションのようである。何かしら別の対応を考えなければならない。

以上。

■ 関連