Docker Composeを使った複数コンテナの構築

# 目次
- 1. Docker Compose とは
- 2. Docker Compose の仕組み
- 3. docker-compose.yml
  - 3-1. 書き方
  - 3-2. 作成
  - 3-3. 実行
- 4. 後片付け
  - 4-1. ネットワークとコンテナの削除
  - 4-2. イメージの削除
  - 4-3. 注意点

# 1. Docker Compose とは
Docker Compose とは、コンテナやボリューム、ネットワークの作成/停止/破棄の操作をまとめて実行できる仕組みです。

複数のコンテナを組み合わせてシステム構築する場合、実行するコマンド、引数やオプションが多くなり面倒になります。
以下、WordPressの環境構築の設定例です。

```bash:ネットワーク作成
$ docker network create ネットワーク名
```

```bash:MySQLコンテナ起動
$ docker run --name コンテナ名 -itd --net=Dockerネットワーク名 -p 8081:80 -e DB_HOST: mysqlコンテナ名 -e DB_USER: DBユーザ -e DB_PASS: DBパスワード -e DB_NAME: DB名 wordpress
```

```bash:WordPressコンテナ起動
$ docker run --name コンテナ名 -itd --net=Dockerネットワーク名 -p 8081:80 -e DB_HOST: mysqlコンテナ名 -e DB_USER: DBユーザ -e DB_PASS: DBパスワード -e DB_NAME: DB名 wordpress
```

このような環境を構築する際に使用するのが Docker Compose です。

# 2. Docker Compose の仕組み
Docker Composeは、`docker-compose.yml` という定義ファイルに、コンテナやボリューム、ネットワークの構成をあらかじめ記述しておき、その定義ファイルを読み込ませることで、記述した構成を一気に構築できます。(※例1)

※例1:
![051601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/b5242545-8c62-7efc-a660-4862d8d41a7c.png)

# 3. docker-compose.yml
## 3-1. 書き方

```yml:docker-compose.yml
version: '3'

services:
  コンテナ名:
    depends_on:
      - 依存するコンテナ名
    image: Docker Hub より pull してくるイメージ
    networks:
      - Docker ネットワーク名
    ports:
      - ポートの設定
    restart: always
    environment:
      環境変数1: 値1
      環境変数2: 値2

networks:
  ネットワーク名:

volumes:
  ボリューム名:
```

|大項目|小項目|内容|docker runコマンド実行時のオプション|
|---|---|---|---|---|
|version|-|docker-composeで使用するバージョンを定義します。<br>バージョンによって書き方が異なります。|-|
|services|-|コンテナの情報を定義します。<br>docker composeでは、コンテナのことをサービスと呼びます。|-|
|-|depends_on|依存するコンテナ名を定義し、コンテナの起動順を制御できます。|-|
|-|image|Docker Hub より pull してくるイメージを定義します。|-|
|-|networks|接続するネットワークを指定します。|-|
|-|ports|ポートのマッピングを定義します。|-p|
|-|restart|コンテナが異常停止した際の再起動についての設置を定義します。<br>（always の場合は、明示的にstopを実行しない限り、再起動が実施されます。）|-|
|-|environment|を定義します。|-e|
|networks|-|ネットワークの情報を定義します。|--net|
|volumes|-|ボリュームのマウント設定を定義します。|-v|

## 3-2. 作成
### ① MySQLコンテナ
```yml:MySQLコンテナ起動用の定義ファイル
version: '3'

services:
  mysql-container:
    image: mysql:5.7
    networks:
      - wordpress-network
    volumes:
      - wordpress-volume:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_USER: admin
      MYSQL_PASSWORD: adminpass
      MYSQL_DATABASE: wordpressdb
```

### ② WordPressコンテナ
```yml:WordPressコンテナ起動用の定義ファイル
version: '3'

services:
  wordpress-container:
    depends_on:
      - mysql-container
    image: wordpress
    networks:
      - wordpress-network
    ports:
      - 8081:80
    restart: always
    environment:
      DB_HOST: mysql-container
      DB_USER: admin
      DB_PASS: adminpass
      DB_NAME: wordpressdb
```

### ③ Docker ネットワーク
```yml:ネットワークの定義
networks:
  wordpress-network:
```

### ④ ボリューム
```yml:ボリュームの定義
volumes:
  wordpress-volume:
```

### 完成版
```yml:完成版
version: '3'

services:
  wordpress-container:
    depends_on:
      - mysql-container
    image: wordpress
    networks:
      - wordpress-network
    ports:
      - 8081:80
    restart: always
    environment:
      DB_HOST: mysql-container
      DB_USER: admin
      DB_PASS: adminpass
      DB_NAME: wordpressdb

  mysql-container:
    image: mysql:5.7
    networks:
      - wordpress-network
    volumes:
      - wordpress-volume:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_USER: admin
      MYSQL_PASSWORD: adminpass
      MYSQL_DATABASE: wordpressdb

networks:
  wordpress-network:

volumes:
  wordpress-volume:
```


## 3-3. 実行
`docker-compose up` で、`docker-compose.yml`で定義したコンテナやネットワーク、ボリュームを作成・起動します。
実行時のオプションは以下を指定します。

  - `-f` で `docker-compose.yml` のパスを指定。
  - `-d` でバックグラウンドで実行する。

```bash:docker-compose.ymlの実行
docker-compose -f パス名/docker-compose.yml up -d
```

`http://localhost:8081/` に接続し、wordpressの設定画面が確認できれば成功です。

# 4. 後片付け
## 4-1. ネットワークとコンテナの削除
`docker-compose down` でネットワークとコンテナを停止・削除します。
`-f` オプションで `docker-compose.yml` のパスを指定します。

```bash:ネットワークとコンテナの削除
docker-compose -f パス名/docker-compose.yml down
```

## 4-2. イメージ、ボリュームの削除
`docker-compose down` では、イメージとボリュームが削除されないため、別途削除します。

```bash:イメージの削除
docker rmi イメージ名
```

```bash:ボリュームの削除
docker volume rm ボリューム名
```

## 4-3. 注意点
`docker-compose down` は、`docker-compose.yml`に定義されている内容を元に停止・削除を実行します。
`docker-compose up` 実行時の構成を停止・削除するわけではありません。

`docker-compose up` 実行後、`docker-compose.yml`の定義内容に変更が加えられた場合、実行中の環境の削除漏れや意図しないコンテナの削除等が発生する可能性があるため注意が必要です。