VPSのサムネイル

VPS

Dockerでnginx-proxyを使いこなす!複数コンテナの管理&無料SSL化

Docker環境で複数のWebサービスを簡単に運用!nginx-proxyでリバースプロキシを構築し、独自ドメイン&無料SSLを適用する方法を詳しく解説。

編集ノート:SERVERSUSでは、パートナーリンクからコミッションを得ています。コミッションが記事の意見や、サービスの評価に影響を与えることはありません。

複数ドメインで異なるアプリを公開する際に便利なのがDockerのnginxproxyコンテナ

Dockerは簡単にWebサーバーやOSSアプリケーションを公開することができますが、独自ドメインやサブドメインでOSSアプリなどを公開するとなると、フロントのプロキシサーバーが必要になります。また、SSL化が必須になるため、SSLの取得・管理も必要です。

これらを手動で行うと非常に手間ですが、Dockerでは「nginx-proxy」と「acme-companion」という二つのコンテナを用意することで、簡単にDocker環境で独自ドメイン&SSLを運用できるようになります。

nginxproxy/nginx-proxy

nginxproxy/acme-companion

nginx-proxy & acme-companion環境の構築

まずは、nginx-proxyとacme-companionの環境を構築します。

docker composeでコンテナ群として構築するのが一番速いで、管理も楽です。

# docker-compose.yml

version: '3'
services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs:ro
      - ./htpasswd:/etc/nginx/htpasswd
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - common_network

  acme-companion:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    environment:
      - [email protected]
      - NGINX_PROXY_CONTAINER=nginx-proxy
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs:rw
      - acme:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - common_network

volumes:
  conf:
  vhost:
  html:
  certs:
  acme:

networks:
  common_network:
    external: true

このコンテナ群では、「common_network」という共通ネットワークを利用するので、common_networkを作成しましょう。

docker network create common_network

あとは、docker-compose.ymlがあるディレクトリで、コンテナを立ち上げます。

docker compose up -d

無事立ち上がればOKです。

他のコンテナで独自ドメイン & SSLを設定する

次に、他のコンテナと連携させます。

まず、連携させたいコンテナを「common_network」ネットワークに参加させます。既存コンテナの場合は、次のコマンドで追加ができます。

# コマンドで実行する場合
docker network connect common_network <コンテナ名またはコンテナID>
# docker-compose.ymlに追記する場合

networks:
  common_network:
    external: true

コンテナが接続可能になったら、ドメイン情報などを追加します。SSL取得はacme-companionコンテナが行いますが、連携させるコンテナに環境変数を設定しておけば、acme-companionコンテナが自動で諸々の設定をしてくれるので、非常に便利です。

# docker-copmose.ymlの場合

services:
  database:
    environment:
        VIRTUAL_HOST: www.example.com
        VIRTUAL_PORT: 8055
        LETSENCRYPT_HOST: www.example.com
        LETSENCRYPT_EMAIL: [email protected]

必要なのは、

  1. VIRTUAL_HOST
  2. VIRTUAL_PORT
  3. LETSENCRYPT_HOST
  4. LETSENCRYPT_EMAIL

です。これらをenvironmentに書いておけば、acme-companionコンテナがDocker APIからコンテナの起動や削除を感知して、自動でSSLの取得や更新をし、nginx-proxyコンテナがルーティングを行ってくれます。

DNSでDockerを環境があるVPSなり、クラウドなりに向けてAレコードを追加しておけば、コンテナを立ち上げた時点で全て自動で設定してくれるはずです。

nginx-proxy & acme-companion環境を使う際の注意点

nginx-proxy & acme-companion環境は非常に便利ですが、注意点もあります。

  1. 先にnginx-proxy & acme-companionが立ち上げておく
  2. 独自ドメインを使う場合は、先にDNSでAレコードを向けておく
  3. nginx-proxy & acme-companionに問題があると、連携コンテナ全体が不通になる
  4. 短時間でコンテナの作成&削除を繰り返すと、SSL取得の上限に引っかかる

以上の4点は、実際に使っていると直面しやすいトラブルなので、予め理解しておきましょう。


価格は記載がある場合を除き、すべて税込みです。

関連キーワード

VPSの新着記事

VPSの新着ガイド

もっと見る