【技術】サーバ1つあれば複数のドメインもサバける【jwilder/nginx-proxyでできること】

技術
Image by Gerd Altmann from Pixabay

jwilder/nginx-proxyを使うと、1個の外部IPしかなくても、複数のドメインを処理できます。リバースプロキシという技術らしいのですが、いまいち実際の動きのイメージがしにくかったり、設定内容との対応がわかりにくく、混乱することがあったので簡易サンプルを自作して整理しました。

サンプルコードの動き

以下のように、クライアントから複数のURLにアクセスしますが、外部IPは1つしかないという状況を想定してサンプルを作成しました。

サンプルの入手と実行方法

前提環境

  • dockerおよび、docker-composeが必要です。
  • windowsの場合(例)
  • Linuxの場合(例)
    • curl -fsSL https://get.docker.com/ | sh
    • sudo systemctl enable docker
    • sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

サンプルコードの入手

git clone https://github.com/taka-output-blog/test-jwilder-nginx-proxy

名前解決設定(ローカルでテストするのでhostsを設定)

  • DNSの代わりにhostsファイルに設定
    • Windowsの場合(%windir%\system32\drivers\etc\hosts)
    • Linuxの場合(etc/hosts)
  • 追加する文字列
127.0.0.1 aaa.test
127.0.0.1 bbb.test
127.0.0.1 ccc.test
127.0.0.1 www.ccc.test

※実環境で確認する場合は、DNSにAレコード追加して対応しましょう。

Dockerネットワークの作成

dockerネットワークを事前に作成しておきます。

 docker network create --driver bridge docker-network 

サンプルコードの実行

下記実行すれば、自動的にnginx-proxy、サイトA、サイトB、サイトCの4つのコンテナが立ち上がります。

 docker-compose up -d 

動作確認

  • 以下のURLにアクセスしてみてください。サイト内容は雑なものですみません。
    • http://aaa.test
    • http://bbb.test
    • http://ccc.test
    • http://www.ccc.test

サンプルコードの解説

Dockerfile

各サイトフォルダに簡単なDockerfileを作っておきました。赤文字にしたところが、サイトアクセス時のポート番号と、アクセス時に表示されている文字列になります。

動作は単純で、python付属のhttpサービス機能を立ち上げて、index.htmlを表示させてます。

FROM alpine:latest
  RUN apk update && \
      apk add --no-cache \
          python3
 run echo this container is aaa.test > index.html
 CMD ["python3", "-m", "http.server", "80"]

docker-compose

  • 4つのコンテナ(nginx-proxy、サイトA、B、C)を立ち上げています。
  • 4つのコンテナは内々で「docker-network」ネットワークでつながっています。
  • nginx-proxyコンテナだけ、portを”80:80″とすることで、80番ポートからnginx-proxyにはつながるようになってます。
  • 各サイトには、VIRTUAL_HOST を定義しています。jwilder/nginx-proxyは、この環境変数を見て、外から来たドメイン名を適切に振り分けてくれます。
  • サイトCは、2つのドメインでたどり着きたいので、ドメイン名をカンマ区切りで指定しています。
version: '3'
 services:
   aaa-site:
     build: aaa-site
     container_name: aaa-site
     restart: always
     ports:
       - "80"
     networks:
       - docker-network
     environment:
       VIRTUAL_HOST: aaa.test
       VIRTUAL_PORT: 80
       VIRTUAL_PROTO: http
   bbb-site:
     build: bbb-site
     container_name: bbb-site
     restart: always
     ports:
       - "80"
     networks:
       - docker-network
     environment:
       VIRTUAL_HOST: bbb.test
       VIRTUAL_PORT: 80
       VIRTUAL_PROTO: http
   ccc-site:
     build: ccc-site
     container_name: ccc-site
     restart: always
     ports:
       - "8080"
     networks:
       - docker-network
     environment:
       VIRTUAL_HOST: ccc.test,www.ccc.test
       VIRTUAL_PORT: 8080
       VIRTUAL_PROTO: http
   nginx-proxy:
     image: jwilder/nginx-proxy
     container_name: nginx-proxy
     restart: always
     privileged: true
     ports:
       - "80:80"
     volumes:                     
       - /var/run/docker.sock:/tmp/docker.sock:ro
     labels:
       - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
     networks:
       - docker-network
 networks:
   docker-network:
     external: true

まとめ

nginx-proxyの動きを確認できる簡単なサンプルを用意しました。ドメイン名やポート番号の指定について、混乱することもあると思いますので、ちょっとした確認に使ってください。

このブログは、40歳ITサラリーマンが将来に備えての技術力アップや資産運用を情報発信していきます。Twitterもやってますので良ければフォローお願いします。

技術
スポンサーリンク
スポンサーリンク
takaをフォローする
アフターファイブ改革

コメント

  1. […] […]

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