前回の続き。
(このシリーズ記事、特に意味が中途半端なところでブツ切れてるので
チュートリアル全部終わったら記事まとめます。)
まず前回作ったdocker-compose.yml
の
説明が書いてあったので下記にまとめる
version: "3"
services:
web:
image: kugyu10/get-started:part2 #前章で作ったタグ付きイメージ
deploy:
replicas: 5 #5個のコンテナを用意
resources:
limits:
cpus: "0.1" #それぞれCPU使用率10%制限
memory: 50M #メモリ50MB制限
restart_policy:
condition: on-failure #落ちたら再起動
ports:
- "4000:80" #4000→80にMapping
networks:
- webnet #ネットワークはwebnetって設定使う
networks:
webnet: #何も書いてない、つまりデフォルトの設定
ファイル名から分かるようにYMLで書いてある。
YMLファイルは常に
key:値
の形で入れ子で書いてあるので、
なんとなく雰囲気でも読めるのがありがたい。
次にserviceを起動する
まず
$ docker swarm init
を行う。(swarmの意味は4章で解説)
その後、
$ docker stack deploy -c docker-compose.yml getstartedlab #←がサービス名になる
Creating network getstartedlab_webnet
Creating service getstartedlab_web
これでdeployできた?
確認コマンドは docker service ls
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
dx3l42cx9hlr getstartedlab_web replicated 5/5 kugyu10/get-started:part2 *:4000->80/tcp
上の最後の行のNAMEの値getstartedlab_web
に注目していただきたい。
docker-compose.yml作ったサービス名と一致してます。
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
0rsve0q252li getstartedlab_web replicated 5/5 kugyu10/get-started:part2 *:4000->80/tcp
[test_python_dev]docker service ps getstartedlab_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
eka1fs1oymju getstartedlab_web.1 kugyu10/get-started:part2 linuxkit-025000000001 Running Running 43 seconds ago
q6p3v0z0v5aw getstartedlab_web.2 kugyu10/get-started:part2 linuxkit-025000000001 Running Running 44 seconds ago
59ubtqdl1zx7 getstartedlab_web.3 kugyu10/get-started:part2 linuxkit-025000000001 Running Running 44 seconds ago
o4f02pwent24 getstartedlab_web.4 kugyu10/get-started:part2 linuxkit-025000000001 Running Running 43 seconds ago
dflpxlkzc2s7 getstartedlab_web.5 kugyu10/get-started:part2 linuxkit-025000000001 Running Running 43 seconds ago
5つのコンテナかユニークなIDを振られながら元気に(?)動いているようです、多分。
$ docker container ls -q
01538f0159a2
fc574051f775
38a200c6202c
3e88db70c107
b140a2fc314b
で、各コンテナのID? Hostname? はこれでわかります。
localhost:4000
を叩いてみると
$ curl -4 http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> fc574051f775<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
$ curl -4 http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> b140a2fc314b<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
$ curl -4 http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 38a200c6202c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
$ curl -4 http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 01538f0159a2<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
$ curl -4 http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 3e88db70c107<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
叩くたびにHostnameが変わっている。
ロードバランシングの結果、都度処理しているコンテナが変わっているということだ。
スケールアップしたいなら、docker-compose.ymlの中の
コンテナ数をあげてから、再度docker stack deploy
すればいい。
(起動中のコンテナを1つ1つ落とすとかしないでいいらしい。便利!)
テストとか終わってサービスを終了するなら
$ docker stack rm getstartedlab
Removing service getstartedlab_web
Removing network getstartedlab_webnet
で終了できる。
swarmも終わるなら
docker swarm leave --force
これで3章は終了!
ちょっとでてきたコマンドが多かったので
チートシートをまとめ
# stackを確認
docker stack ls
# composefileからサービスを作って起動
docker stack deploy -c <composefile> <appname>
# ↑で作ったサービス一覧
docker service ls
# 指定したサービス名が今動いているか確認
docker service ps <service>
# タスクやコンテナを調べる
docker inspect <task or container>
# コンテナのHostname?一覧を出す
docker container ls -q
# サービス終わり
docker stack rm <appname>
# swarm(*)終わり
docker swarm leave --force
swarmなどの意味は4章で学ぶ!
今日はここまで。