さわっておぼえるDocker入門🐳#6（自作.ymlでDrupal環境をcomposeする）

# はじめに

Dockerコンテナを複数起動し、ネットワーク設定など必要な環境構築を行うための、`Compose`を学びます。

YAMLファイルに`Compose`の設定を記述し、実行することでコマンド一発で環境構築ができるようになります。


# 目的

**docker-composeを使って仮想環境にDrupalを構築をする**

今回は、下記の操作を行います。

- `docker-compose.yml`をファイルを自作する
- `docker compose`でDrupal環境を構築する
- DBにはpostgresを使用する

上記の操作を行いながら、仮想環境でDrupalとDBが動くようネットワークを構築します。

※ちなみに、DrupalはCMSの一種です。WordPressみたいな。


# 環境

- macOS Mojave 10.14.6
- Docker engine 19.03.5


# YAMLファイルを作る

`docker-compose`コマンドを使用するためには、その設定ファイルともいうべきYAMLファイルが必要になります。

早速作っていきます。

基本的なYAMLファイルの文法については、公式ドキュメントに詳しい説明がありますので、必要な時には都度参照していきます。


## `docker-compose.yml`の作成

今回は`drupal-docker`というディレクトリで作業を進めていきます。

まずは`docker-compose.yml`というファイル名で、.ymlファイルを作成します。

ファイル名はこの通りでなくても作成できますが、その場合`docker compose`コマンドを実行する際にファイル名を指定する必要があります。いちいちファイル名を指定するのは面倒なので、特別な理由がなければこのデフォルト名でファイルを作成します。


## YAMLのバージョン指定

yamlファイルにはバージョンがあります。
バージョンによって使える機能が違うのですが、今回はバージョン２を使用します。

```yaml:docker-compose.yml
version: '2'
```


## `services`の指定

`services`に使用するイメージや設定を書き込みます。


```yaml:docker-compose.yml
version: '2'

services:
  drupal: # サービス名
    image: drupal
```

Docker-Composeでは、アプリケーションを動かすための各要素をServiceと読んでいます。
でもまあ、ざっくりいうとコンテナです。

ここでは、Drupalの公式イメージから、コンテナを作りますよーと設定している感じ。


## `ports`の指定

起動させたDrupalコンテナは、Apacheで動いていて、ポートを指定してアクセスを待ち受けます。
こうした内容は、DockerHubのDrupal公式リポジトリをみて確認することができます。

どのポートがデフォルトで使用されるのかに関しても、同様にDockerHubで確認して記述しましょう。

DockerHubの公式イメージにはCompose用のサンプルが書いてあることが多いので、必要な設定を確認することが大切です。

```yaml
version: '2'

services:
  drupal: # サービス名
    image: drupal
    ports:
      - "8080:80"
```


## `データベース`の指定

今回はDrupalで使用するDBとしてPostgresを使用します。

Drupalと同じく`Services`に記述します。

DBは同一ネットワークにあるDrupalコンテナからのみアクセスするため、`ports`の指定は必要ありません。

DBにはパスワードの設定が必要なので、`environment`の記述が必要です。

```yaml
version: '2'

services:
  drupal: # サービス名
    image: drupal
    ports: 
      - "8080:80"
    
  postgres: # サービス名
    image: postgres
    environment:
      - POSTGRES_PASSWORD=mypasswd
```

## `Volumes`の指定

さて、DrupalとDBの指定ができたのですが、どのようにこのボリュームをマウントすれば良いでしょうか。
それもDurupalイメージの公式ドキュメントに書いてありますので、そこからコピペします。

![スクリーンショット 2020-04-22 22.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/ce998f84-1cab-40fc-4b0d-8421b6c25623.png)


```yaml
version: '2'

services:
  drupal: # サービス名
    image: drupal
    ports: 
      - "8080:80"
    volumes: # 名前指定付き
      - drupal-modules:/var/www/html/modules
      - drupal-profiles:/var/www/html/profiles
      - drupal-sites:/var/www/html/sites
      - drupal-themes:/var/www/html/themes

  postgres: # サービス名
    image: postgres
    environment:
      - POSTGRES_PASSWORD=mypasswd

# Volumeの定義
volumes: 
  drupal-modules:
  drupal-profiles:
  drupal-sites:
  drupal-themes:
```

Drupalに必要な4つのボリュームを名前付きで指定しました。

それに合わせて、Volumeの定義もファイルの下部で行っています。



## `docker-compose up`

YAMLの準備が整ったので、実行しましょう。
下記のコマンドを実行すると、コンテナが複数立ち上がり自動でdrupal環境が構築されます。

```bash
docker-compose up
```


`localhost:8080`をブラウザで開くことで、Drupalの初期画面が表示されました！

![スクリーンショット 2020-04-22 22.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/69072a1e-8b9f-110d-aad6-0c6f8d43c2b9.png)


ちなみに、`docker-compose down`を実行することで、upしたコンテナやそのネットワークを一度に削除することができます。


# Drupalの初期設定（注意）

このままDrupalの初期設定をする際に少し注意があります。
今、この環境はコンテナネットワークの仮想環境にある、ということです。

どういうことでしょうか。初期設定を進めていきます。

データベース名は設定した名前、ユーザー名はDockerHubにデフォルトユーザー名が`postgres`だと書いてあります。

パスワードはyamlファイルで指定したものです。

![スクリーンショット 2020-04-22 22.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/9699115a-cc88-b09a-c6b7-c441d79338a1.png)


この状態だとエラーになります。

ホストを「localhost」から「postgres」に変更することで、正常にインストールを進めることができます。
この「postgress」はサービス名であり、コンテナを使う時に重要なDNSの役割を果たしています。
この「postgress」というサービス名は、DockerのDNSによってDockerネットワークのIPに解決されDrupalに渡されます。

反対に、localhostはDBのあるネットワークではないので、localhostを指定するとエラーになってしまうというわけです。

# まとめ

インストールが完了し、無事ホーム画面が表示されました！

![スクリーンショット 2020-04-22 22.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/7956148e-770a-0f5e-1d32-847acf9af64c.png)