Docker Compose 入門

# Docker Compose とは
> Docker Composeは、複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。

> これまでの連載の中でも、複数のコンテナを起動させる場面がありました。その際、各コンテナを起動するために、それぞれ起動コマンドを実行する必要がありました。また、コンテナを起動する際に、いろいろなオプションを利用していました。コマンドや手順が複雑になると、他の環境で使う／使ってもらう場合に、ミスが発生しやすくなります。他の環境でも同じ構成（同じDockerイメージ）で動かせるというDockerのメリットを生かすには、起動手順なども簡単であってほしいですよね。

> そこで活躍するのが、Docker Composeです。

> Docker Composeでは、Dockerビルドやコンテナ起動のオプションなどを含め、複数のコンテナの定義をymlファイルに書き、それを利用してDockerビルドやコンテナ起動をすることができます。一つの簡単なコマンドで複数のコンテナを管理できるようになります。

> 引用: https://knowledge.sakura.ad.jp/16862/

要は **複数のコンテナを連携させたいときに楽しようよ** っていうものです。

# Docker Compose 導入
```sh
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo gpasswd -a $USER docker
$ docker-compose -v
docker-compose version X.XX.X, build XXXXXXXX
```

# 動かしてみよう
拙作の `docker-compose.yml` を実際に動かしてみたいと思います。
<a href="https://github.com/iedred7584/DockerWordpressPlayground"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/iedred7584/DockerWordpressPlayground.png" width="460px"/></a>

```sh
$ git clone https://github.com/iedred7584/DockerWordpressPlayground.git
$ cd DockerWordpressPlayground/
$ docker-compose up -d
Creating mysql_playground     ... done
Creating wordpress_playground ... done
Creating pma_playground       ... done
```

`docker-compose` コマンドを使います。
`up` で `docker-compose.yml` をもとに作成します。
`-d` で作成が完了して起動した際に自動でデタッチしてターミナルを返すようにします。

```sh
Creating mysql_playground     ... done
Creating wordpress_playground ... done
Creating pma_playground       ... done
```

と出力されれば成功です。

## 詳細な解説
```yaml:docker-compose.yml
version: "3"
services:
  mysql:
    image: mysql:5.7
    container_name: mysql_playground
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: playground
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin

  wordpress:
    image: wordpress:latest
    container_name: wordpress_playground
    volumes:
      - ./wordpress/wwwroot:/var/www/html
      - ./wordpress/backup:/tmp/backup
      - ./wordpress/log:/tmp/log
    ports:
      - 50080:80
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_NAME: playground
      WORDPRESS_DB_USER: docker
      WORDPRESS_DB_PASSWORD: docker
    links:
      - mysql:mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: pma_playground
    ports:
      - 50081:80
    depends_on:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_USER: docker
      PMA_PASSWORD: docker
    links:
      - mysql:db
```

`version` は `docker-compose.yml` がどのバージョンから対応させているのかを指定します。投稿日時点では `3.7` が最新です。(https://docs.docker.com/compose/compose-file/)
`services` はその `docker-compose.yml` で動かすものの指定です。 `services` 以下に `mysql` `wordpress` `phpmyadmin` がありますが、これは

```sh
$ docker run mysql
$ docker run wordpress
$ docker run phpmyadmin
```

と意味合いでは同じものです。
各 `services` 以下の
`image` は使用するイメージ
`container_name` は作成したコンテナの名称を指定します。
`ports` は作成したコンテナで使用するポートを指定します。
`depends_on` はここで指定したコンテナが起動するのを待ってからこのコンテナを作成する指示します。
`environment` は環境変数の宣言します。
`links` はコンテナ間連携で連携させるコンテナ名を指定します。

## Docker Compose と Dockerfile の連携
```yaml:docker-compose.yml
version: "3"
services:
  sample:
    build: .
```

`build` で `Dockerfile` を指定します。これは `docker-compose.yml` から見た `Dockerfile` の場所を指定します。

# まとめ
```sh
$ docker run --env xxxx=xxxx --env xxxx=xxxx mysql
$ docker run --env xxxx=xxxx --env xxxx=xxxx wordpress
```

とかつらい思いをせずに Docker Compose を使いましょう。