ローカルにdockerを使ってHTTPS環境を立ち上げるスニペット

最終更新日

アイキャッチ

皆さん良いWEBライフ送れていますか?
今回はいつも困るローカルでのSSL環境構築です。

内容を見ていただけたらわかりますが、基本mkcertに頼りっぱなしになっています。一度mkcertで設定してしまえば、opensslコマンドで証明書を作る際に面倒なオレオレ認証局署名やSSL証明書自体のインストールの手間が省けるので、今の所採用しています。

目次

  1. コード全貌
    1. ファイル構成
    2. docker-compose.yml
    3. ssl.conf
  2. 手順
  3. 解説
    1. docker-compose.yml
    2. ssl.conf
  4. まとめ

1. コード全般

1-1. ファイル構成

project-root:
    - docker-compose.yml
    docker:
        - ssl.conf
        ssl:
            - example.com-key.pem
            - example.com.pem
    public:
        - index.html

1-2. docker-compose.yml

version: '3'
services:
  web:
    image: nginx:latest
    container_name: 'ssl_web'
    ports:
      - '4430:443'
    volumes:
      - ./docker/ssl:/etc/nginx/ssl
      - ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
      - ./public:/var/www/html

1-3 ssl.conf

server {
  listen              443 ssl;
  server_name         localhost;
  root                /var/www/html;
  index               index.html;
  ssl_certificate     /etc/nginx/ssl/example.com.pem;     # SSL証明書
  ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵
}

※ 証明書のファイル名は適宜変更してください

2. 手順

brew install mkcert
mkcert -install
cd project-root/docker/ssl
# ここで証明書ファイルを作っています。
mkcert example.com
cd ../../
docker-compose up -d

アクセス方法

  • PCの場合: https://127.0.0.1:4330
  • スマホの場合: https://{ifconfigなどで表示されたローカルIP}:4330

※ localhostだとdockerがうまく解釈できないのでIP指定にしています。

3. 解説

3-1. docker-compose.yml

image: nginx:latest

confがnginxのフォーマットなのでnginxにしていますが、confさえWEBサーバーにあったものを書ければapacheでも動くと思います。

ports:
  - '4430:443'

自分でも理解しきれていませんがハマったポイントです。
443:443といったlocalhostの443ポートをdockerの443ポートに繋げる記述でも動くと思っていましたが、4430:443とlocalhost側のポートは通常のSSLポートと変えてあげる必要があるようです。

volumes:
  - ./docker/ssl:/etc/nginx/ssl
  - ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
  - ./public:/var/www/html

ローカルのディレクトリ、ファイルをdockerにマウントしています。

- ./docker/ssl:/etc/nginx/ssl

sslディレクトリに関しては証明書ファイルをマウントしているだけです。

- ./docker/ssl.conf:/etc/nginx/conf.d/default.conf

ssl.confはnginxイメージのデフォルトの設定ファイルを上書きする設定にしています。default.confを指定して上書きしないとややこしかったのでこうしています。

- ./public:/var/www/html

publicディレクトリ以下のhtmlファイルなどをnginxのドキュメントルート以下にマウントしています。
nginxのデフォルトルートのままだと、index.htmlがすでに存在していてシンプルにマウント出来なかったので、あえて別ディレクトリをドキュメントルートに設定しています。

3-2. ssl.conf

ssl_certificate     /etc/nginx/ssl/example.com.pem;     # SSL証明書
ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵

特に解説することもないですが、上記でdockerにマウントした証明書や鍵を読み込んでいます。

4. まとめ

mkcertを使うことでとても簡易にSSL環境が構築できると思います。
dockerで出来るというのも環境を汚さなくて良いですね。

良いWEBライフを!

stmon19

遊びが一番 人生遊び 好きにまみれてます