DrupalをDockerでお試しで起動するまで


Drupal をひとまず試したいのであれば PHP 製ウェブアプリなので XAMPP を用いるなどでもよいのですが、Docker が入っている場合は Docker でサクッと環境を作成することができます。

以下にて Drupal の公式イメージが配布されているのでとにかく起動させてみたいのであれば、公式の説明通りのコマンドを叩けばとりあえずブラウザで確認することができます。

docker run --name some-drupal -p 8080:80 -d drupal

ただこれだと、コンテナを削除すると全てのデータが消えてしまうので Dockerfile のカスタマイズと docker-compose を用いた永続化の例を紹介します。

Dockerfile でベースイメージのカスタマイズ

./Dockerfile
FROM drupal:latest

# Drushインストール
RUN composer global require drush/drush \
  && ln -s /root/.composer/vendor/bin/drush /usr/local/bin/drush \
  && drush --version

CMD ["apache2-foreground"]

上記のは公式イメージから Drupal をコマンドラインで操作するためのツール Drush を composer を用いてインストールしています。

なお、composer コマンドはベースイメージでインストールしているので特にインストール作業も無しにコマンドを用いて別途パッケージを追加することができます。

最後に CMD ["apache2-foreground"] で Apache を起動しています。

docker-compose.yml で永続化設定

Docker 公式の Drupal イメージには DB サーバーがインストールされていないので、組み込み DB の SQLite を用いて CMS のセットアップをしてしまうか、別途 DB サーバーを担うコンテナを建てる必要があります。

今回は docker-compose を利用して DB (今回は mariadb)サーバーを立ち上げて接続するようにしつつ、各種リソースを永続化するように設定します。

./docker-compose.yml
version: '3.7'

services:
  mysql:
    image: mariadb
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - data:/var/lib/mysql
      - ./dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: "password" # 任意で変更してください
      MYSQL_DATABASE: "drupal" # 任意で変更してください
    ports:
      - "3306:3306"

  drupal:
    build: ./
    volumes:
      - ./web/themes:/var/www/html/themes
      - ./web/modules:/var/www/html/modules
      - ./web/sites:/var/www/html/sites
      - ./config:/opt/drupal/config
      - ./composer.json:/opt/drupal/composer.json
      - ./composer.lock:/opt/drupal/composer.lock
    ports:
      - "80:80"
    depends_on:
      - mysql

volumes:
  data: {}

いくつか特筆すべき箇所をピックアップします。

services.mysql.command はDBの文字コードをデフォルトのラテン系から、日本語などマルチバイト文字を利用する場合に必要な設定となります。

services.drupal.depends_on で drupal コンテナから mysql コンテナにアクセスできるようにしています。

また、Docker でコンテナを立ち上げる際にマウントはホストからコンテナ方向の単一のため、予めホスト側にコンテナの資材を用意しておく必要があります。

そのために、適当なコンテナを立ち上げて tar コマンドなりでホスト側に資材を持ってくる必要があります。

以下は公式イメージのページにかかれているコマンドをほぼそのまま引用していますが、docker cp コマンドでもホストに資材を持ってくることが可能です。

$ mkdir -p ./web/{themes/,modules/,sites/}
$ docker run --rm drupal tar -cC /var/www/html/themes . | tar -xC ./web/themes
$ docker run --rm drupal tar -cC /var/www/html/modules . | tar -xC ./web/modules
$ docker run --rm drupal tar -cC /var/www/html/sites . | tar -xC ./web/sites
$ docker run --rm drupal cat /opt/drupal/composer.json > ./composer.json
$ docker run --rm drupal cat /opt/drupal/composer.lock > ./composer.lock

あとは docker-compose.yml を起動すれば http://localhost で Drupal のインストール画面へ遷移します。

$ docker-compose up

次回は中規模以上のサイトでよくあるケースに Drupal がそもそも対応しているのか、そのあたりの検証、知見の共有をできればと思います。