Docker nginx proxy_pass - 上游连接被拒绝
Docker nginx proxy_pass - Upstream connection refused
我已经用 Nginx 启动了一个简单的 Docker 容器,我想在我的主机上使用这个 Docker Nginx 作为我的应用程序 (HTTP Tomcat) 的反向代理。但是我的 proxy_pass
只适用于意外的 IP 值。
预期行为: 当我在我的容器上使用 docker inspect
时,我的 网关 是 172.29.0.1
,我的proxy_pass
应该与 172.29.0.1
一起使用。
电流: 我必须在我的 proxy_pass
中使用 172.18.0.1
才能使其正常工作,我不明白为什么这个随机值有效。如果我不使用 172.18.0.1
然后我有一个 502 HTTP 错误,我的 docker 日志显示“上游连接被拒绝”。
我的Docker文件(仅包含 1 行):
FROM nginx
我的docker-compose(我使用docker-compse up --build
来启动我的容器):
version: '3'
services:
nginx-web:
image: nginx-web
container_name: nginx-web-container
build: .
ports:
- "80:80"
volumes:
- ./volume-sources/nginx-conf-files:/etc/nginx/conf.d/
我的 nginx 文件(我的 nginx-web
值是 Gateway 值 172.29.0.1
,但是它手动将其设置为 172.18.0.1
):
时有效
upstream upstream-nginx-web {
server nginx-web:8000;
}
server {
listen 80;
server_name my-site.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://upstream-nginx-web;
}
}
在我的 主机上 ip route
:
default via 192.168.1.1 dev wlp2s0
10.0.0.0/8 via 10.110.23.254 dev enp0s31f6
10.110.20.0/22 dev enp0s31f6 proto kernel scope link src 10.110.20.76 metric 100
169.254.0.0/16 dev enp0s31f6 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.29.0.0/16 dev br-56b3c9a632cf proto kernel scope link src 172.29.0.1 linkdown
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.101 metric 600
另一个奇怪的行为:
我已经用 docker-compose up --build --force-recreate --always-recreate-deps
重启了我的容器,但这次我的 网关 是 172.17.0.1
但反向代理仅在 proxy_pass
时有效使用此 IP:172.19.0.1
.
备注:
- 我的Docker版本:18.06.1-ce
- 我的docker-compose版本:1.22.0
- 我的 OS:Ubuntu 18.04 LTS
- 我的主机上没有使用PHP,我有一个Tomcat服务器监听端口号8000。
host.docker.internal
和 gateway.host.internal
仅在 Windows 和 Mac 下可用,这就是为什么我使用 nginx-web
(在我的 Nginx 文件中)的原因docker-compose. 自动设置的网关值
问题:
- 我的错误在哪里?
- 我必须更改什么才能使其正常工作,为什么?
谢谢
docker-compose 在每次部署时自动创建一个新网络。
可以通过使用 docker-compose 文件中的 network_mode: bridge
选项来 修复网关 IP 地址 。使用此解决方案,您将使用 Docker 的默认网络 (docker0)。
如果您使用 network_mode: bridge
选项,您将无法像我在原始示例中那样在 upstream
中使用您的 Docker 服务名称:
upstream upstream-nginx-web {
# "nginx-web" is NOT recognized if "network_mode: bridge"
server nginx-web:8000;
# Use your Docker Gateway (which can be 172.17.0.1)
server 172.17.0.1:8000;
}
您可以使用以下 docker 命令找到您的 Docker 网关:
docker network inspect bridge --format="{{ (index .IPAM.Config 0).Gateway }}"
结果:
172.17.0.1
我已经用 Nginx 启动了一个简单的 Docker 容器,我想在我的主机上使用这个 Docker Nginx 作为我的应用程序 (HTTP Tomcat) 的反向代理。但是我的 proxy_pass
只适用于意外的 IP 值。
预期行为: 当我在我的容器上使用 docker inspect
时,我的 网关 是 172.29.0.1
,我的proxy_pass
应该与 172.29.0.1
一起使用。
电流: 我必须在我的 proxy_pass
中使用 172.18.0.1
才能使其正常工作,我不明白为什么这个随机值有效。如果我不使用 172.18.0.1
然后我有一个 502 HTTP 错误,我的 docker 日志显示“上游连接被拒绝”。
我的Docker文件(仅包含 1 行):
FROM nginx
我的docker-compose(我使用docker-compse up --build
来启动我的容器):
version: '3'
services:
nginx-web:
image: nginx-web
container_name: nginx-web-container
build: .
ports:
- "80:80"
volumes:
- ./volume-sources/nginx-conf-files:/etc/nginx/conf.d/
我的 nginx 文件(我的 nginx-web
值是 Gateway 值 172.29.0.1
,但是它手动将其设置为 172.18.0.1
):
upstream upstream-nginx-web {
server nginx-web:8000;
}
server {
listen 80;
server_name my-site.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://upstream-nginx-web;
}
}
在我的 主机上 ip route
:
default via 192.168.1.1 dev wlp2s0
10.0.0.0/8 via 10.110.23.254 dev enp0s31f6
10.110.20.0/22 dev enp0s31f6 proto kernel scope link src 10.110.20.76 metric 100
169.254.0.0/16 dev enp0s31f6 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.29.0.0/16 dev br-56b3c9a632cf proto kernel scope link src 172.29.0.1 linkdown
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.101 metric 600
另一个奇怪的行为:
我已经用 docker-compose up --build --force-recreate --always-recreate-deps
重启了我的容器,但这次我的 网关 是 172.17.0.1
但反向代理仅在 proxy_pass
时有效使用此 IP:172.19.0.1
.
备注:
- 我的Docker版本:18.06.1-ce
- 我的docker-compose版本:1.22.0
- 我的 OS:Ubuntu 18.04 LTS
- 我的主机上没有使用PHP,我有一个Tomcat服务器监听端口号8000。
host.docker.internal
和gateway.host.internal
仅在 Windows 和 Mac 下可用,这就是为什么我使用nginx-web
(在我的 Nginx 文件中)的原因docker-compose. 自动设置的网关值
问题:
- 我的错误在哪里?
- 我必须更改什么才能使其正常工作,为什么?
谢谢
docker-compose 在每次部署时自动创建一个新网络。
可以通过使用 docker-compose 文件中的 network_mode: bridge
选项来 修复网关 IP 地址 。使用此解决方案,您将使用 Docker 的默认网络 (docker0)。
如果您使用 network_mode: bridge
选项,您将无法像我在原始示例中那样在 upstream
中使用您的 Docker 服务名称:
upstream upstream-nginx-web {
# "nginx-web" is NOT recognized if "network_mode: bridge"
server nginx-web:8000;
# Use your Docker Gateway (which can be 172.17.0.1)
server 172.17.0.1:8000;
}
您可以使用以下 docker 命令找到您的 Docker 网关:
docker network inspect bridge --format="{{ (index .IPAM.Config 0).Gateway }}"
结果:
172.17.0.1