macOSDDEVとColimaでDrupalの開発環境を作成する Drupal Advent Calendar 2023 11日目に向けて書いた記事です
Drupal開発の開発マシンとしてに2019年ごろ購入したIntel Macをまだ使用しています。
VM(Vagrant)でDockerを利用することでDocker Desktop for Macのファイル共有重い問題を回避していたのですが、Docker Desktop for Macの代わりにColimaを使うことでVM(Vagrant)がなくても軽量にコンテナを動作することができました。
またこれを機会にWebアプリケーション開発ツールのLandoからDDEVへ切り替えと自分が欲しいカスタマイズがどこまでできるか調べたので簡単にご紹介します。
Colimaのセットアップ
Colimaインストール
code:インストール
Colimaの起動
コマンドでColimaを起動します。
code:起動
# デフォルト cpu:2, memory:4
colima start
1つのDrupalサイトを動作させるにはデフォルトで動作しますが、複数Drupalを同時に動かしたい場合やXdebugを使用したい場合はcpuとmemoryを増やして起動します。
code:オプション起動
# 2つ以上のDrupalを同時に操作したい場合、メモリを増やします。増やさないと後勝ちでコンテナが落ちます。
colima start --memory 8
# Xdebugを使用する場合、cpuも増やした方がいいです。私のマシンだとcpu:2は動くけど激重でした。
colima start --cpu 4 --memory 8
毎回オプション付きで起動するのも面倒ですので、起動時のデフォルト値を更新すると楽です。
code:デフォルト値変更
colima start --edit
# ↑ このコマンドで ~/.colima/default/colima.yaml が編集されます
DockerのContext確認
Colimaを起動したらDockerのcontextを確認します。
code:contextの確認
murata@murata-macbook ~ % docker context ls
# contextの一覧・こんな出力です
NAME DESCRIPTION DOCKER ENDPOINT ERROR
colima * colima 省略(表が見づらいので)
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux 省略
orbstack OrbStack 省略
*がついているサービスがdockerの向き先です。defaultはDocker Desktopを示します。もしcolimaに向いてない場合は切り替えます。
code:contextをcolimaへ
murata@murata-macbook ~ % docker context use colima
//colimaに切り替え成功時の出力
colima
Current context is now "colima"
補足
Clima以外のコンテナランタイム OrbStackやRancher DesktopでもDDEVは動作しました。ちなみにOrbStackはLandoも動作します。OrbStackは個人利用であればFreeです。Landoをご利用の方はこちらに切り替えてもDocker Desktop for Macのファイル共有重い問題は解消します。
以上でColimaのセットアップは終了です。
DDEVのセットアップ
DDEVのインストール
code:DDEVインストール
# Install DDEV
brew install ddev/ddev/ddev
# Initialize mkcert
mkcert -install
Drupalの準備
DDEVはDrupalソース一式にいい感じにファイル配布や書き込みが入るので、コンテナ起動前にDrupal一式を用意します。
code:composer
# d106 というディレクトリに作成
composer create-project drupal/recommended-project d106
# 作成されたディレクトリに移動。
cd d106
以降、DDEV関連のコマンドはDrupalのルートディレクトリで実行します。
DDEVの初期設定
DDEVの初期設定コマンド ddev configを実行しひたすらenterを押します。
この設定は .ddev/confg.yaml に保存され、後で変更可能です。
code:ddevのinit
murata@murata-macbook d106 % ddev config
Creating a new DDEV project config in the current directory (/Users/murata/demo/d106)
Once completed, your configuration will be written to /Users/murata/demo/d106/.ddev/config.yaml
Project name (d106):
The docroot is the directory from which your site is served.
This is a relative path from your project root at /Users/murata/demo/d106
You may leave this value blank if your site files are in the project root
Docroot Location (web):
Found a drupal10 codebase at /Users/murata/demo/d106/web.
Project Type backdrop, craftcms, django4, drupal10, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress (drupal10): No settings.php file exists, creating one
Configuration complete. You may now run 'ddev start'.
DDEVのコンテナ起動
ddev start でコンテナを起動します。
code:コンテナ起動
ddev start
Starting d106...
Network ddev-d106_default Created
Container ddev-d106-db Created
Container ddev-d106-web Created
Container ddev-d106-web Started
Container ddev-d106-db Started
Starting Mutagen sync process... This can take some time.
.....Mutagen sync flush completed in 8s.
For details on sync status 'ddev mutagen st d106 -l'
Container ddev-router Created
Container ddev-router Started
Successfully started d106
ddev status でコンテナサービスの確認ができます。
code:サイトの確認
murata@murata-macbook d106 % ddev status
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Docker platform: colima │
│ Router: traefik │
├──────────┬──────┬─────────────────────────────────────────────────────────┬──────────────────────┤
│ SERVICE │ STAT │ URL/PORT │ INFO │
├──────────┼──────┼─────────────────────────────────────────────────────────┼──────────────────────┤
│ │ │ InDocker: web:443,80,8025 │ nginx-fpm │
│ │ │ Host: 127.0.0.1:32812,32813 │ docroot:'web' │
│ │ │ │ Mutagen enabled (ok) │
│ │ │ │ NodeJS:18 │
├──────────┼──────┼─────────────────────────────────────────────────────────┼──────────────────────┤
│ db │ OK │ InDocker: db:3306 │ mariadb:10.4 │
│ │ │ Host: 127.0.0.1:32814 │ User/Pass: 'db/db' │
│ │ │ │ or 'root/root' │
├──────────┼──────┼─────────────────────────────────────────────────────────┼──────────────────────┤
│ │ │ ddev launch -m │ │
├──────────┼──────┼─────────────────────────────────────────────────────────┼──────────────────────┤
└──────────┴──────┴─────────────────────────────────────────────────────────┴──────────────────────┘
コンテナ管理のファイルは.ddev ディレクトリに、DBなどの自動設定のため web/sites/default/settings.ddev.phpの配置とsettings.phpにsettings.ddev.phpを読み込むための記述変更 が入ります。
プロジェクト管理として何をGit管理した方が良さそうかは後述します。
ddev help でコマンド一覧を見ると一通り色々できるので見てみてください。
DDEVのカスタマイズ
ここからは個人の好みや本番環境などに合わせたカスタマイズをします。
ありがたいことにDDEVの公式ドキュメントが豊富でこちらを読んで設定するだけした。
ドキュメントを参照するだけでやりたいことはすべて実現できるような気がします。
PHPのバージョンDBを変更したい
./ddev/config.yaml の変更をして、ddev restartで反映されます。
code:config.yaml
# ddev config 実行後の初期状態。以下を変更する
name: d106
type: drupal10
docroot: web
php_version: "8.1"
webserver_type: nginx-fpm
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
database:
type: mariadb
version: "10.4"
use_dns_when_possible: true
composer_version: "2"
web_environment: []
nodejs_version: "18"
XdebugをXdebug HelperでON/OFFしたい
最初からXdebugの利用はddevのコマンドddev xdebug on / ddev xdebug offでできるのですが、全ての実行がXdebug経由になる設定になっています。できれば画面を見ながらのデバッグはブラウザのXdebug HelperでON/OFFするのが好みなのでphp.iniをカスタマイズして反映します。 参考ドキュメント
.ddev/php/xdebug.ini を作成し、php.iniで上書きしたい値を記載し、ddev restartで反映されます。
code:.ddev/php/xdebug.ini
xdebug.start_with_request=trigger
# 以下がデフォルトで指定されているので全ての実行が対象になっていた
補足
DDEVのissue一覧を見るとXdebugのこの辺りの設定変更のためのissueがいくつかあったようですが、クローズされていたり進んでいなかったりします。やはりこれは好みの問題ですよねぇと思ったので自分でphp.iniの上書きをしました。
MemcachedやRedisを利用する
Webサーバ、DB以外でも利用したいミドルウェアがある場合、アドオンで探すと大体あります。
参考ドキュメント
例えばMemcachedを追加するには以下のコマンドで追加可能です。
code:Memcachedを追加する
# アドオンの一覧
ddev get --list
# Memcachedを追加する
ddev get ddev/ddev-memcached
# 再起動
ddev restart
アドオンを追加すると何が起こるのかというとアドオン用のdocker-compose.*.yamlとアドオン用のメタデータの記録が残ります。
code:.ddevディレクトリ抜粋
./.ddev
├── addon-metadata
│ └── memcached
│ └── manifest.yaml ・・・ メタデータ:アドオンの追加記録
├── .ddev-docker-compose-full.yaml ・・・ Docker Composeのメイン定義 / 起動時にカスタマイズをマージしてここに集約される
├── docker-compose.memcached.yaml ・・・ アドオン用docker-compose.*.yaml / Memcachedのコンテナ用定義
アドオンにないサービスを利用する
アドオンにないサービスでも.ddevディレクトリにdocker-compose.*.yaml を定義すればなんでも追加できます。
参考ドキュメント
例としてオープンソースのウイルスチェックサービスClamAVを追加します。
.ddev/docker-compose.clamav.yamlを作成し、Docker Compose の定義を記述します。その後、再起動 ddev restart で完了です。
code:docker-compose.clamav.yaml
version: '3.6'
services:
clamav:
container_name: ddev-${DDEV_SITENAME}-clamav
image: clamav/clamav:latest
restart: "no"
volumes:
- source: clamav
target: /var/lib/clamav
type: volume
volume:
nocopy: true
expose:
- 3310
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
volumes:
clamav:
name: ${DDEV_SITENAME}-clamav
Docker Compseの定義を上書きして使いたい
アドオンやカスタマイズなどの経てコンテナとして起動する内容は .ddev/.ddev-docker-compose-full.yaml に集約されますが、さらにカスタマイズを加えたい時があります。
その場合は .ddev/docker-compose.override.yaml を作成し、上書きしたいところだけ記述します。その後、再起動 ddev restart で完了です。
code:docker-compose.override.yaml
## solrのアドオンでimageのバージョンだけ変えたい
services:
solr:
image: solr:9 # デフォルトは solr:8 だけど9系を使いたい、もっと細かくバージョン指定したい時に記述して上書きする。
参考ドキュメント
DDEV 設定ファイルのGit管理を考える
もし複数人で開発する時にローカル環境の設定を共有するにはいくつか方法がありますが、DDEVの定義をGitリポジトリに含めてしまうのが楽だと思います。DDEVが自動で作成・更新するファイルもあるので、必要な定義ファイルだけGitに含めます。
もともとDDEVの実行によりルートディレクトリの .gitignore に追記や .ddev ディレクトリ直下に.gitignoreがあり、Git管理してほしくないファイルはある程度明示されています。
それを踏まえてローカル環境の共有のためにGitリポジトリに含めた方が良いファイルは以下と考えます。
.ddev/config.yaml
DDEVの大元の設定ファイル
.ddev/addon-metadata ディレクトリ配下
アドオン追加・削除の記録なので共有すべきだと考えます
.ddev/docker-compose.*.yaml
アドオンやカスタマイズで追加したコンテナ定義
その他カスタマイズしたiniファイル、confファイルなど
php.ini などカスタマイズで追加したファイル
おしまいに
以上、ColimaのランタイムでDDEVを使ってDrupal環境を作成する方法でした。
私は2023年の秋以降、ローカル環境のセットアップ指定がないプロジェクトやデモ環境はこの内容で環境を用意して動作させています。
DDEVは公式ドキュメントが豊富なので何かカスタマイズしたくなったら公式ドキュメントを参照して解決したいと思います。