Server

[docker-compose] 複数の「docker-compose.yml」に対して、それぞれのサブドメインとSSLを設定する

以前に「docker-compose」でバーチャルホストを設定して稼働する方法を紹介しました。

上記から同様にサブドメインのコンテナも立ち上げる事が出来ます。
ただ1つの「docker-compose.yml」で複数のサブドメインを設定すると管理が乱雑になります。
そこで今回は複数の「docker-compose.yml」に対して、それぞれのサブドメインとSSL(Let’s Encrypt)を設定する方法を紹介します。
基本的にはdockerのネットワークを作成して、それを共有する事で複数の「docker-compose.yml」を使う事が出来ます。

構成図

以下のようにネットワーク用の「docker-compose.yml」を作成して、それぞれのサブドメイン用の「docker-compose.yml」を作成します。
今回サブドメインに「sub1.example.com」と「sub2.example.com」を設定します。

1. ディレクトリ構成

ディレクトリ構成は以下のようになります。
※今回は最低限のwebサーバーだけしており、詳細な設定とファイルを省略しております。

/
├── docker-compose.yml  # ネットワーク用のファイル
├── sub1.example.com/ # サブドメイン1のフォルダ
│   └── docker-compose.yml
├── sub2.example.com/ # サブドメイン2のフォルダ
    └── docker-compose.yml

2. dockerネットワークの作成

まずはネットワークを作成します。

docker network create app-net

3. ネットワーク用の「docker-compose.yml」を作成

ネットワーク用の「docker-compose.yml」は以下のようになります。
サブドメインの設定とSSL証明書を含めたコンテナの構成となります。
特に「networks」に「external: true」を設定してネットワークを共有する必要があります。

version: "3.8"

services:
  # NginxProxy
  nginx-proxy:
    image: jwilder/nginx-proxy:latest
    container_name: nginx-proxy
    privileged: true
    ports:
      - "80:80"
      - "443:443"
    environment:
      - DEFAULT_HOST=example.com
    volumes:
      - proxy:/etc/nginx/vhost.d
      - proxy:/usr/share/nginx/html
      - ./nginx-proxy/conf.d/custom_proxy_settings.conf:/etc/nginx/conf.d/custom_proxy_settings.conf
      - ./nginx-proxy/logs:/var/log/nginx
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
    restart: always
    networks:
      - app-net
      - default
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: ""

  # Let's Encrypt
  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt
    restart: always
    depends_on:
      - nginx-proxy
    volumes:
      - proxy:/etc/nginx/vhost.d
      - proxy:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
    networks:
      - app-net
      - default

# 共有ネットワーク
networks:
  app-net:
    external: true

volumes:
  proxy:

4. サブドメイン1の「docker-compose.yml」を作成

サブドメイン1の「docker-compose.yml」は以下のようになります。

version: "3.8"

services:
  # Web
  web_server_1:
    image: nginx:latest
    container_name: web_server_1
    hostname: nginx
    expose:
      - 80
      - 443
    environment:
      - VIRTUAL_HOST=sub1.example.com
      - VIRTUAL_PORT=80
      - LETSENCRYPT_HOST=sub1.example.com
      - LETSENCRYPT_EMAIL=info@example.com
    networks:
      - app-net
      - default

# 共有ネットワーク
networks:
  app-net:
    external: true

5. サブドメイン2の「docker-compose.yml」を作成

サブドメイン1の「docker-compose.yml」は以下のようになります。
基本的にはサブドメイン1と同じですが、サブドメイン2の設定をするようになります。

version: "3.8"

services:
  # Web
  web_server_2:
    image: nginx:latest
    container_name: web_server_2
    hostname: nginx
    expose:
      - 80
      - 443
    environment:
      - VIRTUAL_HOST=sub2.example.com
      - VIRTUAL_PORT=80
      - LETSENCRYPT_HOST=sub2.example.com
      - LETSENCRYPT_EMAIL=info@example.com
    networks:
      - app-net
      - default

# 共有ネットワーク
networks:
  app-net:
    external: true

6. docker起動

それぞれの「docker-compose.yml」を起動します。

docker-compose docker-compose.yml up -d
docker-compose sub1.example.com/docker-compose.yml up -d
docker-compose sub2.example.com/docker-compose.yml up -d

これでそれぞれのサブドメインのwebサーバーにSSLでアクセスする事が出来ます。

https://sub1.example.com
https://sub2.example.com

今回は最低限の設定となりますが、これを応用して複数のサブドメインを設定する事が出来ます。
1つの「docker-compose.yml」で複数のサブドメインを設定するよりも、管理がしやすくなりますので、是非試してみてください。