Docker-compose.ymlって何か難しいこと書いてるな、と思った人へ

# Docker-compose.ymlについて

Docker-composeは、複数のdockerイメージをビルドしてコンテナを作成できる。
コマンド一つで複数のコンテナを起動できる。
Docker-compose.ymlといいファイルに、コンテナの中身をサービスとして定義する。dockerイメージなどを指定する感じ。

# 詳しい中身
実際何を定義してるの？って話

## version:

- Dockerエンジンが1.13.1+以上がverison3.0に対応してる。
- バージョン指定しない場合は、レガシーフォーマット である`1.0`となる
- マイナーバージョンを指定しない`version: '3'`とかの場合はマイナーバージョン0`version: '3.0'`になる。
- 3と2で結構違うぽい。特別な理由がなければ3を使うので良いと思われる。

対応表
[https://docs.docker.com/compose/compose-file/](https://docs.docker.com/compose/compose-file/)

## service:

起動するコンテナに相当する。
サービス名は自分で決めて良い。
例えば公式から拝借した↓の定義だと、`db`となっている部分は自分で決めることができる。

```yml
version: "3.9"
services:

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        max_replicas_per_node: 1
        constraints:
          - "node.role==manager"
```

## image:

Dockerイメージを使用する場合はここでイメージを指定する。

## resart：

再起動設定
デフォルトは`no`
コンテナが終了してても再起動をするかどうか

英語↓

https://docs.docker.com/engine/reference/run/#restart-policies---restart

日本語↓

http://docs.docker.jp/engine/reference/run.html#restart-policies-restart


## depends_on:

サービス間(コンテナ間)の依存関係を記述できる。

コンテナを起動したときは 依存されているやつ → 依存しているやつ
終了する時は 依存しているやつ → 依存されてるやつ

の順番になる

## links:

コンテナ同士を連携させる。でもこれを使うのは古い。
docker-composeを使うと、自動的に連携されているので記述は不要。

## ports:

ホストとコンテナのポートを対応づける。
ホスト側の値がキーで、コンテナ側の値はバリューになる。

## volumes:

コンテナ内にデータをおいてもコンテナを破棄すると消えてしまうので、コンテナの外(ボリューム)におく。
やり方は、主に２種類ある。

### バインドマウント

- https://matsuand.github.io/docs.docker.jp.onthefly/storage/bind-mounts/
- ホスト側のディレクトリをコンテナ内のディレクトリと共有する。
- ボリュームと違って既存のディレクトリをマウントするので、ホストマシンのファイルシステムに依存することになる。従って、ボリュームを使うことが推奨されている。

### ボリューム

- https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/
- ホスト上(macのdockerはVMで動いてるのでVM)に新規でディレクトリが作成されて、保存領域を確保してくれる。Linux なら `/var/lib/docker/volumes/`以下になる。
- 名前付きボリュームと匿名ボリュームがあり、名前付きの場合は Docker ホスト内で名前解決できるのでアクセスしやすい。匿名ボリュームは適当にハッシュ値が振られる。他のプロセスからは触ることができないので安全。**基本はこれを使うのがよい。**
- `docker volume ls`でボリューム一覧を見ることができる。実態を見るには↓がわかりやすかった。

    [[Docker for Mac] Docker Volumeの実態がどこにあるのか、探してみた｜w0o0ps｜note](https://note.com/w0o0ps/n/n9bc1bcd9fa59)

### マウントオプション
マウントオプションというものがある。
https://docs.docker.jp/docker-for-mac/osxfs-caching.html](https://docs.docker.jp/docker-for-mac/osxfs-caching.html

- **`consistent`** ：完全な一貫性（常にホストとコンテナが完全に同じ表示）
- **`cached`** ：ホストの表示が信頼できる（ホスト上の更新がコンテナ上に反映するまで、遅延が発生するのを許容）
- **`delegated`** ：コンテナの表示が信頼できる（コンテナ上の更新がホスト上に反映するまで、遅延が発生するのを許容）

## environment:

環境変数。ホストじゃなくてコンテナに割り当てられる。
以下、pypmyadminとMySQLを使ったので個人的なまとめ

### pypmyadminの環境変数

https://registry.hub.docker.com/r/phpmyadmin/phpmyadmin

- **PMA_ARBITRARY**：1にすると、任意のサーバーに接続できる。
- **PMA_HOST**：MySQLのホスト(サービス)の名前
- **PMA_USER and PMA_PASSWORD**：ユーザー名とパスワード
- **PMA_PORT**：MySQLのポートを指定する

### MySQLの環境変数

- **MYSQL_ROOT_PASSWORD**：rootアカウントのパスワード
- **MYSQL_DATABASE**：データベース名

## Build:

https://docs.docker.com/compose/compose-file/compose-file-v3/#build

### content:

dockerfileがあるディレクトリ

### dockerfile:

dockerfileの名前

### args:

dockerfile内で使用する環境変数

# 参考
https://blog1.mammb.com/entry/2020/05/19/090000
https://qiita.com/aki_55p/items/63c47214cab7bcb027e0
https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32
https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770