docker-compose で stack を deploy する
https://docs.docker.com/engine/swarm/stack-deploy/ にあるサンプルアプリ、設定を用いて実際に動かしてみます。使ったコードは https://github.com/yteraoka/stackdemo に、イメージは https://hub.docker.com/r/yteraoka/stackdemo/ に。
次の内容の docker-compose.yml
を用意し
version: '3' services: web: image: yteraoka/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpine
docker stack deploy
の --compose-file
で指定して実行すると docker-compose up
のような出力がされ、stack が作成されます
ところで、上記のように YAML を書いておくと docker-compose build
で image の build ができ、docker-compose push
でその image を push できちゃうんですね。image
に tag まで指定しておけばその tag がつけられる。便利!
root@swarm1:~/stackdemo# docker stack deploy --compose-file docker-compose.yml stackdemo Ignoring unsupported options: build Creating network stackdemo_default Creating service stackdemo_web Creating service stackdemo_redis root@swarm1:~/stackdemo#
docker stack ls
で stack に一覧が確認できます。各 stack にいくつの service が含まれるかも表示されます
root@swarm1:~/stackdemo# docker stack ls NAME SERVICES stackdemo 2 root@swarm1:~/stackdemo#
web と redis のサービスが作成されています
root@swarm1:~/stackdemo# docker service ls ID NAME MODE REPLICAS IMAGE PORTS tidm24xf7r2d stackdemo_redis replicated 1/1 redis:alpine iv6u57cs5wfo stackdemo_web replicated 1/1 yteraoka/stackdemo:latest *:8000->8000/tcp root@swarm1:~/stackdemo#
docker stack ps
で指定 stack で実行されているコンテナ一覧が確認できます
root@swarm1:~/stackdemo# docker stack ps stackdemo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS o19qsdbdlkzq stackdemo_redis.1 redis:alpine swarm2 Running Running 2 minutes ago bua5sbi9t8di stackdemo_web.1 yteraoka/stackdemo:latest swarm1 Running Running 2 minutes ago root@swarm1:~/stackdemo#
docker service ps
でサービス単位でも確認できます
root@swarm1:~/stackdemo# docker service ps stackdemo_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS bua5sbi9t8di stackdemo_web.1 yteraoka/stackdemo:latest swarm1 Running Running about a minute ago root@swarm1:~/stackdemo#
root@swarm1:~/stackdemo# docker service ps stackdemo_redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS o19qsdbdlkzq stackdemo_redis.1 redis:alpine swarm2 Running Running about a minute ago root@swarm1:~/stackdemo#
docker service logs
でサービスのコンテナ全部のログをまとめて確認できます、レプリカ数が複数になるとどのコンテナにアクセスが来るかわからないのでこれができると便利
root@swarm3:~# docker service logs -f stackdemo_web stackdemo_web.1.bua5sbi9t8di@swarm1 | * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit) stackdemo_web.1.bua5sbi9t8di@swarm1 | * Restarting with stat stackdemo_web.1.bua5sbi9t8di@swarm1 | * Debugger is active! stackdemo_web.1.bua5sbi9t8di@swarm1 | * Debugger PIN: 298-511-468 stackdemo_web.1.bua5sbi9t8di@swarm1 | 10.255.0.2 - - [17/Mar/2018 10:07:01] "GET / HTTP/1.1" 200 - stackdemo_web.1.bua5sbi9t8di@swarm1 | 10.255.0.2 - - [17/Mar/2018 10:07:02] "GET /favicon.ico HTTP/1.1" 404 - stackdemo_web.1.bua5sbi9t8di@swarm1 | 10.255.0.2 - - [17/Mar/2018 10:07:51] "GET / HTTP/1.1" 200 - stackdemo_web.1.bua5sbi9t8di@swarm1 | 10.255.0.2 - - [17/Mar/2018 10:07:51] "GET / HTTP/1.1" 200 -
ここまでのコマンドは manager node で実行する必要があります。worker node でも実行できる docker ps
ではその node で動いているコンテナしか確認できません
root@swarm1:~/stackdemo# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c760d3d1d55e yteraoka/stackdemo:latest "python app.py" 11 seconds ago Up 10 seconds stackdemo_web.1.bua5sbi9t8dimdiqnog0ukct8 root@swarm1:~/stackdemo#
Service の更新
stack
を使わないで作った service
は docker service update
でイメージの入れ替えなどを行いますが、stack
の場合は docker-compose.yml
を書き換えて作成時と同じコマンド docker stack deploy --compose-file docker-compose.yml
を実行することで変更のあったサービスだけ更新が行われます
今回、redis を使っていますが、redis の方をいじらなければコンテナの入れ替えなどは行われないため web のアプリ側が新しくなってもデータは残っています
レプリカ数やローリングアップデートに関する設定は deploy という設定で行います
レプリカ数を 3 にしてみます
root@swarm1:~/stackdemo# git diff docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml index 5be7bcb..df3d5c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,5 +6,7 @@ services: build: . ports: - "8000:8000" + deploy: + replicas: 3 redis: image: redis:alpine root@swarm1:~/stackdemo#
更新のために docker stack deploy
を再度実行します
root@swarm1:~/stackdemo# docker stack deploy --compose-file docker-compose.yml stackdemo Ignoring unsupported options: build Updating service stackdemo_web (id: iv6u57cs5wfo4tuuhle6dl7kv) Updating service stackdemo_redis (id: tidm24xf7r2dqexa82wfiwrfu) root@swarm1:~/stackdemo#
stackdemo_web に2つのコンテナが追加されました
root@swarm1:~/stackdemo# docker stack ps stackdemo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS o19qsdbdlkzq stackdemo_redis.1 redis:alpine swarm2 Running Running 2 hours ago bua5sbi9t8di stackdemo_web.1 yteraoka/stackdemo:latest swarm1 Running Running 2 hours ago umzedgj5vhew stackdemo_web.2 yteraoka/stackdemo:latest swarm3 Running Preparing 8 seconds ago v4cbfc1kpnud stackdemo_web.3 yteraoka/stackdemo:latest swarm2 Running Running less than a second ago root@swarm1:~/stackdemo#
なかなか便利そうですね。stack の削除は docker stack rm STACKNAME
です。
Comments
[…] 前回の stackdemo を stack で deploy してみます。 […]