letsencrypt-nginx-proxy-companionを使って複数ドメイン名に無料SSL証明書を適用する


初めに

Docker Compose等で
* nginx-proxy
* letsencrypt-nginx-proxy-companion
を利用すると自作サービスのコンテナにLet’s EncryptのSSL証明書を適用して公開する事が可能。1

単一のコンテナへ以下の様な複数ドメイン名に対してSSL証明書を適用する方法を調査した。


example.com
www.example.com

結論

利用ドメイン名を指定する環境変数をカンマ区切りで記述すると適用してくれる。2

  • 自作サービス側のdocker-compose.yml例
version: '3.3'
services:
  myapp:
    image: my-app
    environment:
      VIRTUAL_HOST: example.com,www.example.com # ← カンマ区切り指定
      LETSENCRYPT_HOST: example.com,www.example.com # ← カンマ区切り指定
      LETSENCRYPT_EMAIL: [email protected]

networks:
  default:
    external:
      name: shared
  • nginx側のdocker-compose.yml例
version: "2"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
    restart: always
    networks:
      - shared

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
    volumes_from:
      - nginx-proxy
    restart: always
    networks:
      - shared

networks:
  shared:
    external: true

実行例

事前準備

上記の様にdocker-compose.ymlを分離している場合は事前にDocker networkを作成し同じネットワークを利用する様に指定しておく必要が有る。

docker network create --driver bridge shared

起動

 nginx側、自作サービスの両方を起動する

docker-compose up -d

結果

指定した保存ディレクトリ内に以下の様にドメイン名別の証明書が生成される。
どちらのドメイン名でもSSL接続可能となる。

example.com.chain.pem
example.com.crt
example.com.dhparam.pem
example.com.key

www.example.com.chain.pem
www.example.com.crt
www.example.com.dhparam.pem
www.example.com.key

  1. 前提としてDNS設定済みの独自ドメインが必要です。 

  2. 利用するドメイン名を事前に名前解決設定しておく必要有り。