LoginSignup
5
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-21

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

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

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

できました

結論から言いますと、以下の2行を実行しただけで、私の Docker Toolbox 環境では、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 は Oracle VM VirtualBox の仮想マシン上で Docker サービスが動作するので、サービスで使用しているポートを外部に開放しないとPC上の他のソフトからはアクセスできません。

default 仮想マシンの設定を開き「ネットワーク」にある「ポートフォワーディング」をクリック。
image.png
今回は PC の Webブラウザからの http アクセスを許可したいので、右の追加ボタンからポート80の設定を追加します。80 が既に使用中ならば 8080 など別のポートを設定します。
image.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

Drupal 用のコンテナを起動

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

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

こんな感じで実行されます。
image.png

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

docker ps コマンドで、2つのコンテナが起動していることを確認しましょう。
image.png

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

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

Drupal の設定画面が表示されれば、サービスに無事アクセスできています!
image.png
もちろん「日本語」を選択して次へ。
image.png
インストールプロフィールは「標準」のまま次へ。
image.png
そしてここが大事な MySQL との接続設定の部分。MySQL のコンテナを作成する際に指定した値をそれぞれ入力します。パスワードは pass です。
image.png
そしてサイトのインストール、翻訳セットアップなどはただ眺めていれば終わります。
image.png
サイトの環境設定では、それぞれ適切な値を入力してください。とはいえ、テストであればご自由に!
image.png
そして Drupal のトップページが表示され、無事にインストールが完了しました。

Docker の --link オプション

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

Drupal の方のコンテナにある /etc/hosts ファイルを確認すると、ちゃんと MySQL 側のコンテナの情報が記載されていて、ちょっと感心してみたり。
image.png

トラブルシューティング

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

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

一応、以下のように操作して 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
仕方ないので、サクっと諦めて 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
後は「テーマ」から「インストールボタンで好きなテーマのファイル(もしくはURL)を読み込みます。
image.png
お勧めの講座 初心者でも挫折しないゼロから始めるDrupal 8入門 で使用されていた Paxton に変更したのがコチラ。
image.png
ちょっとお洒落っぽい Nexus Theme に変更したのがコチラ。
image.png

補足: mysql/5.7 の情報

DockerHUB の mysql イメージから、Dockerfiledocker-entrypoint.sh が参考になります。

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

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

DockerHUB の drupal イメージから、Dockerfile が参考になる… のですが、主要なセットアップはネットからバージョンに合った drupal.tar.gz を落として展開する、という仕組みになっていて、そちらも追いかけないと詳細がわかりませんね。

というわけで

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

それではまた。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6