概要
Docker CentOS8にnginx入れてみたにSSL化を追加した拡張版になります。
mkcertを利用して、ローカルのPCに認証局を立て、そこで署名を行った証明書をSSLに利用するようになります。
また、コマンドの実行を極力無くすをモットーに、起動コマンドもシェルで作成していますので環境構築はシステムに不慣れな方でも大丈夫!
と、願っています(笑)
環境
- maxOS BigSur 11.2.3
- Docker version 20.10.6
- docker-compose version 1.29.1
- Homebrew 3.1.11
構成
.
├── docker
│ └── app
│ ├── Dockerfile
│ └── nginx
│ ├── certs
│ │ ├── localhost+1-key.pem
│ │ └── localhost+1.pem
│ └── conf.d
│ └── default.conf
├── docker-compose.yml
├── up.sh
└── web
└── index.html
手順
1. docker-compose.yml作成
version: "3.9"
services:
app:
build:
context: ./docker/app
volumes:
- ./web:/web
- ./docker/app/nginx/conf.d:/etc/nginx/conf.d
- ./docker/app/nginx/certs:/etc/nginx/certs
ports:
- "80:80"
- "443:443"
ボリューム
それぞれのボリュームは以下の用途です。
-
web
=> ウェブコンテンツ -
conf.d
=> nginxのconf -
certs
=> 証明書と秘密鍵
ポート
ssl化するために、443
ポートもマッピングするようにしています。
2. Dockerfile作成
CentOS8の公式イメージを基にして、nginxをインストールしています。
FROM centos:centos8
RUN dnf -y update && \
dnf install -y nginx
CMD ["nginx", "-g", "daemon off;"]
WORKDIR /web
3. nginxのconf設定
HTTPアクセスはHTTPSにリダイレクトさせ、HTTPSでは証明書と秘密鍵をそれぞれ読み込むようにしています。
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/certs/localhost+1.pem;
ssl_certificate_key /etc/nginx/certs/localhost+1-key.pem;
location / {
root /web;
index index.html index.htm;
}
}
4. 起動用のシェル作成
SSL化のためにmkcertを利用します。
#!/bin/sh
brew install mkcert nss
mkcert -install
mkcert -cert-file ./docker/app/nginx/certs/localhost+1.pem -key-file ./docker/app/nginx/certs/localhost+1-key.pem localhost 127.0.0.1
docker-compose up -d
5. その他
5-1. index.html
今回は、動作確認用のindex.htmlを用意します。
(nginxのデフォルトページは、混合コンテンツのため。)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テスト</title>
</head>
<body>
<p>test</p>
</body>
</html>
5-2. .gitignore
蛇足ですが、ローカル用の証明書と秘密鍵をgitにあげなくていいように設定します。
docker/app/nginx/certs/
6. 確認
6-1. 起動
sh up.sh
6-2. nginx確認
https://localhost/ にChromeでアクセスしてみましょう。
通信が保護されていたらOKです。
6-3. 停止
docker-compose down
最後に
本当はdocker内でmkcertを利用するように頑張ったのですが、どうやらローカル上で認証局を立てないとブラウザで確認する際に有効な証明書として認識してもらえず断念しました。
何かいい方法をご存知の方がいれば、ぜひアドバイスください。