初めに
Docker Compose等で
- nginx-proxy
-
letsencrypt-nginx-proxy-companion
を利用すると自作サービスのコンテナにLet’s EncryptのSSL証明書を適用して公開する事が可能。1
単一のコンテナへ以下の様な複数ドメイン名に対してSSL証明書を適用する方法を調査した。
example.com
www.example.com
#結論
利用ドメイン名を指定する環境変数をカンマ区切りで記述すると適用してくれる。2
- 自作サービス側のdocker-compose.yml例
version: '3.3'
services:
myapp:
image: my-app
environment:
VIRTUAL_HOST: example.com,www.example.com # ← カンマ区切り指定
LETSENCRYPT_HOST: example.com,www.example.com # ← カンマ区切り指定
LETSENCRYPT_EMAIL: mail@example.com
networks:
default:
external:
name: shared
- nginx側のdocker-compose.yml例
version: "2"
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs:ro
- /etc/nginx/vhost.d
- /usr/share/nginx/html
restart: always
networks:
- shared
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./certs:/etc/nginx/certs:rw
volumes_from:
- nginx-proxy
restart: always
networks:
- shared
networks:
shared:
external: true
#実行例
##事前準備
上記の様にdocker-compose.ymlを分離している場合は事前にDocker networkを作成し同じネットワークを利用する様に指定しておく必要が有る。
docker network create --driver bridge shared
##起動
nginx側、自作サービスの両方を起動する
docker-compose up -d
##結果
指定した保存ディレクトリ内に以下の様にドメイン名別の証明書が生成される。
どちらのドメイン名でもSSL接続可能となる。
example.com.chain.pem
example.com.crt
example.com.dhparam.pem
example.com.key
www.example.com.chain.pem
www.example.com.crt
www.example.com.dhparam.pem
www.example.com.key