同じホスト上で、Webアプリケーションを含む複数のコンテナーにアクセスできるようにしたい。
ホスト(IPアドレス)またはコンテナー(Host_ip_adress/container1など)にアクセスしたい場合、nginx
から両方の503エラーが発生します。私が欲しいのは、ip_addrress_Host/container1によってcontainer1にアクセスすることです。
私がインターネットで見つけた解決策は、nginx-proxy
フロントエンドサーバーを設定することでした(ソース: https://blog.florianlopes.io/Host-multiple-websites-on-single-Host-docker/ )
私のdocker-composeファイル:docker-compose.yml
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock
site_a:
image: php:7.0-Apache
expose:
- "80"
environment:
- VIRTUAL_Host=container1
volumes:
- ./php:/var/www/html
site_b:
image: php:7.0-Apache
expose:
- "80"
environment:
- VIRTUAL_Host=container2
volumes:
- ./php:/var/www/html
コマンドで実行します:
docker-compose up
/ etc/hostsファイルの私のエントリ:
127.0.1.1 container1
127.0.0.1 container2
外部からリクエストしたときに表示されるログ:
nginx-proxy_1 | nginx.1 | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /container1 HTTP/1.1" 503 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
nginx-proxy_1 | nginx.1 | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /favicon.ico HTTP/1.1" 503 615 "http://192.168.12.28/container1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
あなたの助けをありがとう、そして私の悪い英語をお詫びします! :-)
編集:
開始時のnginx-proxyコンテナのログは次のとおりです:
forego | starting dockergen.1 on port 5000
forego | starting nginx.1 on port 5100
dockergen.1 | 2017/10/25 14:01:53 Generated '/etc/nginx/conf.d/default.conf' from 3 containers
dockergen.1 | 2017/10/25 14:01:53 Running 'nginx -s reload'
nginx.1 | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container1" has suspicious symbols in /etc/nginx/conf.d/default.conf:60
nginx.1 | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container2" has suspicious symbols in /etc/nginx/conf.d/default.conf:74
dockergen.1 | 2017/10/25 14:01:54 Watching docker events
dockergen.1 | 2017/10/25 14:01:54 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'
Edit2:PawełTatarczuk( https://serverfault.com/)によって提供された構成ファイルを使用してnginx-proxyを「カスタマイズ」しようとしましたa/880384/441157 )
さて、私が次のようなリクエストを行うと http://192.168.12.28/container1 このログがあります:
nginx-proxy_1 | nginx.1 | 2017/10/26 08:46:19 [error] 41#41: *1 open() "/etc/nginx/html/container1" failed (2: No such file or directory), client: 192.168.12.82, server: 192.168.12.28, request: "GET /container1 HTTP/1.1", Host: "192.168.12.28"
編集3:?を追加します書き直しに
nginx-proxy_1 | nginx.1 | 2017/10/26 09:11:00 [error] 31#31: *1 container1 could not be resolved (2: Server failure), client: 192.168.12.82, server: 192.168.12.28, request: "GET /container1 HTTP/1.1", Host: "192.168.12.28"
私が欲しいのは、ip_addrress_Host/container1によってcontainer1にアクセスすることです。
コンテナにアクセスしてもよろしいですか? http://127.0.0.1/container1 ?その場合、jwilder/nginx-proxy
は最善のアプローチではありません。
プロキシはポート80でローカルにリッスンしており、リクエストをcontainer1
とcontainer2
にプロキシしますが、パス/container1
と/container2
をプロキシしません。
カール
curl -H "Host: container1" localhost
ブラウザ
プロキシパスを処理するカスタム構成をアタッチして、ip_address/container-name
を機能させることができます。
volumes
に追加します:./custom.conf:/etc/nginx/conf.d/custom.conf
custom.conf
の横にdocker-compose.yml
を作成します。
server {
server_name 192.168.X.Y;
listen 80;
location ~ ^/([^/]+)(/.*)? {
proxy_pass http://$1$2;
}
}
リンクコンテナ
nginx-proxy:
...
links:
- site_a:container1
- site_b:container2
これはほんの始まりに過ぎません。ニーズに合わせてこれを改善する必要があります。 http://192.168.X.Y/container1 または http://192.168.X.Y/container2 で動作するはずです。
書き換えがあるため、 http://192.168.X.Y/container1/some/path は http:// container1/some/path にプロキシされることに注意してください。宛先conatinerに/container1
プレフィックスが付いたリクエストは必要ないと仮定しました。