【Docker】公式チュートリアルをやってみた 【Part3】

# **はじめに**
- ConohaのVPSを借りたのでDockerを入れようと思い、[公式のチュートリアル](https://docs.docker.com/get-started/)をやってみようと思ったのでございます

# **環境**
- VirtualBox 5.1.22 r115126
  - ポートフォワーディング設定でアクセスできるようにしています
- Ubuntu16.04.2 LTS
- Docker version 17.03.1-ce, build c6d412e
  - Dockerのインストールについては[公式手順](https://docs.docker.com/engine/installation/linux/ubuntu/)に沿って実施しております

# **チュートリアル**
- [Part 1: Orientation and Setup](https://docs.docker.com/get-started/)
- [Part 2: Containers](https://docs.docker.com/get-started/part2/)
    - [【Docker】公式チュートリアルをやってみた 【Part1/Part2】](https://qiita.com/Tocyuki/items/420c3afa25bd28e58159)
- [**Part 3: Services**](https://docs.docker.com/get-started/part3/)
    - [【Docker】公式チュートリアルをやってみた 【Part3】](https://qiita.com/Tocyuki/items/2b04a0fcf25c07c1b367)
- [Part 4: Swarms](https://docs.docker.com/get-started/part4/)
    - [【Docker】公式チュートリアルをやってみた 【Part4】](https://qiita.com/Tocyuki/items/dade81596400b80b7ef3)
- [Part 5: Stacks](https://docs.docker.com/get-started/part5/)
- [Part 6: Deploy your app](https://docs.docker.com/get-started/part6/)

# **Part 3: Services**
## docker-compose.ymlの作成
- 参考情報：[Compose file version 3 reference](https://docs.docker.com/compose/compose-file/)

```yaml:docker-compose.yml
version: "3"
services:
  web:
    # Part2で作成したdocker cloudのイメージを使用
    image: tocyuki/repository:tag
    deploy:
      # 5台作成する
      replicas: 5
      resources:
        limits:
          # 最大10%までのCPU利用
          cpus: "0.1"
          # 最大50MBまでのメモリ利用
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      # ホストの80番ポートをコンテナの80番ポートへマッピング
      - "80:80"
    networks:
      - webnet
networks:
  webnet:
```

## docker swarm initの実施
- このコマンドを実行することで、実行したホストをdocker swarmのマネージャーホストとすることができる

```shell-session
tocyuki@vm01:~/docker_tutorial/part3$ docker swarm init
Swarm initialized: current node (mfb7mslrjr6qbkkzi42x9525p) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-3562frmookuker51re8lelyaewh1c37g690yodforc13gxhby6-3gntbpftwe8br3h225i5ew7ul \
    10.0.2.15:2377

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

## アプリの実行
- **getstartedlab**という名前でアプリをswarmモードで実行

```shell-session
tocyuki@vm01:~/docker_tutorial/part3$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
```

## コンテナの起動を確認
### コマンドラインでの確認
```shell-session
tocyuki@vm01:~/docker_tutorial/part3$ docker stack ps getstartedlab
ID            NAME                 IMAGE                   NODE  DESIRED STATE  CURRENT STATE          ERROR  PORTS
msazmhxdrs9z  getstartedlab_web.1  tocyuki/repository:tag  vm01  Running        Running 4 seconds ago
4bz3usxe0fpa  getstartedlab_web.2  tocyuki/repository:tag  vm01  Running        Running 4 seconds ago
js4j0zhxaydu  getstartedlab_web.3  tocyuki/repository:tag  vm01  Running        Running 5 seconds ago
5rdhkuc5xkns  getstartedlab_web.4  tocyuki/repository:tag  vm01  Running        Running 4 seconds ago
p3tqe5lhu9zg  getstartedlab_web.5  tocyuki/repository:tag  vm01  Running        Running 4 seconds ago
```

```shell-session
tocyuki@vm01:~/docker_tutorial/part3$ docker ps
CONTAINER ID        IMAGE                                                                                        COMMAND             CREATED             STATUS              PORTS               NAMES
49ffec8732f5        tocyuki/repository@sha256:1ae82dcb5528f752c9c1fc57a55ec0dde097ee2b119011ed2d99b3b9e81228d8   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.4.5rdhkuc5xknsyeru01160pang
7f105ebe27ed        tocyuki/repository@sha256:1ae82dcb5528f752c9c1fc57a55ec0dde097ee2b119011ed2d99b3b9e81228d8   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.5.p3tqe5lhu9zgh1atrwe7svk59
485d12957ac6        tocyuki/repository@sha256:1ae82dcb5528f752c9c1fc57a55ec0dde097ee2b119011ed2d99b3b9e81228d8   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.1.msazmhxdrs9z75379ojwkgmgj
a55408bffb42        tocyuki/repository@sha256:1ae82dcb5528f752c9c1fc57a55ec0dde097ee2b119011ed2d99b3b9e81228d8   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.3.js4j0zhxaydun9wwv9xqtew5c
c2d0e23af466        tocyuki/repository@sha256:1ae82dcb5528f752c9c1fc57a55ec0dde097ee2b119011ed2d99b3b9e81228d8   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.2.4bz3usxe0fpaxsy0q9qi3ai53
```

### WEBブラウザからの確認
- 更新していくと、各コンテナに負荷分散されているのがわかる

![WS000517.png](https://qiita-image-store.s3.amazonaws.com/0/79134/cc502576-c630-e2b7-5ebb-730a8b8220fc.png)
![WS000518.png](https://qiita-image-store.s3.amazonaws.com/0/79134/dc34a427-7965-55ac-ccae-512d6e811673.png)
![WS000519.png](https://qiita-image-store.s3.amazonaws.com/0/79134/a244d2b4-3757-e2d1-2944-df5ef539cdf9.png)
![WS000520.png](https://qiita-image-store.s3.amazonaws.com/0/79134/655ec6db-c0e9-9c1c-a808-2fa0ce0cde4f.png)
![WS000521.png](https://qiita-image-store.s3.amazonaws.com/0/79134/504bd393-8c40-1f58-9977-1342ac152ae5.png)

## アプリの終了
```shell-session
tocyuki@vm01:~/docker_tutorial/part3$ docker stack rm getstartedlab
Removing service getstartedlab_web
Removing network getstartedlab_webnet
```

## Part3で学習したコマンドのチートシート
```bash
# List all running applications on this Docker host
docker stack ls      

# Run the specified Compose file        
docker stack deploy -c <composefile> <appname>  

# List the services associated with an app
docker stack services <appname>    

# List the running containers associated with an app   
docker stack ps <appname>   

# Tear down an application
docker stack rm <appname>                             
```