Dokcer Swarm のハンズオンとして、ローリングアップデートの動作を確認する。
ディレクトリー構成
1 | +- docker-compose.yml |
docker-compose.yml
- Docker イメージをローカルホストに起動したレポジトリーから取得する
- レプリカ数を 3 に設定する
1 | version: '3' |
php/Dockerfile
1 | FROM php:7.2-cli-alpine |
php/index.php
- ホスト名を表示する
- バージョンを表示する
1 |
|
Docker Swarm を起動する
今回はローリングアップデートの動作を確認したいだけなので、マネージャーの1台構成で Docker Swarm を起動する。
1 | $ sudo docker swarm init --advertise-addr 127.0.0.1 --listen-addr 127.0.0.1:2377 |
Docker Swarm の起動を確認する。
1 | $ sudo docker info | grep Swarm |
registory をデプロイする
自作の Docker イメージを使用するために registory をデプロイする。
1台構成なのでいらなかった気もする。
1 | $ sudo docker pull registry |
registory の起動を確認する。
1 | $ sudo docker ps | grep registry |
Docker コンテナをビルドする
独自 Dokcer イメージをビルドする。今回はこのイメージを使用して Docker コンテナを起動し、さらに Docker イメージのバージョンを更新してローリングアップデートを確認することになる。
1 | $ sudo docker build -t sample_roundrobin:1.0 ./php/ --no-cache |
Docker イメージをプッシュする
作成した独自 Docker イメージを自前の registory にプッシュする。
まず、作成した Docker イメージの ID を確認する。
1 | $ sudo docker images | grep sample_roundrobin |
確認したイメージの ID に対してタグ付けする
1 | $ sudo docker tag bea09899e7ed 127.0.0.1:5000/sample_roundrobin:1.0 |
Docker イメージをプッシュする。
1 | $ sudo docker push 127.0.0.1:5000/sample_roundrobin:1.0 |
Docker stack をデプロイする
実際に Docker イメージをデプロイする。
1 | $ sudo docker stack deploy -c docker-compose.yml my_stack_php |
確認
デプロイできていることをかくにんする。
Docker stack の起動を確認する
Swarm モードで stack が起動していることを確認する。
1 | $ sudo docker stack ls |
Docker stack 内で起動する Docker コンテナを確認する
レプリカ数を 3 で指定しているので、stack 内で Docker コンテナが3つ起動していることを確認する。
1 | $ sudo docker stack ps my_stack_php |
Docker コンテナの起動を確認する
レプリカ数を 3 で指定しているので、Docker コンテナが3つ起動していることを確認する。
1 | $ sudo docker ps | grep sample_roundrobin |
Docker stack 内のサービスの内容を確認する
REPLICAS が 3/3 であることを確認する
1 | $ sudo docker stack services my_stack_php |
動作確認
Docker Swarm によるラウンドロビンが機能しているので、アクセスするたびに別のコンテナに接続することを確認する。
1 | $ curl http://localhost:8090 |
ローリングアップデートを実行する
本題のローリングアップデートを実行する。
Docker コンテナをアップデートする
php/index.php を更新する
1
2
3
echo 'host: ',gethostname(),PHP_EOL;
echo 'version: 1.1', PHP_EOL;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ビルドできたことを確認する
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 74MBdocker-compose.yml をversionアップした Dokcer イメージを使用するように変更する
1
2
3
4$ vi docker-compose.yml
...
image: 127.0.0.1:5000/sample_roundrobin:1.1
...ローリングアップデートを実行する
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.コンテナが1つずつ再起動し、Docker イメージのタグが 1.0 から 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.km7w0881vtbxasizoxeb356y62つ目の 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.km7w0881vtbxasizoxeb356y63つ目の 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