Craft CMS 向けのローカル環境を Apple Silicon 対応の Technical Preview 版 Docker Desktop で動くようにしてみた

これは Craft CMS Advent Calendar 2020 25日目の記事です。

去る12月16日に Apple Silicon 搭載の Mac に対応した Tech Preview of Docker Desktop for M1 が公開されました。正直「来年、少しでも早い時期にβ版が出ればいいな」くらいに思っていたので、嬉しい誤算です。

Download and Try the Tech Preview of Docker Desktop for M1 - Docker Blog
https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/

早速試してみたところ、自分の使用範囲では問題なさそう。。。
ということで、利用にあたって必要となる設定ファイルのカスタマイズ方法について、備忘録を兼ねてまとめてみます。

はじめに

前提として、過去記事「ローカル環境を Docker で構築してみた」の手順で Craft CMS 向けのローカル環境がすでに用意されているものとします。基本的にはコンテナのベースとなるイメージを切り替えるだけですので、そこを読み替えていただけばご自身の環境でも同様に調整できると思います。

なお、Docker Desktop for M1 はテクニカルプレビュー版です。
ここで紹介する内容の如何を問わず、実際に試される場合はすべて自己責任で行ってください。

特にマウントするボリュームなどは、事前にバックアップしておくことを強くオススメします。(試行錯誤中に何度か壊したので... w)

リバースプロキシの調整

はじめに Nginx のリバースプロキシに関する設定を見直します。

ファイルの準備

ベースにしている Nginx のリバースプロキシで最低限必要なファイル構成は、次の通りです。(※コンテナ起動後に自動生成される証明書などのファイルを除いています。)

webproxy
├── .env
├── data/
│   └── conf.d/
│       ├── realip.conf
│       ├── servertokens.conf
│       └── uploadsize.conf
├── docker-compose.yml
└── nginx.tmpl

このプロジェクト直下に arm64-webproxy ディレクトリを作成し、上記のファイルやディレクトリをすべてコピーします。

webproxy
├── .env
├── arm64-webproxy/
│   ├── .env
│   ├── data/
│   │   └── conf.d/
│   │       ├── realip.conf
│   │       ├── servertokens.conf
│   │       └── uploadsize.conf
│   ├── docker-compose.yml
│   └── nginx.tmpl
├── data/
│   └── conf.d/
│       ├── realip.conf
│       ├── servertokens.conf
│       └── uploadsize.conf
├── docker-compose.yml
└── nginx.tmpl

コピー後はこのようなファイル構成になります。

docker-compose.yml の修正

次に arm64-webproxy/docker-compose.yml を2箇所修正します。

変更前変更後
image: nginx:stable-alpineimage: arm64v8/nginx
image: jwilder/docker-genimage: intrepidde/arm64-docker-gen

いずれも ARM 64ビットアーキテクチャ向けのイメージに切り替える形です。

コンテナの起動

M1 Mac でコンテナを起動するときだけ arm64-webproxy ディレクトリへ移動後にコマンドを実行します。

$ cd arm64-webproxy
$ docker-composer up -d --build

これで Intel Mac / M1 Mac のどちらからでも、起動できるようになりました。

Craft 3 向け LAMP 環境の調整

ファイルの準備

arm64-craft3 ディレクトリを用意し、.envdocker/apache/Dockerfiledocker-compose.yml をコピーします。ベースにしているリポジトリに必要なデータをコミットしてありますので、そちらも参考にしてください。

Docker 関連のファイルを抜き出すと、以下のような構成になります。

craft3docker
├── .env
├── arm64-craft3/
│   ├── .env
│   ├── docker/
│   │   └── apache/
│   │       └── Dockerfile
│   └── docker-compose.yml
├── docker/
│   ├── apache/
│   │   └── Dockerfile
│   └── config/
│       ├── 000-default.conf
│       ├── my.cnf
│       └── php.ini
└── docker-compose.yml

.env の修正

次に arm64-craft3/.env を2箇所修正します。

変更前変更後
DB_PATH=./dbDB_PATH=./../db
APACHE_BASE_PATH=./htdocsAPACHE_BASE_PATH=./../htdocs

これは既存のマウントボリュームを共用するための調整です。Intel Mac / M1 Mac それぞれで DB を独立させたければ、元のパスのままでも問題ありません。

Dockerfile の修正

arm64-craft3/docker/apache/Dockerfile では、先頭行に記述しているイメージを変更します。

変更前変更後
FROM php:7.4-apacheFROM arm64v8/php:7.4-apache

別なイメージを利用する際も、オフィシャルイメージである arm64v8 から探すとよさそうです。

docker-compose.yml の修正

最後に arm64-craft3/docker-compose.yml を4箇所修正します。

変更前変更後
image: mysql:5.7image: biarms/mysql:5.7
- ./docker/config/my.cnf:/etc/mysql/mysql.conf.d/my.cnf:cached- ./../docker/config/my.cnf:/etc/mysql/mysql.conf.d/my.cnf:cached
- ./docker/config/php.ini:/usr/local/etc/php/conf.d/user-php.ini:cached- ./../docker/config/php.ini:/usr/local/etc/php/conf.d/user-php.ini:cached
- ./docker/config/000-default.conf:/etc/apache2/sites-available/000-default.conf:cached- ./../docker/config/000-default.conf:/etc/apache2/sites-available/000-default.conf:cached

複雑そうに見えますが、2行目以降は my.cnf をはじめとする設定ファイルを共用するため、それぞれのパスを ./docker/config/ から ./../docker/config/ に変更してるだけです。

なお、MySQL は従来の公式イメージをエミュレーションで使うこともできます。

Docker Hub:MySQL 5.7

Docker Hub で利用したいイメージの詳細ページに移動後、DIGEST: に続く文字列をコピーし

image: mysql@sha256:360d1924d86cbf416f2c84687c2037e153080fed932798a73c5c6b4ceb7399e9

の形で指定します。

コンテナの起動

ここでも、M1 Mac のときだけ arm64-craft3 ディレクトリに移動してからコンテナを起動します。

$ cd arm64-craft3
$ docker-composer up -d --build

あとはブラウザで https://craft3.docker/admin にアクセスして、問題なく管理画面が操作できることを確認できれば完了です。

やってみて

まだしばらく先かな・・・と思っていた M1 Mac の Docker 環境ですが、Tech Preview ながらも安定して動いているため、自分の使い方なら実務レベルでも問題なさそうだと考えています。既存設定を少し調整するだけで対応できるのも、便利ですね。

あとは本当に問題ないか確かめるためにも、M1 MacBook Air 片手に出張行きたいなと(ただの願望 w