DockerによるDrupal8開発環境の構築

はじめに

Drupalでサイトを構築する機会がありました。
Drupalでの開発環境を構築する場合、以下のものを用意する必要があります。

  • Webサーバー
  • DBサーバー
  • Drupal

これらをmac上で用意しようとした場合、一般的には xamppmamp を用いるという選択肢があります。
今回は上記は使わず、Dockerを用いて環境の構築をすることにしました。
その方法を以下に記述します。

前提

以下の条件を前提とします。

  • docker が使用可能である
  • docker-compose が使用可能である

環境構築のポイント

このようなシステムを作ります。

docker_with_drupal-Page-2

ポイントは以下になります。

  • Drupal用とDB用と2つのコンテナを作成
  • DrupalはDBを参照
  • DBとDrupalのサイト定義はVolumeでホスト側へ永続化
  • ホストからDrupalへはポート8080を介して接続

手順

以下の手順で作成していきます。

  1. ボリューム用ディレクトリのためのスクリプト作成
  2. docker-compose.ymlの作成
  3. コンテナの起動とDruoalの初期設定

ボリューム用ディレクトリのためのスクリプト作成

drupal と、db が使用するものそれぞれを作成します。
ディレクトリ構成は以下になります。

├── data
│   ├── html
│   │   ├── modules
│   │   ├── profiles
│   │   ├── sites
│   │   └── themes
│   └── postgres

作ったり壊したりを何回も行う可能性があるので、setup.sh というファイルを作成し、実行権限を付与しました。
スクリプトは以下のようにしました。

#!/bin/bash
pgVolumes=("./data/postgres")
drupalVolumes=("./data/html/modules" "./data/html/profiles" "./data/html/themes" "./data/html/sites")
makeDirs() {
for path in "$@"
do
echo "Creating \"$path\" ..."
mkdir -p "$path"
echo "done."
done
}
echo "started."
makeDirs "${drupalVolumes[@]}"
makeDirs "${pgVolumes[@]}"
echo "finished."
view raw setup.sh hosted with ❤ by GitHub

docker-compose.ymlの作成

Docker HubにあるDrupalのOfficial Images記載の情報をもとに構築します。

  1. ネットワークの設定
  2. ボリュームの設定
  3. DB
  4. Drupal

ネットワークの設定

drupal_net という名前でネットワークを作成します。
これには、drupaldb が参加します。

networks:
  drupal_net:
    driver: bridge

ボリュームの設定

ボリュームのローカルに保存するパスを相対パスにて記述します。
記述は、それぞれのディレクトリについて行います。

volumes:
  drupal-vol-modules:
    driver_opts:
      type: none
      device: $PWD/data/html/modules
      o: bind
  drupal-vol-profiles:
    driver_opts:
      type: none
      device: $PWD/data/html/profiles
      o: bind
  drupal-vol-themes:
    driver_opts:
      type: none
      device: $PWD/data/html/themes
      o: bind
  drupal-vol-sites:
    driver_opts:
      type: none
      device: $PWD/data/html/sites
      o: bind
  db-vol:
    driver_opts:
      type: none
      device: $PWD/data/postgres
      o: bind

DB

設定は以下になります。

services:
  db:
    image: postgres:11
    environment:
      POSTGRES_DB: $POSTGRES_DB
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD
    networks:
      drupal_net:
    volumes:
      - db-vol:/var/lib/postgresql/data
    ports:
    - 5433:5432
    restart: always

ポイントとなる部分を記述していきます。

使用するDB

DBはPostgreSQLを使用します。
公式イメージの説明どおりのタグで指定します。

services:
  db:
    image: postgres:11

空間DBにしたい場合は、imagemdillon/postgisを指定します。

services:
  db:
   image: mdillon/postgis

ユーザー名やパスワードについて

以下の値を、環境変数により指定します。

  • DB名
  • ユーザー名
  • パスワード
services:
  db:
    environment:
      POSTGRES_DB: $POSTGRES_DB
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD

またこれらの値は、直接指定するのではなく .env ファイルを作成し、そこから指定するようにします。
.env ファイルの記述は以下のようにしました。

# .env
POSTGRES_DB=drupal_db
POSTGRES_USER=docker
POSTGRES_PASSWORD=pass

まとめると、以下のように接続されます。

docker-composeでの記述.envでの記述
POSTGRESDB: $POSTGRESDBPOSTGRESDB=drupaldb
POSTGRESUSER: $POSTGRESUSERPOSTGRES_USER=docker
POSTGRESPASSWORD: $POSTGRESPASSWORDPOSTGRES_PASSWORD=pass

ファイル構成はこのようになってます。

├── .env
├── data
│   ├── html
│   │   ├── modules
│   │   ├── profiles
│   │   ├── sites
│   │   └── themes
│   └── postgres
├── docker-compose.yml
└── setup.sh

ポートについて

ポートは、コンテナ内部ではデフォルトの5432を、外部へは5433で公開しています。
自分の環境では、既にローカルでPostgresがデフォルトポートで動作しているためです。 Postico等からDBを参照するときに、5433を使います。

services:
  db:
    ports:
    - 5433:5432

ネットワークについて

drupal_net に参加します。

services:
  db:
    networks:
      drupal_net:

ボリュームについて

コンテナ内のdataが保存されているパスとローカルのパスを結びつけます。

services:
  db:
    volumes:
      - db-vol:/var/lib/postgresql/data

Drupal

設定は以下になります。

services:
  drupal:
    image: drupal:latest
    networks:
      drupal_net:
    volumes:
    - drupal-vol-modules:/var/www/html/modules
    - drupal-vol-profiles:/var/www/html/profiles
    - drupal-vol-themes:/var/www/html/themes
    - drupal-vol-sites:/var/www/html/sites
    ports:
    - 8080:80
    depends_on:
    - db
    restart: always

ポートについて

オフィシャルのイメージには、Webサーバーも含まれています。
コンテナが起動すると、ブラウザでアクセス可能になります。
ホストからはポート8080でアクセスするようにします。

services:
  drupal:
    ports:
    - 8080:80

ネットワークについて

drupal_net に参加します。

services:
  drupal:
    networks:
      drupal_net:

ボリュームについて

コンテナ内でサイト構築に必要なパスを、それぞれローカルのパスを結びつけます。

services:
  drupal:
    volumes:
    - drupal-vol-modules:/var/www/html/modules
    - drupal-vol-profiles:/var/www/html/profiles
    - drupal-vol-themes:/var/www/html/themes
    - drupal-vol-sites:/var/www/html/sites

依存の記述について

dbの起動完了を待ってからdrupalを立ち上げるようにします。

services:
  drupal:
    depends_on:
    - db

全体

全体的には以下のようになります。

version: '3.7'
services:
drupal:
image: drupal:latest
networks:
drupal_net:
volumes:
- drupal-vol-modules:/var/www/html/modules
- drupal-vol-profiles:/var/www/html/profiles
- drupal-vol-themes:/var/www/html/themes
- drupal-vol-sites:/var/www/html/sites
ports:
- 8080:80
depends_on:
- db
restart: always
db:
image: postgres:11
environment:
POSTGRES_DB: $POSTGRES_DB
POSTGRES_USER: $POSTGRES_USER
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
networks:
drupal_net:
volumes:
- db-vol:/var/lib/postgresql/data
ports:
- 5433:5432
restart: always
networks:
drupal_net:
driver: bridge
volumes:
drupal-vol-modules:
driver_opts:
type: none
device: $PWD/data/html/modules
o: bind
drupal-vol-profiles:
driver_opts:
type: none
device: $PWD/data/html/profiles
o: bind
drupal-vol-themes:
driver_opts:
type: none
device: $PWD/data/html/themes
o: bind
drupal-vol-sites:
driver_opts:
type: none
device: $PWD/data/html/sites
o: bind
db-vol:
driver_opts:
type: none
device: $PWD/data/postgres
o: bind

Drupalサイトの構築

サイト構築のための準備は完了しました。
これから、実際に構築していきます。
本記事では、初期設定の部分までで終わります。

ファイルの配置

どこかディレクトリを作成して、今まで作成したファイルを同一ディレクトリに配置します。
配置後は以下のようになります。

├── .env
├── docker-compose.yml
└── setup.sh

ディレクトリの作成

以下のようにスクリプトを実行しディレクトリを作成します。

$ ./setup.sh

実行後は以下のようになります。

├── .env
├── data
│   ├── html
│   │   ├── modules
│   │   ├── profiles
│   │   ├── sites
│   │   └── themes
│   └── postgres
├── docker-compose.yml
└── setup.sh

コンテナの起動

docker-compose.yml があるディレクトリから、以下のコマンドでコンテナを起動します。

$ docker-compose up

ローカルにイメージがない場合はダウンロードから始まります。
これには少々時間がかかります。

Drupal初期設定

コンテナが起動したらブラウザを立ち上げ、以下へアクセスします。

http://localhost:8080/

言語の選択

以下のように言語の選択画面が表示されます。
ここでは「日本語」を選択しました。

docker-with-drupal-step0

次の画面へ移動します。

インストールプロフィールの選択

インストールプロフィールを選択します。
ここでは、「標準」を選択しました。

docker-with-drupal-step1

次の画面へ移動します。

データベースの構成の指定

データベースの構成で必要な情報を選択します。
ここでは、「PostgresSQL」を選択します。
環境変数で指定した以下の値を入力します。

項目
データベース名drupal_db
データベースのユーザー名docker
データベースのパスワードpass

また、ホストを指定するために「高度なオプション」を押下します。

docker-with-drupal-step3

ホストの指定

ホスト名の入力が求められるので、以下を指定します。

項目
ホストdb
ポート番号5432

これは、docker-compose.yml で記述した、services の中で指定した名前(ハイライト箇所)を使用します。

version: '3.7'
services:
  :
  db:    image: postgres:11
    environment:
      POSTGRES_DB: $POSTGRES_DB
    :

docker-with-drupal-step4

次の画面へ移動します。

サイトの環境設定

以下の画面が出たら、サイトの環境設定を行って初期設定は終了です。

docker-with-drupal-step5

この先はそれぞれのサイト用の情報を入力していきます。

おわりに

DrupalとPostgresの2つの公式イメージを使用するだけで、開発環境を構築することができました。
Dockerの環境が整っていれば、本手順に従って設定ファイルを実行するだけでサイトの開発が可能になります。
開発中の他のサイトと環境が混じり合うこともないので、安心して開発を行うことができます。