【ミライトデザイン社内勉強会#5】docker-compose.ymlとDockerfileを一行づつ読んでみる


[最強のLaravel開発環境をDockerを使って構築する【新編集版】 - Qiita](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4)
で使用されている `docker-composer.yml` と　`Dockerfile`が何をしているのかを一行づつ見てみる


https://github.com/ucan-lab/docker-laravel

## docker-compose.yml

```yml
version: "3.8" # ① docker file で使用するバージョンを指定
volumes: # ② VMの中にボリュームする領域を確保している
  db-store:
  php-fpm-socket:
services: # ③ サービス１つ１つがコンテナ
  app: # ④ サービスの名前（任意でつけて大丈夫）
    build: ./docker/php # ⑤ ここにあるdockerファイルでビルドしろっていってる
    volumes:
      - php-fpm-socket:/var/run/php-fpm # ⑥ VM本体の領域に、コンテナの中の/var/run/php-fpmがマウントしている
      - ../backend:/work/backend

  web:
    build: ./docker/nginx
    ports:
      - 80:80
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ../backend:/work/backend

  db:
    build: ./docker/mysql
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - 3306:3306
```

① [ファイルバージョン3リファレンスを作成する| Dockerドキュメント](https://docs.docker.com/compose/compose-file/)
このバージョンの指定によってファイルの書き方が変わってくる

② Docker for mac の中にVMがありコンテナのデータをマウントする領域を確保している
VMにマウントすることでコンテナを削除してもデータが消えない
名前は任意につけて大丈夫。


- サービス

```
docker-compose ps
        Name                      Command               State                 Ports              
-------------------------------------------------------------------------------------------------
docker-laravel_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp                         
docker-laravel_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-laravel_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp    
```

## Dockerfile

### MySQL

https://github.com/ucan-lab/docker-laravel/blob/master/infra/docker/mysql/Dockerfile

```Dockerfile
# ① dockerhub からmysql8.0のイメージを取得している
FROM mysql:8.0
# ② LABELを設定している
LABEL maintainer="ucan-lab <yes@u-can.pro>"

# ③ OSの環境変数に値を追加している
ENV TZ=UTC \ # タイムゾーン
  # MYSQLが指定している環境変数を指定している
  MYSQL_DATABASE=laravel_local \
  MYSQL_USER=phper \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret

# ④ ホストのファイルをコンテナにコピーしている
COPY ./my.cnf /etc/my.cnf
```

- ① `https://hub.docker.com/_/mysql`からimageを取得している
    - :8.0 を記述しないとlatestのバージョンを持ってくる
- ② Fromの後にlabelでmaintainerをかく観衆があるよ
- ③ mysqlのイメージに環境変数を渡せば、公式のイメージが勝手に設定してくれる
    - https://hub.docker.com/_/mysql の`Environment Variables`に記載がある
- ④ 左がホストで右がコンテナのパス
    - ホストに存在するファイルをコンテナの指定したパスにコピーしてる

#### buildする

```
13:01:24 ❯ docker build -t mysql_image .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM mysql:8.0
 ---> 0d64f46acfd1
Step 2/4 : LABEL maintainer="ucan-lab <yes@u-can.pro>"
 ---> Using cache
 ---> ef5acb641867
Step 3/4 : ENV TZ=UTC   MYSQL_DATABASE=laravel_local   MYSQL_USER=phper   MYSQL_PASSWORD=secret   MYSQL_ROOT_PASSWORD=secret
 ---> Using cache
 ---> 3eb31d9f4c84
Step 4/4 : COPY ./my.cnf /etc/my.cnf
 ---> Using cache
 ---> c064e3fa414a
Successfully built c064e3fa414a
Successfully tagged mysql_image:latest
```

- buildに成功すると、dockerimageができる

```
13:08:35 ❯ docker images                
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mysql_image          latest              f9666eb795b6        8 seconds ago       544MB
  ```

- imageを元にコンテナが作成される
    - imageを使っているコンテナがあるとimage消せない

#### コンテナを立ち上げてみる

docker hub の ubuntu を立ち上げてみる

```
13:08:43 ❯ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
54ee1f796a1e: Pull complete 
f7bfea53ad12: Pull complete 
46d371e02073: Pull complete 
b66c17bbf772: Pull complete 
Digest: sha256:31dfb10d52ce76c5ca0aa19d10b3e6424b830729e32a89a7c6eee2cda2be67a5
Status: Downloaded newer image for ubuntu:latest
root@d9d9fe415292:/# exit
exit
```

- コンテナの削除

```
$ docker rm <CONTAINER ID>
```

- imageの削除

```
$ docker rmi <IMAGE ID>
```


## 参考記事

- [よく使いそうなDockerfileの記法一覧 \- Qiita](https://qiita.com/yu-croco/items/9b190f99fae982202c19)
- [docker-compose.ymlの書き方について解説してみた - Qiita](https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04)