Docker Swarm | ローリングアップデート

Dokcer Swarm のハンズオンとして、ローリングアップデートの動作を確認する。

ディレクトリー構成

1
2
3
4
+- docker-compose.yml
+- php
+- Dockerfile
+- index.php

docker-compose.yml

  1. Docker イメージをローカルホストに起動したレポジトリーから取得する
  2. レプリカ数を 3 に設定する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
services:
myphp:
image: 127.0.0.1:5000/sample_roundrobin
ports:
- '8090:80'
deploy:
replicas: 3
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure

php/Dockerfile

1
2
3
4
5
FROM php:7.2-cli-alpine
COPY ./index.php /root
EXPOSE 80
WORKDIR /root
CMD ["php", "-S", "0.0.0.0:80"]

php/index.php

  1. ホスト名を表示する
  2. バージョンを表示する
1
2
3
<?php
echo 'host: ',gethostname(),PHP_EOL;
echo 'version: 1.0', PHP_EOL;

Docker Swarm を起動する

今回はローリングアップデートの動作を確認したいだけなので、マネージャーの1台構成で Docker Swarm を起動する。

1
2
3
4
5
6
7
8
$ sudo docker swarm init --advertise-addr 127.0.0.1 --listen-addr 127.0.0.1:2377
Swarm initialized: current node (0fez4px3gvjgjlir8v0gtbfd8) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-1aijqhx0w6wr4fp4nf7chutdjrrc1ye39f8d94d7ctb4vmcq5h-e2wjv6l3lqf1unue7tcjcoggp 127.0.0.1:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Docker Swarm の起動を確認する。

1
2
$ sudo docker info | grep Swarm
Swarm: active

registory をデプロイする

自作の Docker イメージを使用するために registory をデプロイする。

1台構成なのでいらなかった気もする。

1
2
3
4
5
6
7
8
9
10
11
$ sudo docker pull registry
Using default tag: latest
latest: Pulling from library/registry
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Image is up to date for registry:latest
$ sudo docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /var/opt:/var/lib/registry \
registry

registory の起動を確認する。

1
2
$ sudo docker ps | grep registry
914ac0e1e864 registry "/entrypoint.sh /etc…" 2 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp registry

Docker コンテナをビルドする

独自 Dokcer イメージをビルドする。今回はこのイメージを使用して Docker コンテナを起動し、さらに Docker イメージのバージョンを更新してローリングアップデートを確認することになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ sudo docker build -t sample_roundrobin:1.0 ./php/ --no-cache
Sending build context to Docker daemon 3.072kB
Step 1/5 : FROM php:7.2-cli-alpine
7.2-cli-alpine: Pulling from library/php
188c0c94c7c5: Pull complete
45f8bf6cfdbe: Pull complete
ce5be7974012: Pull complete
a99dd6507fe5: Pull complete
2e09107d1b77: Pull complete
68ba0d1bcbb6: Pull complete
eebd8dbb76c4: Pull complete
ff8acab58c91: Pull complete
2d3a546f4f6a: Pull complete
Digest: sha256:64a4fbe5d825dc51a1550be4c0914edfd441f0989ec29bbac74d9a0add7bc4cd
Status: Downloaded newer image for php:7.2-cli-alpine
---> 07b1fb26cf26
Step 2/5 : COPY ./index.php /root
---> c9624b82a6e2
Step 3/5 : EXPOSE 80
---> Running in 26c8d6ab43a3
Removing intermediate container 26c8d6ab43a3
---> a2e18f760766
Step 4/5 : WORKDIR /root
---> Running in e233139ab948
Removing intermediate container e233139ab948
---> 9214f12d1321
Step 5/5 : CMD ["php", "-S", "0.0.0.0:80"]
---> Running in 11d365d85040
Removing intermediate container 11d365d85040
---> 96a3b12365dc
Successfully built 96a3b12365dc
Successfully tagged sample_roundrobin:1.0

Docker イメージをプッシュする

作成した独自 Docker イメージを自前の registory にプッシュする。

まず、作成した Docker イメージの ID を確認する。

1
2
$ sudo docker images | grep  sample_roundrobin
sample_roundrobin 1.0 bea09899e7ed About a minute ago 74MB

確認したイメージの ID に対してタグ付けする

1
$ sudo docker tag bea09899e7ed 127.0.0.1:5000/sample_roundrobin:1.0

Docker イメージをプッシュする。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo docker push 127.0.0.1:5000/sample_roundrobin:1.0
The push refers to repository [127.0.0.1:5000/sample_roundrobin]
91a45ce1ccb2: Pushed
4d929a8a92be: Pushed
c0db9d4e8194: Pushed
52dab6d250ba: Pushed
29b45db51db4: Pushed
a672a047ada3: Pushed
ea7d729a7e1b: Pushed
c84148fa85b6: Pushed
4f34707acc6f: Pushed
ace0eda3e3be: Pushed
1.0: digest: sha256:12e5c3a09a68c38e7bf46cf0a60d0915093bb1c9d30f7de76d6a51b34dd0c508 size: 2409

Docker stack をデプロイする

実際に Docker イメージをデプロイする。

1
2
3
$ sudo docker stack deploy -c docker-compose.yml my_stack_php
Creating network my_stack_php_default
Creating service my_stack_php_myphp

確認

デプロイできていることをかくにんする。

Docker stack の起動を確認する

Swarm モードで stack が起動していることを確認する。

1
2
3
$ sudo docker stack ls
NAME SERVICES ORCHESTRATOR
my_stack_php 1 Swarm

Docker stack 内で起動する Docker コンテナを確認する

レプリカ数を 3 で指定しているので、stack 内で Docker コンテナが3つ起動していることを確認する。

1
2
3
4
5
$ sudo docker stack ps my_stack_php
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3hzn2hg0dtdj my_stack_php_myphp.1 127.0.0.1:5000/sample_roundrobin:1.0 host01 Running Running 14 seconds ago
wiauv6cq8lk7 my_stack_php_myphp.2 127.0.0.1:5000/sample_roundrobin:1.0 host01 Running Running 12 seconds ago
km7w0881vtbx my_stack_php_myphp.3 127.0.0.1:5000/sample_roundrobin:1.0 host01 Running Running 15 seconds ago

Docker コンテナの起動を確認する

レプリカ数を 3 で指定しているので、Docker コンテナが3つ起動していることを確認する。

1
2
3
4
$ sudo docker ps | grep sample_roundrobin
00c169ac3f4e 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 2 minutes ago Up About a minute 80/tcp my_stack_php_myphp.2.wiauv6cq8lk7zlbh2ikg3w2x9
a48df92f4a92 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 2 minutes ago Up About a minute 80/tcp my_stack_php_myphp.1.3hzn2hg0dtdjy31754vns5zg5
e66c81b76c08 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 2 minutes ago Up About a minute 80/tcp my_stack_php_myphp.3.km7w0881vtbxasizoxeb356y6

Docker stack 内のサービスの内容を確認する

REPLICAS が 3/3 であることを確認する

1
2
3
$ sudo docker stack services my_stack_php
ID NAME MODE REPLICAS IMAGE PORTS
az6rydt95w73 my_stack_php_myphp replicated 3/3 127.0.0.1:5000/sample_roundrobin:1.0 *:8090->80/tcp

動作確認

Docker Swarm によるラウンドロビンが機能しているので、アクセスするたびに別のコンテナに接続することを確認する。

1
2
3
4
5
6
7
8
9
$ curl http://localhost:8090
host: 00c169ac3f4e
version: 1.0
$ curl http://localhost:8090
host: a48df92f4a92
version: 1.0
$ curl http://localhost:8090
host: e66c81b76c08
version: 1.0

ローリングアップデートを実行する

本題のローリングアップデートを実行する。

Docker コンテナをアップデートする

  1. php/index.php を更新する

    1
    2
    3
    <?php
    echo 'host: ',gethostname(),PHP_EOL;
    echo 'version: 1.1', PHP_EOL;
  2. Docker イメージをビルドする

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ sudo docker build -t sample_roundrobin:1.1 ./php/ --no-cache
    Sending build context to Docker daemon 3.072kB
    Step 1/5 : FROM php:7.2-cli-alpine
    ---> 07b1fb26cf26
    Step 2/5 : COPY ./index.php /root
    ---> ad31db1e9506
    Step 3/5 : EXPOSE 80
    ---> Running in 502dc9fd0cdb
    Removing intermediate container 502dc9fd0cdb
    ---> d049dcda3a94
    Step 4/5 : WORKDIR /root
    ---> Running in 9dd7840397fd
    Removing intermediate container 9dd7840397fd
    ---> fcde0e7adda2
    Step 5/5 : CMD ["php", "-S", "0.0.0.0:80"]
    ---> Running in 97fb16780bc2
    Removing intermediate container 97fb16780bc2
    ---> d386bcb292cf
    Successfully built d386bcb292cf
    Successfully tagged sample_roundrobin:1.1
  3. ビルドできたことを確認する

    1
    2
    3
    $ sudo docker images | grep  sample_roundrobin
    127.0.0.1:5000/sample_roundrobin 1.0 d386bcb292cf 2 minutes ago 74MB
    127.0.0.1:5000/sample_roundrobin 1.1 d386bcb292cf 2 minutes ago 74MB
  4. docker-compose.yml をversionアップした Dokcer イメージを使用するように変更する

    1
    2
    3
    4
    $ vi docker-compose.yml
    ...
    image: 127.0.0.1:5000/sample_roundrobin:1.1
    ...
  5. ローリングアップデートを実行する

    1
    2
    3
    4
    5
    6
    $ sudo docker stack deploy -c docker-compose.yml my_stack_php
    Updating service my_stack_php_myphp (id: az6rydt95w73xwfpr26iuhwcx)
    image 127.0.0.1:5000/sample_roundrobin:1.1 could not be accessed on a registry to record
    its digest. Each node will access 127.0.0.1:5000/sample_roundrobin:1.1 independently,
    possibly leading to different nodes running different
    versions of the image.
  6. コンテナが1つずつ再起動し、Docker イメージのタグが 1.0 から 1.1 に更新されていることが確認できる。

    1. 1つ目の Dokcer コンテナがアップデート

      1
      2
      3
      4
      $ sudo docker ps | grep sample_roundrobin
      589bd9eea410 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" 18 seconds ago Up 1 second 80/tcp my_stack_php_myphp.1.g95qxjfjfpld5phve3i6zk3ju
      81802efc064d 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 3 minutes ago Up 3 minutes 80/tcp my_stack_php_myphp.2.qwk3l05bvs044eb3j7tun4zc8
      49b9cc70e3e3 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 4 minutes ago Up 3 minutes 80/tcp my_stack_php_myphp.3.km7w0881vtbxasizoxeb356y6
    2. 2つ目の Docker コンテナがアップデート

      1
      2
      3
      4
      $ sudo docker ps | grep sample_roundrobin
      f3469c3b37ec 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" 20 seconds ago Up 3 seconds 80/tcp my_stack_php_myphp.2.qwk3l05bvs044eb3j7tun4zc8
      589bd9eea410 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" 38 seconds ago Up 21 seconds 80/tcp my_stack_php_myphp.1.g95qxjfjfpld5phve3i6zk3ju
      49b9cc70e3e3 127.0.0.1:5000/sample_roundrobin:1.0 "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 80/tcp my_stack_php_myphp.3.km7w0881vtbxasizoxeb356y6
    3. 3つ目の Docker コンテナがアップデート

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
              $ sudo docker ps | grep sample_roundrobin
      c506b0e6ced4 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" 32 seconds ago Up 14 seconds 80/tcp my_stack_php_myphp.3.y4o5doms7gel53dtlpfvzbzq5
      f3469c3b37ec 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" 50 seconds ago Up 33 seconds 80/tcp my_stack_php_myphp.2.qwk3l05bvs044eb3j7tun4zc8
      589bd9eea410 127.0.0.1:5000/sample_roundrobin:1.1 "docker-php-entrypoi…" About a minute ago Up 51 seconds 80/tcp my_stack_php_myphp.1.g95qxjfjfpld5phve3i6zk3ju
      `

      1. それぞれの Docker コンテナにアクセスできることと、表示されるバージョンがアップグレードしていることが確認できる。

      ```sh
      $ curl http://localhost:8090
      host: c506b0e6ced4
      version: 1.1
      $ curl http://localhost:8090
      host: f3469c3b37ec
      version: 1.1
      $ curl http://localhost:8090
      host: 589bd9eea410
      version: 1.1
次回はレプリカ数について確認する。