背景
WebフロントエンドにNginx Proxyを使用してバックエンドのコンテンツをLet’s Encryptの無償SSL/TLS証明書によるHTTPSサービス化をDockerコンテナで簡単に作成するメモ書きです。
Dockerを使用しない過去投稿は以下です。
使用環境
- Linuxサーバー
- Docker
- Docker Compose 2.0
- 独自ドメイン名の取得
- 独自ドメイン名のDNSサーバーへのAレコードの登録
- Firewall(セキュリティグループ)設定で外部(0.0.0.0/0)からHTTP(TCP/80)とHTTPS(TCP/443)サービスポートの開放
Docker Composeインストール環境については以下のページにも記載しています。
nginx-proxyコンテナ
Webフロントエンドに配置するNginx ProxyコンテナのDocker Compose設定は公式サイトを参考にしています。
作業用ディレクトリの作成
適当なディレクトリを作成して移動します。
$ mkdir -p nginx-proxy
$ cd nginx-proxy
Docker Composeファイルの作成
Docker Composeの設定ファイル(docker-compose.yaml)を作成します。
version: '2'
services:
nginx-proxy:
image: nginxproxy/nginx-proxy
container_name: nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- conf:/etc/nginx/conf.d
- certs:/etc/nginx/certs:ro
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
environment:
DEFAULT_HOST: www.yourdomain.tld
HTTPS_METHOD: noredirect
restart: always
acme-companion:
image: nginxproxy/acme-companion
container_name: nginx-proxy-acme
volumes_from:
- nginx-proxy
volumes:
- certs:/etc/nginx/certs:rw
- acme:/etc/acme.sh
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: always
volumes:
conf:
certs:
vhost:
html:
acme:
この例ではDockerコンテナ2個(nginx-proxy,nginx-proxy-acme)の構成になります。
独自ドメイン名の指定は「DEFAULT_HOST:」の項目で設定します。
Let’s EncryptのSSL/TLS証明書の自動更新設定ではHTTP(TCP/80)サービスが使用されますので、リダイレクトしないように「HTTPS_METHOD: noredirect」項目を設定しています。
Dockerコンテナの作成と起動
docker composeコマンドでDockerコンテナの作成とサービスを起動させます。
$ docker compose up -d
初回はDockerHubから各imageがpull(ダウンロード)して来てからDockerコンテナが作成されてサービスが起動しますので、しばらく待ちます。
$ docker compose ps
NAME COMMAND SERVICE STATUS PORTS
nginx-proxy "/app/docker-entrypo…" nginx-proxy running 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, :::80->80/tcp, :::443->443/tcp
nginx-proxy-acme "/bin/bash /app/entr…" acme-companion running
Dockerコンテナが作成されてサービスが起動した事が分かります。
バックエンドコンテナ
Webフロントエンドから利用されるバックエンドのコンテンツ側のDockerコンテナを用意します。
Docker Composeの設定で必要なのは主に3項目です。
environment:
VIRTUAL_HOST: www.yourdomain.tld
VIRTUAL_PROTO: http
LETSENCRYPT_HOST: www.yourdomain.tld
LETSENCRYPT_EMAIL: user@mail
独自ドメイン名の指定は「DEFAULT_HOST:」の項目で設定します。
Let’s Encryptのドメイン名指定は「LETSENCRYPT_HOST:」の項目で設定します。
また、「LETSENCRYPT_EMAIL:」に連絡先のメールも記載します。
networks:
default:
external:
name: nginx-proxy_default
Nginx Proxyコンテナ側とDocker Networkを経由して共有設定します。
コンテンツ側のDockerコンテナを起動します。
$ docker compose up -d
動作確認
Webブラウザでコンテンツが表示されるか確認します。
また、以下のコマンドでLet’s EncryptのSSL/TLS証明書の確認が出来ます。
$ docker exec nginx-proxy-acme /app/cert_status
Let’s EncryptのSSL/TLS証明書の更新確認も出来ます。
$ docker exec nginx-proxy-acme /app/force_renew
Let’s Encryptの証明書自動更新
特に設定する事なく証明書は自動更新されるようにDockerコンテナが作成されています。証明書は1時間毎に検証されて60日以内で更新されるとの事です。