---
# System prepended metadata

title: Docker入門⑦
tags: [Docker]

---

# Docker入門⑦
###### tags: `Docker`

# Docker Compose
## Docker Composeとは何か？
- WordPressを作成したときのように、複数のコマンドで構築してくのは少々面倒
- 後始末するにも、毎回稼働状況を確認していくのも手間がかかる
- こうした構築に関するコマンド内容を１つの定義ファイルに書き込んで、一気に実行したり、停止、削除ができるようになるのがDocker Compose

### Docker Composeの仕組み
- 定義ファイルは基本的にYAML形式で用意して、ファイルの中身を"up"（一括実行）したり、"down"（コンテナとネットワーク一括停止・削除）したりする
- 定義ファイルにはこのようなコンテナの設定で作成したいという項目を書いておく

### Docker ComposeとDockerfileの違い
- Docker Composeは"docker run"コマンドの集合体で、作成するのは「コンテナ」、「周辺環境」、「ネットワーク」、「ボリューム」
- Dockerfileはイメージを作成するものなので、「ネットワーク」や「ボリューム」を作成できない

## Docker Composeのインストールと使い方

### Docker Composeのインストール
- DockerEngineとは別のソフトウェアだから、Docker Composeを使うにはインストールが必要
- Dockerデスクトップをインストールしてれば同時にインストールしてくれる
- Docker ComposeはPythonで作成されいる

### Docker Composeの使い方
- DockerComposeを使うには、ホストマシンにフォルダを作成して、そこに定義ファイルを置く
- 定義ファイル名は必ず決まっていて、"docker-compose.yml"になる
- 定義ファイルは１つのフォルダに対して、１つしか置くことができない
- コンテナ作成に必要な画像ファイルや、HTMLファイルも、Compose用ディレクトリに置いておく必要がある
- **package.jsonとかtsconfig.jsonみたいなもんだな**

## Docker Composeファイルの書き方

### 定義ファイルの記述ルール
- 最初にDocker Composeのバージョンを書く
- 大項目「services」「networks」「volumes」に続いて設定内容を書く
- 親子関係はスペースでインデントを設ける
- インデントの幅は統一する
- 名前は大項目の下にインデントをつけて書く
- 「-」が入ったら複数指定できる
- 名前の後ろには「:」をつける
- 「:」の後ろには空白が必要
- コメントを入れたい場合は「#」を使う（コメントアウト）
- 文字列を入れる場合は、「''」か「""」で囲む

### 定義ファイルの項目

#### 大項目

| 項目 | 内容 |
| - | - |
| services | コンテナに関する定義 |
| networks | ネットワークに関する定義 |
| volumes |  ボリュームに関する定義 |

#### 定義内容

| 項目 | docker run での対応 | 内容 |
| - | - | - |
| image | イメージ引数 | 利用するイメージを指定する |
| networks | --net | 接続するネットワークを指定する |
| volumes | -v, --mount | 記憶領域のマウントを指定する |
| ports | -p | ポートのマッピングを指定する |
| enviroment | -e | 環境変数を指定する |
| depends_on | なし | 別のサービスに依存することを指定する |
| restart | なし | コンテナが停止した時の、再試行ポリシーを指定する |
| command | コマンド引数 | 起動時の既定のコマンドを上書きする |
| container_name | --name | 起動するコンテナ名を明示的に指定する |
| dns | --dns | カスタムなDNSサーバーを明示的に指定する |
| env_file | なし | 環境設定情報を書いたファイルを読み込む |
| entrypoint | --entrypoint | 起動時のENTRYPPOINTを上書きする |
| enternal_links | --link | 外部リンクを指定する |
| extra_hosts | --add-host | 外部ホストのIPアドレスを明示的に指定する |
| logging | --log-driver | ログ出力先を指定する |
| network_mode | --network | ネットワークモードを設定する |


#### restartの設定値

| 設定値 | 内容 |
| - | - |
| no | 何もしない |
| always | 必ず再起動 |
| on-failue | プロセスが0以外のステータスで終了した時は再起動する |
| unless-stopped | 停止していた時は再起動しない、それ以外は再起動する |


## ✅ 定義ファイルを作っていくぅ！！

### ボリュームとコンテナ

| 項目 | 値 |
| - | - |
| ネットワーク名 | wordpress000net1 |
| MySQLのボリューム名 | mysql000vol11 |
| WordPressのボリューム名 | wordpress000vol12 |
| MySQLのコンテナ名 | mysql000ex11 |
| WordPressのコンテナ名 | wordpress000ex12 |

### 定義内容

#### MySQL
| 項目 | 項目名 | 値 |
| - | - | - |
| MySQLイメージ名 | image: | mysql:5.7 |
| 使用するネットワーク | networks: | wordpress000net1 |
| 使用するボリューム | volumes: | mysql000vol11 |
| マウント先 |  | /var/lib/mysql |
| 再起動に関する設定 | restart: | always |
| MySQLの設定 | enviroment: |  |
| MySQLのrootパスワード | MYSQL_ROOT_PASSWORD | myrootpass |
| MySQLのデータベース領域 | MYSQL_DATABASE | wordpress000db |
| MySQLのユーザー名 | MYSQL_USER | wordpress000kun |
| MySQLのパスワード| MYSQL_PASSWORD | wkunpass |

#### WordPress
| 項目 | 項目名 | 値 |
| - | - | - |
| 依存関係 | depends_on: | mysql000ex11 |
| WordPressのイメージ名 | image: | wordpress |
| 使用するネットワーク | networks: | wordpress000net1 |
| 使用するボリューム | volumes: | wordpress000vol12 |
| マウント先 |  | /var/www/html |
| ポート番号を指定 | port: | 8085:80 |
| 再起動に関する設定 | restart | always |
| データベースに関数情報 | enviroment |  |
| データベースのコンテナ名 | WORDPRESS_DB_HOST | mysql000ex11 |
| データベース領域名 | WORDPRESS_DB_NAME | wordpress000db |
| データベースのユーザー名 | WORDPRESS_BD_USER | wordpress000kun |
| データベースのパスワード| WORDPRESS_DB_PASSWORD | wkunpass |

1. 定義ファイルを"/home/ユーザー名/Docker/docker-compose.yml"（Mac用）に作成する

    ```yaml=
    version: "3"
    services:
      mysql000ex11:
        image: mysql:5.7
        networks:
          - wordpress000net1
        volumes:
          - mysql000vol11:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: myrootpass
          MYSQL_DATABASE: wordpress000db
          MYSQL_USER: wordpress000kun
          MYSQL_PASSWORD: wkunpass
      wordpress000ex12:
        depends_on:
          - mysql000ex11
        image: wordpress
        networks:
          - wordpress000net1
        volumes:
          - wordpress000vol12:/var/www/html
        ports:
          - 8085:80
        restart: always
        environment:
          WORDPRESS_DB_HOST: mysql000ex11
          WORDPRESS_DB_NAME: wordpress000db
          WORDPRESS_DB_USER: wordpress000kun
          WORDPRESS_DB_PASSWORD: wkunpass
    networks:
      wordpress000net1:
    volumes:
      mysql000vol11:
      wordpress000vol12:
    ```

## Docker Composeのコマンド

- Docker Composeは"docker-compose"コマンドを使用する
- 「up」「doown」「stop」の３つのコマンドがある
- 「up」でファイルに定義されたコンテナやネットワークなどを作成
- 「down」で停止・削除までを実行


## ✅ 定義ファイルを使ってDocker Composeを実行していくぅ！！

1. 定義ファイルを実行

    ```shell=
    # docker-compose.ymlファイルのあるディレクりに移動
    cd Docker

    # 実行
    docker-compose up -d
    ```
    
1. コンテナを停止・削除
    ```shell=
    docker-compose down
    ```
    
1. 後始末

    ```shell=
    docker image rm wordpress
    docker image rm mysql:5.7
    ```
