nginxproxy/nginx-proxyの使い方

サーバー

はじめに

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
Dockerfile

versionディレクティブは deprecated (非推奨) になっています。

Let’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を試してみることをおすすめします。

タイトルとURLをコピーしました