参考:https://blog.51cto.com/u_16099316/6467190
今天遇到一个问题,在一台中转的服务器上docker装的nginx,假设这台服务器地址 192.168.100.128,代理后的接口是本机80端口getInfo。下面3种访问方式,本应该返回同样的值,结果,第3种不能正常访问。
curl 127.0.0.1/getInfo
curl localhost/getInfo
curl 192.168.100.128/getInfo
原因一:
其实原因就是这台服务器上的nginx在启动的时候,docker run -d 后面的参数添加了 --net=host。
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
所以将这个参数删除就行了,或者–net=bridge。
docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 |
container模式 | –net=container:NAME/ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | –net=bridge | 默认为该模式 |
原因二:
代理的时候,proxy_pass后面不要写127.0.0.1,需要写192.168.100.128
location / {
proxy_pass http://192.168.100.128:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}