Drupal + MySQL を Docker コンテナ上で動かしてみた

WordPress と並んで Web 管理ツール (CMS) として普及している Drupal ですが、私は以前に [インストールに失敗](https://qiita.com/yamachan360/items/ec7b9dc1aa93e4075528) した悲しい経験がありまして、少し苦手意識があります。

最近になって Docker を調べ始めたのですが、2015年8月と少し古いものの、以下のようなわかりやすい良いスライドを発見しました。

* [DrupalCafe Vol.35 - Dockerで始めるDrupal](https://www.slideshare.net/blauerberg/drupalcafe-vol35-dockerdrupal)

2018年11月の現在、Drupal 8.6.3 を使って、上記を参考に試してみたいとおもいます。

# できました

結論から言いますと、以下の2行を実行しただけで、私の [Docker Toolbox](https://qiita.com/yamachan360/items/94dc0c6879927cbdc781) 環境では、Drupal 8.6.3 があっさり動作しました。参考にした資料も良かったですし、Docker の簡単さと、安定性を感じますね。

```
docker run -d --name drupal_db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=drupaldb -e MYSQL_USER=drupal -e MYSQL_PASSWORD=pass mysql:5
docker run -d --name drupal_service --link drupal_db -p 80:80 drupal
```

まあ、細かなとこでちょっとハマったんですけどね。それも含めて流れを説明します。

# 仮想環境の設定

まずは下準備が必要です。[Docker Toolbox](https://qiita.com/yamachan360/items/94dc0c6879927cbdc781) は Oracle VM VirtualBox の仮想マシン上で Docker サービスが動作するので、サービスで使用しているポートを外部に開放しないとPC上の他のソフトからはアクセスできません。

default 仮想マシンの設定を開き「ネットワーク」にある「ポートフォワーディング」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/d125c2ca-273e-1ac3-5519-aa6d7ce79280.png)
今回は PC の Webブラウザからの http アクセスを許可したいので、右の追加ボタンからポート80の設定を追加します。80 が既に使用中ならば 8080 など別のポートを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/94c20f3a-658b-5eb0-60e1-2e0f6562d431.png)
今回だけでなく、Docker から提供したサービスを PC など仮想環境の外から確認する場合、ポートフォワーディングがちゃんと設定されているか確認を忘れないようにしましょう。

# MySQL 用のコンテナを起動

Docker Quickstart Terminal を起動したら、まずは1行目を実行して、MySQL 用のコンテナを作成・起動します。

```
docker run -d --name drupal_db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=drupaldb -e MYSQL_USER=drupal -e MYSQL_PASSWORD=pass mysql:5
```

こんな感じで実行されます。(一部はダウンロード済みでした)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/36099c49-0af8-f43c-90cc-d3a47307c753.png)

# Drupal 用のコンテナを起動

次に2行目を実行して、Drupal 用のコンテナを作成・起動します。

```
docker run -d --name drupal_service --link drupal_db -p 80:80 drupal
```

こんな感じで実行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/65b88fe7-3a69-eadb-5f20-e2fafd684644.png)

# 2つのコンテナ起動の確認

`docker ps` コマンドで、2つのコンテナが起動していることを確認しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b1232824-7820-0276-4af4-1ae28ee130bf.png)

# Web ブラウザからのアクセスと Drupal の設定

これだけで Drupal サービスが起動しているハズ。PC の Web ブラウザで、http://localhost/ にアクセスしてみましょう。

Drupal の設定画面が表示されれば、サービスに無事アクセスできています！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b7d4567e-50fe-90f7-0ab6-8dc809575dd6.png)
もちろん「日本語」を選択して次へ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/926d1866-6340-4639-5f46-df3e9af286ac.png)
インストールプロフィールは「標準」のまま次へ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/e3afdad0-dc02-fb46-4ffe-9faccc2dd3d9.png)
そしてここが大事な MySQL との接続設定の部分。MySQL のコンテナを作成する際に指定した値をそれぞれ入力します。パスワードは `pass` です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f0436caa-c897-567f-8812-63466363c118.png)
そしてサイトのインストール、翻訳セットアップなどはただ眺めていれば終わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ecf17e2e-34df-5f58-4810-1b4faf1f7499.png)
サイトの環境設定では、それぞれ適切な値を入力してください。とはいえ、テストであればご自由に！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/42bb5fd6-7dd3-b130-7e29-7d0104c6b250.png)
そして Drupal のトップページが表示され、無事にインストールが完了しました。

# Docker の --link オプション

もはや古い機能らしいのですが、同一マシン上で動く Docker 環境において、--link コマンドひとつで、しかもアクセス元で指定するだけで、コンテナ同士が通信できるのは便利ですよね。

Drupal の方のコンテナにある `/etc/hosts` ファイルを確認すると、ちゃんと MySQL 側のコンテナの情報が記載されていて、ちょっと感心してみたり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/011c0c98-0e34-1b41-c158-0fb241e862fa.png)

# トラブルシューティング

と、順風満帆に進んだようにみえますが、実は Drupal の設定の際、MySQL データベース設定のところで以下のようなエラーが発生していました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b0147ae7-3458-a0f7-c802-dab775ea3a3c.png)
Docker の設定間違いなどで MySQL 側のコンテナにアクセスできない時は、別のネットワークエラーが表示されます。それに対してこれは、「サーバーからの返信」とあるように、アクセスはできているのだけれど、MySQL 側で何か問題が発生している場合のエラーです。

このエラーで検索してみると、わりと有名な問題のようで、いくつか情報がありました。

* [SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client](https://qiita.com/hondy12345/items/60a91488648f5ff45ff9)
* [【Docker】MySQL8.0系を使う時に発生する問題について](https://blog.websandbag.com/entry/2018/05/17/121730)

一応、以下のように操作して MySQL DB の設定ファイルを変更してみましたが、なぜか効果はみられず…

```
docker exec -it drupal_db bash
echo "default_authentication_plugin= mysql_native_password" >> /etc/mysql/my.cnf
exit
docker restart drupal_db
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/472080e8-cffe-ccce-407a-85878effa2e5.png)
仕方ないので、サクっと諦めて MySQL のバージョン5 を指定することで対応してしまいました。ほら、最初に実行した Docker コマンド、さりげなく最後が `mysql:5` になっていたでしょう。あれがそうです。

```
docker run -d --name drupal_db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=drupaldb -e MYSQL_USER=drupal -e MYSQL_PASSWORD=pass mysql:5
```

# おまけ:テーマを変更してみる

せっかくなので、テーマを変更してみました。まずは「拡張機能」から「Update Manager」をインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4c71cf91-a6a1-a61e-b05f-76d71881737c.png)
後は「テーマ」から「インストールボタンで好きなテーマのファイル(もしくはURL)を読み込みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a2612f59-5b61-a8b8-cd42-7beaed210c86.png)
お勧めの講座 [初心者でも挫折しないゼロから始めるDrupal 8入門](https://thinkit.co.jp/series/5779) で使用されていた [Paxton](https://www.drupal.org/project/paxton) に変更したのがコチラ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/bc10934c-3ad9-efbf-23d0-1610699f646d.png)
ちょっとお洒落っぽい [Nexus Theme](https://www.drupal.org/project/nexus) に変更したのがコチラ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4552de99-de61-efd6-044f-fde4c2f56e41.png)

# 補足: mysql/5.7 の情報

DockerHUB の [mysql](https://hub.docker.com/_/mysql/) イメージから、[Dockerfile](https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/Dockerfile) と [docker-entrypoint.sh]
(https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/docker-entrypoint.sh) が参考になります。

特に docker run 時に -e オプションで指定する環境変数は、mysql の標準機能ではなく、上記の `docker-entrypoint.sh` シェルスクリプトの中で処理されているのが興味深いです。

# 補足: drupal/8.6/apache/ の情報

DockerHUB の [drupal](https://hub.docker.com/_/drupal/)  イメージから、[Dockerfile](https://github.com/docker-library/drupal/blob/3f6716f12feaa1e3b3a78d2748941342073f4b32/8.6/apache/Dockerfile) が参考になる… のですが、主要なセットアップはネットからバージョンに合った `drupal.tar.gz` を落として展開する、という仕組みになっていて、そちらも追いかけないと詳細がわかりませんね。

# というわけで

意外なところでハマりましたが、でもそれほど大きな苦労はなく、Drupal + MySQL 環境をコンテナ上で作成することができました。かなりお手軽で、Docker に人気がある理由の一端が見えた気がします。もっといろいろ試してみたいとおもいます！

それではまた。