我已经使用Nginx启动了一个简单的Docker容器,我想将此Docker Nginx用作主机上应用程序(HTTP Tomcat)的反向代理。但是我的proxy_pass
只能使用意外的IP值。
预期的行为:当我在容器上使用docker inspect
时,我的 Gateway 是172.29.0.1
,我的proxy_pass
应该可以使用172.29.0.1
。
当前:我必须在172.18.0.1
中使用proxy_pass
才能使其正常工作,并且我不明白为什么这个随机值会起作用 >。如果我不使用172.18.0.1
,那么我会遇到502 HTTP错误,并且我的docker日志显示“ 上游连接被拒绝”。
我的 Dockerfile (仅包含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
,但是在手动将其设置为{{ 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
使用以下IP时,反向代理才有效:{ {1}}。
注意:
proxy_pass
和172.19.0.1
仅在Windows和Mac下可用,这就是为什么我使用host.docker.internal
(在我的Nginx文件中)的原因,这是 docker自动设置的网关值-撰写。问题:
谢谢
答案 0 :(得分:1)
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