ローカル環境を Docker で構築してみた

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 をインストールして利用できますので、興味を持たれた方はぜひお試しください。