はじめに
nginxproxy/nginx-proxyは、Docker内で複数のWebサービスをホストする際に便利な、NGINXベースのリバースプロキシイメージです。アップストリームやネットワークの設定を自動でいい感じに構成してくれます。
とても便利なイメージなので、基本的な使い方を備忘録として残しておきたいと思います。
ngixnproxy/nginx-proxyについて
ngixnproxy/nginx-proxyは、Jason Wilderさんが個人的なプロジェクトとして開発していたjwilder/nginx-proxyを引き継いで、GitHubコミュニティにより開発とメンテナンスが継続されています。このイメージは、Docker環境で簡単に複数のWebサービスをホストし、トラフィックを効果的にルーティングおよび制御することができます。
簡単な使用例
proxyコンテナとwebコンテナを定義し、example.comでwebコンテナにアクセスできるようにする例です。UbuntuにDockerをインストールし、ボリュームは作らずデフォルトのネットワーク使用を前提にしています。
services:
proxy:
image: nginxproxy/nginx-proxy:latest
container_name: proxy
restart: unless-stopped
ports:
- "80:80"
volumes:
# Dockerデーモンと通信するために、/var/run/docker.sock をマウント
- /var/run/docker.sock:/tmp/docker.sock:ro
# 仮想ホストの設定ファイルを格納するためのディレクトリをマウント
- ./vhost.d:/etc/nginx/vhost.d
networks:
- default
web:
image: nginxinc/nginx-unprivileged:latest
container_name: web
restart: unless-stopped
environment:
# VIRTUAL_HOST 環境変数でリバースプロキシの対象ホスト名を指定
# 複数のドメインを1つのバックエンドコンテナにマッピングしたい場合は「,」でつなぐ
# ex VIRTUAL_HOST=example.com,example2.com
- VIRTUAL_HOST=example.com
volumes:
- ./html:/var/www/html
networks:
- default
DockerfileLet’sEncriptを利用する簡単な使用例
proxyコンテナとwebコンテナを定義し、acme-companionコンテナを使ってSSL通信を実現する簡単な例です。Let’s Encryptを使用しない場合は、certsディレクトリに証明書を配置し、conf.dディレクトリに追加のconfigファイルを設定するだけでよさそうです。
services:
proxy:
container_name: proxy
image: nginxproxy/nginx-proxy:alpine
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./config:/etc/nginx/conf.d:rw
- ./vhost:/etc/nginx/vhost.d:rw
- ./certs:/etc/nginx/certs:ro
labels:
# acme-companionがnginx-proxyを検出するのに必要
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
networks:
- default
# proxyコンテナと連携してLet's Encryptの証明書取得やの管理を行う
acme-companion:
container_name: acme-companion
image: nginxproxy/acme-companion
volumes:
- ./config:/etc/nginx/conf.d:rw
- ./vhost:/etc/nginx/vhost.d:rw
- ./certs:/etc/nginx/certs:rw
restart: unless-stopped
depends_on:
- proxy
environment:
# DEFAULT_EMAILを設定する事で、SSL証明書の更新や通知を受け取ることができる
# 環境や要件に基づいて適切な設定を行う
- DEFAULT_EMAIL=example@email.com
networks:
- default
web:
image: nginxinc/nginx-unprivileged:latest
container_name: web
restart: unless-stopped
environment:
- VIRTUAL_HOST=example.com
# この環境変数で指定されたドメイン名に対してSSL証明書を取得・更新する
- LETSENCRYPT_HOST=example.com
# SSL証明書の取得や更新に関する情報がこのメールアドレスに送信される
- LETSENCRYPT_EMAIL=example@email.com
volumes:
- ./html:/var/www/html
networks:
- default
Dockerfileまとめ
私のようにVPSに開発環境を構築し、Docker環境にプロジェクトを追加してそのまま動作確認をしてもらうような開発スタイルの方には、非常に便利だと思います。Composeファイルに環境変数を追加するだけで設定が完了するため、プロジェクトのコンテナを立ち上げるだけで済むのが非常に楽です。
nginxのイメージを使って手作業で設定していた方も、nginx-proxyを試してみることをおすすめします。