14
13

More than 5 years have passed since last update.

Docker 1.12のビルトイン・オーケストレーションを(Macで)使ってみる

Last updated at Posted at 2016-06-21

Dockerに新しく追加されたビルトインのオーケストレーションを試してみます。

このポストを書き終わった時点で、docker v1.12のオーケストレーション機能をマルチホストで試すよ on さくらのクラウドを見つけました。

すごくよく書かれているので少し気が引けますが、僕のポストはMacのローカルで試してみる、という点で若干の違いがあるのでこのままポストします。

手順の流れは下記の通りです。

  1. Swarm Managerノードを作って、Swarm Workerノードを2つ追加する。
  2. 試しにnginxのコンテナを作る。
  3. nginxのレプリカを複数作ってスケールアップする。
  4. 試しにレプリカをいくつか削除して挙動を確認する。
  5. 試しにWorkerノードを1つ削除して挙動を確認する。

ひとまずDockerを1.12にアップデートする

手持ちの環境がMac OS Xなので、Mac OS XにDocker for Macがインストールされているのを前提に話を進めていきます。まずは、Docker for Macをアップデートしてバージョンが1.12.0-rc2になっていることを確認します。

$ docker --version
Docker version 1.12.0-rc2, build 906eacd, experimental

3つのDockerマシン、manager1, worker1, worker2を作る

# manager1を作る
$ docker-machine create --driver virtualbox manager1

# worker1を作る
$ docker-machine create --driver virtualbox worker1

# worker2を作る
$ docker-machine create --driver virtualbox worker2

# 確認する
$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.0-rc2
worker1    -        virtualbox   Running   tcp://192.168.99.101:2376           v1.12.0-rc2
worker2    -        virtualbox   Running   tcp://192.168.99.102:2376           v1.12.0-rc2

この先は下記の通りマシンとIPアドレスが対応していることを前提に話を進めていきます。

Machine IP Address
manager1 192.168.99.100
worker1 192.168.99.101
worker2 192.168.99.102

Swarm Managerを作る

$ eval $(docker-machine env manager1)
$ docker swarm init --listen-addr 192.168.99.100:2377

$ docker info|egrep '^Swarm| IsManager'
Swarm: active
 IsManager: Yes

Workerを追加する

# worker1を作る
$ eval $(docker-machine env worker1)
$ docker swarm join 192.168.99.100:2377
$ docker info|egrep '^Swarm| IsManager'
Swarm: active
 IsManager: No

# worker2を作る
$ eval $(docker-machine env worker2)
$ docker swarm join 192.168.99.100:2377
$ docker info|egrep '^Swarm| IsManager'
Swarm: active
  IsManager: No

# 確認する
$ eval $(docker-machine env manager1)
$ docker node ls
ID                           NAME      MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
0ra8kxzmb58pe6ft5va64w7ua *  manager1  Accepted    Ready   Active        Leader
5gv3ybyzn9m8b7tc6wizyjhix    worker2   Accepted    Ready   Active
bom2mr6g2lej017m4v8fou0eu    worker1   Accepted    Ready   Active

試しにnginxサービスを作る

# manager1の環境を準備する
$ eval $(docker-machine env manager1)

# テスト用のネットワークを作る
$ docker network create -d overlay test_net

# nginxサービスを作る
$ docker service create --name nginx --replicas 1 --network test_net -p 80:80/tcp nginx

# nginxサービスのタスクを確認する
$ docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
2rnlb559hs612vp1f5ntl46kh  nginx.1  nginx    nginx  Running 50 seconds  Running        manager1

nginxイメージのダウンロードに少々時間がかかりますが、LAST STATEPreparing...からRunning...に変わったらブラウザでhttp://192.168.99.100/を開いて Welcome to nginx! のメッセージが見れることを確認します。

レプリカを追加する

# レプリカを5つにする
$ docker service scale nginx=5

# 確認する
$ docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
2rnlb559hs612vp1f5ntl46kh  nginx.1  nginx    nginx  Running 12 minutes  Running        manager1
cck9rmwa3mfelzykktlhwsoa2  nginx.2  nginx    nginx  Running 5 seconds   Running        manager1
dslg4jbsii0q7b5ztjtljjkik  nginx.3  nginx    nginx  Running 5 seconds   Running        worker2
9g37ap7xh7132nxf4nreh0afl  nginx.4  nginx    nginx  Running 5 seconds   Running        worker1
c28qiurspqxuqoze01winmwgt  nginx.5  nginx    nginx  Running 5 seconds   Running        worker1

試しにmanager1にあるレプリカを削除してみる

# 無理やりmanager1上にあるレプリカを削除してみます
$ docker ps -qa|xargs docker rm -f

何が起こるかというと、manager1上のコンテナが消えたことをDocker Swarmが検知してくれるらしく、減った分を自動的に再作成してくれます。便利ですね。

# しばらく待ってからレプリカの数が減っていないことを確認する
$ docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
6n9h53h6326ef5lhfo7nzc5a3  nginx.1  nginx    nginx  Running 9 seconds   Running        manager1
4pt5qy4vhedyhnww1yrtw0epz  nginx.2  nginx    nginx  Running 10 seconds  Running        worker2
dslg4jbsii0q7b5ztjtljjkik  nginx.3  nginx    nginx  Running 5 minutes   Running        worker2
9g37ap7xh7132nxf4nreh0afl  nginx.4  nginx    nginx  Running 5 minutes   Running        worker1
c28qiurspqxuqoze01winmwgt  nginx.5  nginx    nginx  Running 5 minutes   Running        worker1

試しにworker2を削除してみる

# worker2を削除する
docker-machine rm worker2

# しばらく待って、レプリカの数を確認してみる
docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
760crpv5j1gwcxtw6j2cwpjj7  nginx.1  nginx    nginx  Running 14 seconds  Running        worker1
b9uigex1dlfp0932xqgn26c8i  nginx.2  nginx    nginx  Running 14 seconds  Running        worker1
7j0qfo99l29sw9rkv0ud16idm  nginx.3  nginx    nginx  Running 48 seconds  Running        manager1
erwcg6nz50mkfgj1xcl8gzw7a  nginx.4  nginx    nginx  Running 48 seconds  Running        manager1
ckfluns4d0ptwlphz8zlof6cq  nginx.5  nginx    nginx  Running 48 seconds  Running        worker1

片付ける

docker service rm nginx
docker-machine rm manager1 worker1

まとめ

  • Swarmの構築が驚くほど簡単になっていて、今後はマルチノードがデフォルト化していくように思えます。
  • サービスという新しい概念が導入されて、docker psではswarm全体のコンテナは見えません。今後はdocker rundocker psはカスタム・イメージの準備とデバッグ以外では使わなくなるかもしれませんね。
  • 今のところdocker service createにはvolumeをマウントするオプションがなさそうです。(* 後でもう少し調べてみます。)

参考にしたリンク

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13