jwilder/nginx-proxyを使うと、1個の外部IPしかなくても、複数のドメインを処理できます。リバースプロキシという技術らしいのですが、いまいち実際の動きのイメージがしにくかったり、設定内容との対応がわかりにくく、混乱することがあったので簡易サンプルを自作して整理しました。
サンプルコードの動き
以下のように、クライアントから複数のURLにアクセスしますが、外部IPは1つしかないという状況を想定してサンプルを作成しました。
サンプルの入手と実行方法
前提環境
- dockerおよび、docker-composeが必要です。
- windowsの場合(例)
- chocolateyのインストール(参考:chocolateyインストール)
- コマンド choco install docker-desktop
- 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もやってますので良ければフォローお願いします。
コメント
[…] […]