2ヶ月くらい前から、ローカル環境を Docker に移行しはじめました。
「MAMP PRO 5 で Craft 2 の動作環境を満たせなかったから」という、なんとも後ろ向きな理由がキッカケではありましたが、既存のローカル環境はもちろん新しい環境も簡単に用意できるようになり、結果的に効率化へと繋がりました。
macOS Mojave リリース後、クリーンインストールして環境を作り直そうと考えているため、備忘録を兼ねてまとめてみます。
Docker のインストール
はじめに、公式で配布させている Docker CE for Mac
をダウンロードして、Docker 本体をインストールします。
Docker Community Edition for Mac - Docker Store
https://store.docker.com/editions/community/docker-ce-desktop-mac
Homebrew Cask の場合は、ターミナル上で次のコマンドを実行します。
$ brew cask install docker
インストールが完了したら、アプリを起動しておきます。
リバースプロキシの準備
Nginx のリバースプロキシは、こちらを利用します。
evertramos/docker-compose-letsencrypt-nginx-proxy-companion: Automated docker nginx proxy integrated with letsencrypt.
https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion
リポジトリの複製
任意の場所にリポジトリを複製し、フォルダ名を webproxy
にリネームします。
$ mkdir ~/DockerEnv
$ cd ~/DockerEnv
$ git clone https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion.git
$ mv docker-compose-letsencrypt-nginx-proxy-companion webproxy
.env ファイルの準備
先の webproxy
フォルダに含まれる .env.sample
を .env
にリネームし、テキストエディタで編集します。
# それぞれのコンテナ名
NGINX_WEB=nginx-web
DOCKER_GEN=nginx-gen
LETS_ENCRYPT=nginx-letsencrypt
# IP アドレス
IP=127.0.0.1
# ネットワーク名
NETWORK=webproxy
# Nginx 関連のファイルの保存先
NGINX_FILES_PATH=./nginx/data
これは最低限必要な項目ですので、あとはお好みで。
ネットワークの作成
.env
で指定したネットワークを作成します。
$ docker network create webproxy
コンテナの起動
$ docker-compose up -d --build
初回のみ --build
を付けて、コンテナの生成も行います。
自己署名証明書の準備
環境依存かもしれませんが、macOS Serria 環境で Let's Encrypt の証明書の生成が動作しなかったため、代わりにローカル環境で共通利用する自己署名証明書を利用します。
秘密キーを作成
はじめに、秘密キー(.key)を作成します。以降、ファイル名の default
部分は任意の文字列です。
$ openssl genrsa -out default.key 2048 -sha256
証明書署名要求ファイルを作成
秘密キー(.key)から、証明書署名要求ファイル(.csr)を作成します。{都道府県}
などは、適宜書き換えてください。
$ openssl req -new -key default.key -sha256 -out default.csr -subj "/C=JP/ST={都道府県}/O={会社名}/CN={コモンネーム}/emailAddress={メールアドレス}"
サーバ証明書を作成
秘密キー(.key)で証明書署名要求ファイル(.csr)に署名して、サーバ証明書(.crt)を作成します。
$ openssl x509 -in default.csr -days 3650 -req -signkey default.key -sha256 -out default.crt
あくまでローカル環境向けということで、-days 3650
で有効期限を作成日から10年間としています。
所定の場所に配置
作成した秘密キー(.key)とサーバ証明書(.crt)を ~/DockerEnv/webproxy/nginx/data/certs/
内に配置します。
プロジェクトごとのローカル環境を構築
ここまでで準備は整いましたので、プロジェクトごとの環境を用意します。
Docker Compose のひな形を3つ公開していますので、目的に叶うようだったらご利用ください。
dreamseeker/docker-craft3-letsencrypt: Docker で Craft 3 向け LAMP 環境を構築
https://github.com/dreamseeker/docker-craft3-letsencrypt
dreamseeker/docker-movabletype-letsencrypt: Docker で Movable Type 7 向け LAMP 環境を構築
https://github.com/dreamseeker/docker-movabletype-letsencrypt
dreamseeker/docker-craft2-letsencrypt: Docker で Craft CMS 向け LAMP 環境を構築
https://github.com/dreamseeker/docker-craft2-letsencrypt
なお、ここでは Craft 3 向けの LAMP 環境構築を例に、流れを見ていきます。
リポジトリの複製
任意の場所にリポジトリを複製し、フォルダ名を craft3docker
にリネームします。
$ cd ~/DockerEnv
$ git clone [email protected]:dreamseeker/docker-craft3-letsencrypt.git
$ mv docker-craft3-letsencrypt craft3docker
.env ファイルの準備
先の craft3docker
フォルダに含まれる .env.sample
を .env
にリネームし、テキストエディタで編集します。
# プロキシ環境で設定したネットワーク名
NETWORK=webproxy
# コンテナの基本名
CONTAINER_BASE_NAME=web
# データベース関連ファイルの保存先
DB_PATH=./db
# データベースのルートパスワード
MYSQL_ROOT_PASSWORD=root_password
# データベース名
MYSQL_DATABASE=database_name
# データベースのユーザー名
MYSQL_USER=user_name
# データベースのパスワード
MYSQL_PASSWORD=user_password
# ホストのデータベースポート
HOST_MYSQL_PORT=3306
# Web サーバのベースパス(/var/www/html と同期)
APACHE_BASE_PATH=./htdocs
# ドメイン名(複数の場合はカンマ区切り)
DOMAINS=domain.com
# Let's Encrypt のメールアドレス
[email protected]
# 自己署名証明書のファイル名(拡張子を除いたもの)
CERT_NAME=default
# HTTP でアクセスした場合のリダイレクト方法
HTTPS_METHOD=noredirect
いくつか個別に解説します。
# コンテナの基本名
CONTAINER_BASE_NAME=craft3
CONTAINER_BASE_NAME
を利用して生成されるコンテナ名が決まります。この例では、Web サーバが craft3-apache
、DB サーバが craft3-db
となります。重複しないようプロジェクトごとに変更してください。
# データベースのルートパスワード
MYSQL_ROOT_PASSWORD=root
# データベース名
MYSQL_DATABASE=craft3
# データベースのユーザー名
MYSQL_USER=root
# データベースのパスワード
MYSQL_PASSWORD=password
# ホストのデータベースポート
HOST_MYSQL_PORT=3307
これら5つの項目は、データベースに関する設定です。このうち HOST_MYSQL_PORT
のみ、プロジェクト単位で調整が必要です。
こちらの例で SQL クライアントから接続するには、下記のように設定します。
- ホスト:
127.0.0.1
- ユーザー名:
root
- パスワード:
password
- ポート:
3307
# ドメイン名(複数の場合はカンマ区切り)
DOMAINS=craft3.docker
このプロジェクトで使用するドメインを指定します。カンマ区切りで複数設定することもできます。
docker-compose.yml の修正(自己署名証明書を利用する場合)
docker-compose.yml
をテキストエディタで開き、31〜32行目付近に記載された下記のコメントアウトを解除します。
# CERT_NAME: ${CERT_NAME}
# HTTPS_METHOD: ${HTTPS_METHOD}
macOS のローカル環境で Docker でセットしたドメインに SSL 接続できない場合は、この変更後にコンテナを起動し直すと解消されると思います。
hosts ファイルの修正
macOS の /etc/hosts
に .env
ファイルの DOMAINS
で指定したドメインを加えます。
127.0.0.1 craft3.docker
Craft 3 本体の入手と初期設定
リポジトリに含まれる setup-craft3.sh
をターミナル上で実行します。
$ cd ~/DockerEnv/craft3docker
$ /bin/bash setup-craft3.sh
シェルスクリプトを実行すると、公式サイトからダウンロードした Craft 3 本体を htdocs
内に展開し、craft3docker/.env
ファイルで設定したデータベースに関する設定を htdocs/.env
ファイルに転記します。
あわせて、Web サーバのドキュメントルートを htdocs/web
に変更します。
コンテナの起動
$ docker-compose up -d --build
初回のみ --build
を付けて、コンテナの生成も行います。
Craft 3 のインストール
ブラウザで https://craft3.docker/admin
にアクセスし、インストールを行います。
具体的なインストール手順は、公式ドキュメント「インストールガイド」ページのウェブブラウザによるセットアップを参照してください。
これで、Docker を利用したローカル環境が構築できました。
やってみて
データベース関連のファイルをプロジェクト直下の db
フォルダに意図的に保存しているのですが、Dropbox の同期が終われば別端末ですぐにコンテナを起動して作業の続きができる点が、魅力ですね。
従来だと、MAMP の DB ファイルをコピーしたり、Vagrant のイメージをエクスポートしたりで時間が掛かってしまうのが面倒に感じていたので、思い切って乗り換えて良かったです。
なお、setup-craft3.sh
の実行を行わず、マニュアルで WordPress や Grav などの CMS をインストールして利用できますので、興味を持たれた方はぜひお試しください。