SSL/TLS対応NginxリバースプロキシDockerコンテナ

# 背景
WebフロントエンドにNginx Proxyを使用してバックエンドのコンテンツをLet’s Encryptの無償SSL/TLS証明書によるHTTPSサービス化をDockerコンテナで簡単に作成するメモ書きです。
Dockerを使用しない過去投稿は以下です。
- [SSL/TLS証明書を無償で取得し設定する](https://qiita.com/ohhara_shiojiri/items/1bc3c3f768c0acd3e26b)

# 使用環境
- Linuxサーバー
- Docker
- Docker Compose 2.0
- 独自ドメイン名の取得
- 独自ドメイン名のDNSサーバーへのAレコードの登録
- Firewall(セキュリティグループ)設定で外部(0.0.0.0/0)からHTTP(TCP/80)とHTTPS(TCP/443)サービスポートの開放

Docker Composeインストール環境については以下のページにも記載しています。

- [Linuxサーバー環境のDockerインストールメモ](https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e)

# nginx-proxyコンテナ

- [nginx-proxy/acme-companion · GitHub ](https://github.com/nginx-proxy/acme-companion/blob/main/docs/Docker-Compose.md)

Webフロントエンドに配置するNginx ProxyコンテナのDocker Compose設定は公式サイトを参考にしています。

## 作業用ディレクトリの作成

適当なディレクトリを作成して移動します。

```
$ mkdir -p nginx-proxy
$ cd nginx-proxy
```

## Docker Composeファイルの作成

Docker Composeの設定ファイル(docker-compose.yaml)を作成します。

```:nginx-proxy/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項目です。

```:docker-compose.yaml
    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:」に連絡先のメールも記載します。

```:docker-compose.yaml
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日以内で更新されるとの事です。