第03回　複数のDockerイメージを稼働させる

# はじめに
本文書を参照頂きありがとうございます。
この文書は社内勉強会に向けた文書である為、一部期待値と異なる表現、記載がある場合がありますので、ご利用になられる際はその辺りも加味して頂いてご利用下さい。

# Dockerfile、docker-compose
[前回](https://qiita.com/takanobu_kawaguchi/items/25b0a7a1f17c1d8b5205)、任意のDockerイメージをダウンロードして、動かしてみることが出来たかと思いますが、システムって、例えばデータベースとWebサーバは同時に動いていることがほとんどかと思います。
また、Raspberry Piの起動・停止に合わせてDockerイメージも起動・停止をコントロールしたり等、自分の都合に合わせてDockerをコントロールする為に、Dockerfile、docker-composeという仕組みがあります。
今回は、それらを学習していきたいと思います。

# Dockerfile
Dockerfileの構文につきましては、下記の公式リファレンスと参考資料を元にしました。
※参考資料：[公式リファレンス（英語）](https://docs.docker.com/engine/reference/builder/)
※参考資料：[Dockerfileについて](https://qiita.com/tanan/items/e79a5dc1b54ca830ac21)

## まずはDockerfileを書いてみる
まずはUbuntuにnginxを入れたイメージを作ってみたいと思います。

```:Dockerfile
# ベースとなるDockerイメージを指定
FROM ubuntu
# Shellの実行を行う為のコマンドを記載
RUN apt-get update && apt-get install -y nginx curl
# コンテナがlistenするポート番号を明示
EXPOSE 80
# コンテナ起動時に実行するコマンドを指定
ENTRYPOINT ["nginx", "-g", "daemon off;"]
```

## Raspberry Pi側の準備
Dockerfile置き場を作っておきます。

```
pi@raspberrypi:~ $ pwd
/home/pi
pi@raspberrypi:~ $ mkdir Docker
pi@raspberrypi:~ $ cd Docker/
pi@raspberrypi:~/Docker $ mkdir ubuntu
pi@raspberrypi:~/Docker $ cd ubuntu
pi@raspberrypi:~/Docker/ubuntu $ vi Dockerfile
pi@raspberrypi:~/Docker/ubuntu $ cd ..
pi@raspberrypi:~/Docker $ ls
ubuntu
```

## Dockerfileを使ってイメージ取得＆ビルド
作成したDockerfileを使ってUbuntuとnginxのイメージを取得します。

```
pi@raspberrypi:~/Docker $ docker build -f ubuntu/Dockerfile -t ubuntu:nginx ./ubuntu/
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu
latest: Pulling from library/ubuntu
5379ca036368: Pull complete 
4ede4c7641a5: Pull complete 
0994f5ac8c79: Pull complete 
a81b96316730: Pull complete 
Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a
Status: Downloaded newer image for ubuntu:latest
 ---> 6348795f7982
Step 2/4 : RUN apt-get update && apt-get install -y nginx curl
 ---> Running in 76e7f68a4e78
Get:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease [242 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease [88.7 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease [74.6 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease [88.7 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports bionic/multiverse armhf Packages [157 kB]

〜　省略　〜

Step 3/4 : EXPOSE 80
 ---> Running in bf0c8d3240e7
Removing intermediate container bf0c8d3240e7
 ---> 51f684a004f8
Step 4/4 : ENTRYPOINT ["nginx", "-g", "daemon off;"]
 ---> Running in 24e4a3c110e2
Removing intermediate container 24e4a3c110e2
 ---> f8afafd2a441
Successfully built f8afafd2a441
Successfully tagged ubuntu:nginx
pi@raspberrypi:~/Docker $ 
```

ログをよく見て頂くと分りますが、Dockerfileに記載した４つのコマンドがStep1〜4まで実行されていることが確認できるかと思います。

## 作成されたDockerイメージの確認
結果を見てみます。

```
pi@raspberrypi:~ $ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
ubuntu                   nginx               f8afafd2a441        4 minutes ago       131MB
ubuntu                   latest              6348795f7982        3 weeks ago         46.7MB
centos                   centos7             8c52f2d0416f        5 months ago        175MB
pi@raspberrypi:~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
pi@raspberrypi:~ $ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                        PORTS               NAMES
f1fec8013f38        centos:centos7               "/bin/bash"              2 hours ago         Exited (137) 14 minutes ago                       centos7
pi@raspberrypi:~ $ 
```

ubuntuのDockerイメージが作成されていますね。
現在はコンテナは何も動作していません。

## 作成したDockerイメージをコンテナで動作させてみる
Dockerイメージをコンテナで動作させてみます。

```
pi@raspberrypi:~/Docker $ docker run -d -p 80:80 ubuntu:nginx
d76722a1e06cd5fe023926894639877ec416c92208963ce8cf389b6ff83d6a54
pi@raspberrypi:~/Docker $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d76722a1e06c        ubuntu:nginx        "nginx -g 'daemon of…"   18 seconds ago      Up 14 seconds       0.0.0.0:80->80/tcp   xenodochial_easley
pi@raspberrypi:~/Docker $ 
```

## 動作確認
curlコマンドで確認してみます。

```
pi@raspberrypi:~/Docker $ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
pi@raspberrypi:~/Docker $
```

HTMLの結果が返ってきたので動作していますね。
ついでにRaspberry Pi上のブラウザでも確認してみました。
（画像粗くてすみません。。。）
![raspi_ubuntu_nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187099/0e25b86d-2865-d08f-c4e4-ca47c222ada0.png)

イケてました。
ちなみにUbuntuにログインしてみると、

```
pi@raspberrypi:~/Docker $ docker exec -it d76722a1e06c bash
root@d76722a1e06c:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@d76722a1e06c:/# 
```

という感じでバージョンの確認も出来ました。
Dockerfileを用いたイメージ作成から動作確認まで、これにて完了です。

# docker-compose
※参考資料：[docker-composeを使うと複数コンテナの管理が便利に](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)



（執筆中）