SSL
docker
proxy
nginx-proxy
letsencrypt

Dockerで簡単にマルチドメインかつSSL証明(自動更新) nginx-proxyとLetsEncrypt

More than 1 year has passed since last update.

はじめに

Dockerの説明は割愛します。
はてなよりもQiitaにあげたほうがいい気がするのでこちらで共有させていただきます。

同一サーバー上に二つのDokcerコンテナー
dockerA dockerB にそれぞれ a.com / b.com というドメインを割り当てることを前提として話を進めます。

 使うもの

・Dokcer - 当たり前
・nginx-proxy コンテナーをプロキシしてくれる神

・letsencrypt-nginx-proxy-companion SSL証明(自動更新)してくれる神

やり方

適当なディレクトリで docker-compose.yml を作成
docker-compose.yml :基本的にはコピペでおk

nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
privileged: true
ports:
- 80:80
- 443:443
volumes:
- ./docker-compose.d/certs:/etc/nginx/certs:ro
- ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always

letsencrypt-nginx:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt-nginx
privileged: true
volumes:
- ./docker-compose.d/certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes_from:
- nginx-proxy
restart: always

はい。同じディレクトリ上で
$docker-compose up -d

これで nginx-proxy と nginx-proxy-companion をrunできました。

あとは dockerAとdockerBをrunするときに下記の3つの環境変数を設定してあげることで勝手にproxyかつSSLしてくれます。
・VIRTUAL_HOST    nginx-proxyのために必要。割り当てるドメイン名を設定する
・LETSENCRYPT_HOST letsencrypt-nginx-proxy-companionに必要。SSL証明書取得のためのドメイン名を設定する
・LETSENCRYPT_EMAIL letsencrypt-nginx-proxy-companionに必要。SSL証明書取得のためのメールアドレスを設定する

実際にコンテナーをrunしてみる

dockerAコンテナをrun
$ docker run -e VIRTUAL_HOST=a.com -e LETSENCRYPT_HOST=a.com -e LETSENCRYPT_EMAIL=アドレス [dockerAのimageID]

dockerBコンテナをrun
以下省略

簡単にマルチドメインかつSSL証明できたよ^ ^!!

なおSSL証明書は docker-composeしたディレクトリ/docker-compose.d/certs にあります