dockerチュートリアル 〜３章終

前回の続き。
（このシリーズ記事、特に意味が中途半端なところでブツ切れてるので
チュートリアル全部終わったら記事まとめます。）

まず前回作った```docker-compose.yml```の
説明が書いてあったので下記にまとめる

```: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の意味は４章で解説）

その後、

```
$ 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`すればいい。
（起動中のコンテナを１つ１つ落とすとかしないでいいらしい。便利！）

テストとか終わってサービスを終了するなら

```
$ docker stack rm getstartedlab
Removing service getstartedlab_web
Removing network getstartedlab_webnet
```

で終了できる。

swarmも終わるなら

```
docker swarm leave --force
```

これで３章は終了！

ちょっとでてきたコマンドが多かったので
チートシートをまとめ

```
# 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章で学ぶ！

今日はここまで。