LoginSignup
7

More than 1 year has passed since last update.

posted at

updated at

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

背景

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

使用環境

  • 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)を作成します。

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日以内で更新されるとの事です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7