Docker Swarm mode を知る (stack)

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 を使わないで作った servicedocker 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 です。

Built with Hugo
テーマ StackJimmy によって設計されています。