Drupalでサイトを構築する機会がありました。
Drupalでの開発環境を構築する場合、以下のものを用意する必要があります。
これらをmac上で用意しようとした場合、一般的には xampp や mamp を用いるという選択肢があります。
今回は上記は使わず、Dockerを用いて環境の構築をすることにしました。
その方法を以下に記述します。
以下の条件を前提とします。
docker
が使用可能であるdocker-compose
が使用可能であるこのようなシステムを作ります。
ポイントは以下になります。
以下の手順で作成していきます。
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." |
Docker HubにあるDrupalのOfficial Images記載の情報をもとに構築します。
drupal_net
という名前でネットワークを作成します。
これには、drupal
や db
が参加します。
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
設定は以下になります。
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はPostgreSQLを使用します。
公式イメージの説明どおりのタグで指定します。
services:
db:
image: postgres:11
空間DBにしたい場合は、image
にmdillon/postgis
を指定します。
services:
db:
image: mdillon/postgis
以下の値を、環境変数により指定します。
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: $POSTGRESDB | POSTGRESDB=drupaldb |
POSTGRESUSER: $POSTGRESUSER | POSTGRES_USER=docker |
POSTGRESPASSWORD: $POSTGRESPASSWORD | POSTGRES_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
設定は以下になります。
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 |
サイト構築のための準備は完了しました。
これから、実際に構築していきます。
本記事では、初期設定の部分までで終わります。
どこかディレクトリを作成して、今まで作成したファイルを同一ディレクトリに配置します。
配置後は以下のようになります。
├── .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
ローカルにイメージがない場合はダウンロードから始まります。
これには少々時間がかかります。
コンテナが起動したらブラウザを立ち上げ、以下へアクセスします。
以下のように言語の選択画面が表示されます。
ここでは「日本語」を選択しました。
次の画面へ移動します。
インストールプロフィールを選択します。
ここでは、「標準」を選択しました。
次の画面へ移動します。
データベースの構成で必要な情報を選択します。
ここでは、「PostgresSQL」を選択します。
環境変数で指定した以下の値を入力します。
項目 | 値 |
---|---|
データベース名 | drupal_db |
データベースのユーザー名 | docker |
データベースのパスワード | pass |
また、ホストを指定するために「高度なオプション」を押下します。
ホスト名の入力が求められるので、以下を指定します。
項目 | 値 |
---|---|
ホスト | db |
ポート番号 | 5432 |
これは、docker-compose.yml
で記述した、services
の中で指定した名前(ハイライト箇所)を使用します。
version: '3.7'
services:
:
db: image: postgres:11
environment:
POSTGRES_DB: $POSTGRES_DB
:
次の画面へ移動します。
以下の画面が出たら、サイトの環境設定を行って初期設定は終了です。
この先はそれぞれのサイト用の情報を入力していきます。
DrupalとPostgresの2つの公式イメージを使用するだけで、開発環境を構築することができました。
Dockerの環境が整っていれば、本手順に従って設定ファイルを実行するだけでサイトの開発が可能になります。
開発中の他のサイトと環境が混じり合うこともないので、安心して開発を行うことができます。