🔗

Docker Composeでhttpsアクセス(Mac)

2021/11/21に公開

Dockerでhttps通信をする方法です。
要点はホスト環境で証明書を作ってコンテナにコピーすることです。

前提

  • httpのコンテナだけを構築していて、phpのみインストールされている状態です。
  • httpコンテナは「Dockerfile」を使ってビルドしています。
  • htmlファイルはホスト環境にあるものをマウントして永続化しています。

具体的には以下のファイル構成/内容です。
最低限ではありませんが、それに近い内容です。
ここからhttps通信もできるようにしていきます。
Mac版での方法ですが、Windows/Linuxでも証明書を作ってコンテナにコピーは変わらないと思います。

# ファイル構成

├── docker-compose.yml
└── web
    └── Dockerfile
# .env
# ※今回このファイルはなくても動きますが、設置して最低限「COMPOSE_PROJECT_NAME」を設定しておくことをオススメします。

COMPOSE_PROJECT_NAME=sample
APP_NAME=
APP_ENV=local
APP_DEBUG=true
APP_URL=http://docker.

LOG_CHANNEL=stack
LOG_LEVEL=debug
# docker-compose.yml
version: '3'

services:
  web:
    container_name: sample_web
    build: ./web
    ports:
      - '80:80'
    volumes:
      - ../html:/var/www/html
    hostname: localhost

networks:
  br0:
    driver: bridge
# web/Dockerfile
FROM php:7.4-apache

RUN apt-get update && apt-get install -y

手順

ホスト環境にmkcertパッケージツールをインストール

mkcertは開発環境にhttps通信に必要な証明書を作ることができるコマンドラインツールです。
mkcertはHomebrewを使ってインストールします。
Homebrewをインストールしていない場合はあらかじめインストールしておきます。
(今回はHomebrewのインストールは省略します。)

Homebrewを使ったmkcertのインストール方法は以下です。

brew install mkcert
brew install nss # Firefoxを使う場合

ローカル認証局(CA)をインストール

mkcert -install

ホスト環境に証明書と鍵を作成

コンテナにコピーするための証明書と鍵をホスト環境で作成します。
「mkcert localhost」というコマンドを実行するとカレントディレクトリに証明書ファイルが作成されます。
場所はどこでもいいですが、今回はDockerfileと同じディレクトリに設置します。

cd web
mkcert localhost

これでwebディレクトリに「localhost.pem」「localhost-key.pem」というファイルが作成され、以下のファイル構成になります。

# ファイル構成

├── docker-compose.yml
└── web
    ├── Dockerfile
    ├── localhost-key.pem
    └── localhost.pem

docker-compose.yml、web/Dockerfileに追記して設定

https通信をするので、ポートを新たに開ける必要があります。
docker-compose.ymlに追記します。
webコンテナのポート指定としてhttps用のポート(443)を指定します。

# docker-compose.yml
version: '3'

services:
  web:
    container_name: sample_web
    build: ./web
    ports:
      - '80:80'
      - '443:443' # 追記
    volumes:
      - ../html:/var/www/html
    hostname: localhost

networks:
  br0:
    driver: bridge

web/Dockerfileには

  • 先ほど作成した証明書ファイルをコンテナにコピー
  • https通信の有効化
    を追記します。
# web/Dockerfile
FROM php:7.4-apache

RUN apt-get update && apt-get install -y

# 証明書ファイルをコンテナにコピー
COPY ./localhost.pem /etc/ssl/certs/ssl-cert-snakeoil.pem
COPY ./localhost-key.pem /etc/ssl/private/ssl-cert-snakeoil.key
# https通信の有効化
RUN a2enmod ssl && a2ensite default-ssl

あとはビルドし直してコンテナを立ち上げれば、「https://localhost」でhttpsアクセスが可能です。

docker compose build --no-cache
docker compose up --detach

Discussion