Edited at

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


はじめに

Dockerの説明は割愛します。

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

同一サーバー上に二つのDockerコンテナー

dockerA dockerB にそれぞれ a.com / b.com というドメインを割り当てることを前提として話を進めます。


 使うもの

・Docker - 当たり前

・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 にあります