完全に動かなくなった。
これは私が持っているものです。ポート8080のnginxでシンプルなHTMLページを作成して実行します(これを理解したら、最終的にJava Tomcatアプリを実行したい)。
これは、Docker 17.09とnginx 1.13がインストールされたWindows 10上にあります
これは設定です:
$ cat Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx
COPY static-html /usr/share/nginx/html
EXPOSE 80
そして設定:
$ cat nginx.conf
user nginx;
worker_processes 1;
error_log /dev/stdout warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /dev/stdout main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
次のように実行します。
$ docker run -p 8080:80 --name dummy --rm dummy-nginx
curl
にうまく応答します:
$ curl -i http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.13.7
Date: Thu, 30 Nov 2017 16:46:17 GMT
Content-Type: text/html
Content-Length: 101
Last-Modified: Wed, 29 Nov 2017 16:24:39 GMT
Connection: keep-alive
ETag: "5a1edf47-65"
Accept-Ranges: bytes
<head>
<title>oh yeah</title>
</head>
<body>
<h1>Absolutely</h1>
<p>did this work?</p>
</body>
そのため、すべてが正常に動作します。これは、失敗する部分であるリバースプロキシと同じものです。
リバースプロキシDockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY apt-proxy.conf /etc/apt/apt.conf.d
COPY nginx_signing.key /etc/apt
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y install gnupg gnupg2 gnupg1
RUN apt-key add /etc/apt/nginx_signing.key
RUN apt-get -y install curl
RUN apt-get -y install net-tools
EXPOSE 10040
CMD ["nginx"]
(私はこれを診断するのを助けるためにそれらの余分なツールをそこに入れました)
リバースプロキシnginx.conf
daemon off;
user nginx;
worker_processes 1;
pid /var/run/nginx.pid;
error_log /dev/stdout debug;
events { worker_connections 1024; }
http {
access_log /dev/stdout;
upstream myapp {
server localhost:8080;
}
server {
listen 10040;
location / {
proxy_pass $scheme://myapp;
proxy_redirect default;
proxy_set_header Host $Host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
私は、問題全体がどこか(壁に頭をぶつけている)の小さなエラーであると強く疑っています。
リバースプロキシを起動するコマンドライン
これには、nginxからのエラーを含むログの一部と、/ dev/stdoutにもパイプしたaccess_log項目が含まれます。
$ docker run -p 10040:10040 --name rproxy --rm we1p202420008.cloud.registry(example).com:11095/rproxy
2017/11/30 16:55:20 [notice] 1#1: using the "epoll" event method
2017/11/30 16:55:20 [notice] 1#1: nginx/1.13.7
2017/11/30 16:55:20 [notice] 1#1: built by gcc 6.3.0 20170516 (Debian 6.3.0-18)
2017/11/30 16:55:20 [notice] 1#1: OS: Linux 4.9.49-moby
2017/11/30 16:55:20 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2017/11/30 16:55:20 [notice] 1#1: start worker processes
2017/11/30 16:55:20 [notice] 1#1: start worker process 5
2017/11/30 16:55:25 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8080/", Host: "localhost:10040"
172.17.0.1 - - [30/Nov/2017:16:55:25 +0000] "GET / HTTP/1.1" 502 173 "-" "curl/7.56.1"
2017/11/30 16:55:25 [info] 5#5: *1 client 172.17.0.1 closed keepalive connection
このエラーは、次のようにr-proxyを使用してダミーのWebサイトにアクセスしようとするとログに記録されます。
$ curl -i http://localhost:10040
HTTP/1.1 502 Bad Gateway
Server: nginx/1.13.7
Date: Thu, 30 Nov 2017 18:05:06 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.13.7</center>
</body>
</html>
投稿したばかりの構成に明白なものがなく、それが本当に私の愚かさではない場合は、これ以上取得できない不可解な要素があります。たとえば、リバースプロキシインスタンス内でcurl
を実行すると、次のようになります。
docker exec rproxy curl -i http://localhost:8080
それは私に会社のファイアウォールのブロックされたコンテンツの結果を与えます:
アクセスしようとしているウェブサイト http:// localhost / は現在、未分類のURL <として分類されており、安全ではない、または閲覧に適さない可能性があると見なされています。
bridge
を魔法のキーワードとして使用して、必要な検索エンジンの結果を取得し始めました。
質問へのコメントは問題を指摘しました:nginxは他のdockerコンテナーが見つかったlocalhost:8080
ではなく、独自のコンテナー内のHost:ports
にリクエストを転送するだけでした。
周りを確認したところ、多くの人がプロキシサーバーのFQDNをnginx.conf
に書き込んでいます。ビルドで各環境の構成ファイルにデータが入力されると複雑になる可能性があるため、これは望ましくありませんでした。
だから Dockerコンテナー内からホストマシンにアクセスする および Docker docs 今日docker network
について学び、私の開発環境にユニークで変化しないホストIPを与えるために以下を実装しました。
私のリバースプロキシのnginx.conf
には、proxy_pass http://myapp:8080
があります。ここで、myapp
は、プロキシされたアプリに指定するDockerコンテナーの名前です。
次に、ユーザー定義のブリッジネットワークを作成します。
docker network create -d bridge myapp-net
デフォルトのドッカーブリッジネットワークが機能しない理由をまだ理解していません。
次に、コンテナーを起動し、myapp-net
に接続します。
docker run -p 8080:8080 --network=myapp-net --name myapp --rm myregistry:11095/myapp
docker run -p 10040:443 --network=myapp-net --name rproxy --rm myregistry:11095/myapp-rproxy
そしてそれは動作します。
私は自分のWindowsワークステーションで作業していて、実際の外部ホストFQDNをnginx.conf
に書き込むと、ワークステーションごとに新しい環境定義が必要になると考えましたが、代わりにconfファイルにmyapp
を指定すると、ホスト名またはIPへの依存関係。