🔐

Docker(PHP) 開発環境の Apache を mkcert を使って https で動かす

2021/10/18に公開

戦略

  • 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