🔐
Docker(PHP) 開発環境の Apache を mkcert を使って https で動かす
戦略
- PHP のオフィシャルなイメージ をベースにする。
- オフィシャルな php:apache のイメージは、SSL が無効になっているので有効にする。
- x86, ARM の対応が面倒なので、イメージ内に mkcert をインストールせず、ホスト側にインストールし証明書を発行する。
- ホスト側で発行した証明書をマウントして Apache から読み込めるようにする。
手順
1. mkcert のインストール
mkcert Installation を参考に、mkcert をインストールし、ローカルな CA を作成する。
% brew install mkcert nss
% mkcert -install
2. 必要なディレクトリの作成
docker-php-apache-mkcert-ssl
を作業ディレクトリとして扱う。
% mkdir /path/to/docker-php-apache-mkcert-ssl && cd $_
% mkdir {certs,conf,htdocs}
3. 証明書の発行
ファイル名、出力先を指定して発行する。
% mkcert -key-file ./certs/server.key -cert-file ./certs/server.pem localhost 127.0.0.1 ::1
4. Dockerfile を書く
Dockerfile
FROM php:8.0-apache
RUN apt-get update \
&& rm -rf /var/lib/apt/lists/* \
&& a2enmod ssl \
&& a2enmod rewrite
5. docker-compose.yaml を書く
docker-compose.yaml
version: '3'
services:
php:
container_name: php_apache_ssl
build: .
image: php_apache_ssl
ports:
- 80:80
- 443:443
restart: always
volumes:
- ./htdocs:/var/www/html
- ./conf:/etc/apache2/sites-enabled
- ./certs:/etc/ssl/local/certs
6. htdocs/index.php を書く。
htdocs/index.php
<?php
phpinfo();
7. Apache の ssl 用の設定を修正する。
ssl の設定ファイルが必要なのでとりあえずコンテナを立ち上げてコピーする。
% docker-compose up -d --build
% docker cp $(docker-compose ps -q php):/etc/apache2/sites-available/default-ssl.conf ./conf/.
コピーした設定ファイルの証明書関連のパスを、マウントする証明書関連のパスに変更する。
@@ -29,8 +29,8 @@
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
- SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
- SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
+ SSLCertificateFile /etc/ssl/local/certs/server.pem
+ SSLCertificateKeyFile /etc/ssl/local/certs/server.key
# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
8. サービスを再起動してブラウザで確認
% docker-compose restart
% open https://localhost
以下が表示、確認出来れば OK 👍
9. 後片付け
コンテナとイメージを削除する。
% docker-compose down
% docker rmi php_apache_ssl
ディレクトリ構成
├── Dockerfile
├── certs
│ ├── server.key
│ └── server.pem
├── conf
│ └── default-ssl.conf
├── docker-compose.yml
└── htdocs
└── index.php
環境
% sw_vers
ProductName: macOS
ProductVersion: 11.3.1
BuildVersion: 20E241
% docker --version
Docker version 20.10.8, build 3967b7d
% docker-compose --version
Docker Compose version v2.0.0
% mkcert --version
v1.4.3
Discussion