docker-composeのcomposeファイルの書き方【LAMP環境構築ベース】

Docker-composeを使って、PHPとMySQLを動かすために、LAMP環境を作成したので、そのcomposeファイルを元にdocker-composeの概要をまとめてみました。

##Docker-composeとは
Docker-composeとは、複数のコンテナをつなげて管理することのできるツールです。
Docker-composeを使うことで、簡単にコンテナ間の通信を行うこともできます。

Dockerイメージの作成方法やコンテナ起動時の設定などを「docker-compose.yml」に記述することで、「docker compose」コマンドでまとめて操作できるようになります。
Docker-composeは設定を全てyml形式で記述します。
そのファイルをcomposeファイルといい、ここでdocker fileでイメージをビルドして、コンテナを立ち上げる事ができます。
また、環境関数を使うことも可能です。

今回はこのdokcer-composeを使って、
mysqlとphp-apache、phpmyadminのコンテナを作り、LAMP環境を作成します。

###composeファイルについて

```yml:docker-compose.yml
version: "3.7"
services:
  mysql:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "password"

  phpmyadmin:
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
    restart: always
    ports:
      - "8080:80"

  php-apache:
    build: ./php
    volumes:
      - ./htdocs:/var/www/html
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql
volumes:
  db_data: {}

```
---------------------------------------------------------------

上記のcomposeファイルを例に書き方の説明をします。

##version
使用するDocker-composeバージョンを定義する記述です。
現在(2021年5月)は3系が最新のバージョンになります。
バージョンによって、Composeファイルの書き方変わります。
ここでは「3.7」を設定します。

##services（サービス）
「サービス」は起動するコンテナーの設定の定義のことです。
ここに各コンテナーと、その設定を記述します。
サービスには名前をつけて複数定義可能で、各サービス間での通信を定義できます。

###サービス名
サービスはservicesに定義する各サービスの名前です。
任意で決めることができます。
ここではmysqlとphpmyadmin、php-apacheの3つのサービスを定義します。
このサービスごとにコンテナが起動します。

###image（イメージ）
イメージはDockerのコンテナーの元になるものです。
もし指定したイメージがなければbuildするときにインストールされます。
ここではmysqlとphpmyadminでそれぞれ、**「mysql:5.7」**と**「phpmyadmin/phpmyadmin」**のイメージを使用します。

###volumes（ボリューム）
ボリュームにはマウントする設定ファイルのパスを指定します。
マウントとは簡単に言うとディレクトリを同期する事です。

###restart
コンテナの起動に失敗したときの再起動の設定。何もしない場合は「no」を設定。
再起動する場合は「always」を設定する。

###environment
環境変数を指定します。
Mysqlのパスワードやデータベース名前などを指定し、ここで設定した環境変数名は実際のプログラムでも使います。

###build
Dockerファイルを使用してimageを作成するときに、使用するDockerファイルを指定します。
ここで作成したimageを使用してサービスのコンテナを立ち上げます。

###ports
ポートの設定を設定します。

###depends_on
ほかのサービスとの依存関係を設定します。
「compose up」と「compose down」したときに指定したサービスが先に起動/終了するようになります。

```yml:docker-compose.yml
version: "3.7"
services:
  mysql:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "password"

  phpmyadmin:
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
    restart: always
    ports:
      - "8080:80"

  php-apache:
    build: ./php
    volumes:
      - ./htdocs:/var/www/html
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql
```

---------------------------------------------------------------

##「Docker-compose」コマンド一覧
コマンドの説明に関しては、こちらのサイトがわかりやすかったので、説明を引用をしています。
[引用元のサイト](https://kitsune.blog/docker-compose#%E3%80%8Cdocker-compose%E3%80%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7) 

###docker-compose build
「docker-compose build」コマンドは、サービス内のイメージに対してビルドを行います。
イメージがビルドされていないとコンテナを起動できないため、先にイメージのビルドを行います。

```terminal:サービスのビルド
# サービスをビルド
$ docker-compose build

# サービスをビルド（キャッシュを使わない）
$ docker-compose build --no-cache

# サービスを指定してビルド
$ docker-compose build [サービス名]
```

###docker-compose up
「docker-compose up」コマンドは、サービス内のイメージからコンテナを作成して起動します。
すでにコンテナが作成されている場合は、イメージを読み込み直してコンテナを再起動させます。
「-d」オプションをつけることで、バックグラウンドでコンテナを起動させることも可能です。

```terminal:コンテナの起動
# サービスからコンテナを作成し、起動
$ docker-compose up -d
```

###docker-compose logs
「docker-compose logs」コマンドは、コンテナの起動ログを出力します。


```terminal:コンテナ起動ログを確認
# サービスの起動ログを出力
$ docker-compose logs
```

###docker-compose run
「docker-compose run」コマンドは、指定したサービスから新たなコンテナを作成し、コマンドを実行します。
そのため、このコマンドを実行した回数だけコンテナが増えていきます。
コンテナを増やしたくない場合は、「--rm」オプションをつけましょう。


```terminal:コマンドの実行
docker-compose run --rm app rails db:create
```

###docker-compose exe
「docker-compose build」コマンドは、指定したサービスのコンテナにログインします。

```terminal:コンテナにログイン
# コンテナにログイン
$ docker-compose exec app bash
```

###docker-compose stop
「docker-compose stop」コマンドは、サービス内のコンテナを停止します。

```terminal:コンテナ停止
# サービスのコンテナを再起動
$ docker-compose restart
Restarting docker_web_1 ... done
Restarting docker_app_1 ... done
Restarting docker_db_1  ... done

# 指定したサービスのコンテナを再起動
$ docker-compose restart app
Restarting docker_app_1 ... done
```

###docker-compose rm
「docker-compose rm」コマンドは、サービス内のコンテナを削除します。

```terminal:コンテナの削除
# サービスのコンテナを削除
$ docker-compose rm
Going to remove docker_web_1, docker_app_1, docker_db_1
Are you sure? [yN] y
Removing docker_web_1 ... done
Removing docker_app_1 ... done
Removing docker_db_1  ... done

# 指定したサービスのコンテナを削除
$ docker-compose rm app
Going to remove docker_app_1
Are you sure? [yN] y
Removing docker_app_1 ... done

```