docker: 没有链接的网络
docker: networking without linking
我在一台主机上有以下设置 运行:
- 1 个带有 nginx 的容器:这个容器用作某些网络服务的反向代理
- x 提供网络服务的容器,已向主机公开一个端口
- x "oldschool"/非 docker 化网络服务
配置nginx代理到"localhost:$EXPOSED_OR_NATIVE_PORT"时,这不起作用,因为nginx无法连接到这个端口。
我必须如何配置 docker 化的 nginx 才能充当容器和标准服务的代理?
将 nginx 与 docker webserives 链接可能是一种解决方案,尽管我不喜欢将所有容器链接到 nginx 的想法。这并没有解决问题,这个 nginx 也应该作为这个主机上标准服务的反向服务。
任何idea/recommendation?
谢谢
如果你的 nginx 是 dockerized 并且你想访问其他容器或主机你应该使用主机 ip 而不是本地主机。默认值为 172.17.42.1,可在此处阅读 https://docs.docker.com/articles/networking/
所以你应该代理到:
proxy_pass http://172.17.42.1:$EXPOSED_OR_NATIVE_PORT;
在尝试了很多东西之后回答自己。我希望这对某人有所帮助。
我有以下过程:
正如@Ben 提到的,使用网桥 ip 有帮助,一切都很好。
但后来我意识到,此设置不适用于 ubuntu 上的 UFW,并且每个 docker 容器 运行 的每个暴露端口都可以从互联网访问。
原因是 docker 正在摆弄 iptables,这与 UFW 生成的 iptables 规则冲突。 在我看来非常危险。 为了解决这个问题,我用 DOCKER_OPTS="--iptables=false"
启动了 docker 守护进程。这解决了全球可达的公开 docker 端口的问题。但是现在我无法从 ngix 容器再次访问 docker 容器。这是 @Bryan 提供帮助的地方:以 --net host
开头的容器可以访问本地主机和所有公开的端口。
最后一步是必要的:需要添加此 iptables 规则才能从 docker 容器中访问 www:iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
LG
达奇
如果您希望容器内的 nginx 代理主机上的服务,您可以 运行 那个容器 --net=host
,这样它就不会放在网络名称空间内并访问主机的直接网络接口。
我在一台主机上有以下设置 运行:
- 1 个带有 nginx 的容器:这个容器用作某些网络服务的反向代理
- x 提供网络服务的容器,已向主机公开一个端口
- x "oldschool"/非 docker 化网络服务
配置nginx代理到"localhost:$EXPOSED_OR_NATIVE_PORT"时,这不起作用,因为nginx无法连接到这个端口。 我必须如何配置 docker 化的 nginx 才能充当容器和标准服务的代理?
将 nginx 与 docker webserives 链接可能是一种解决方案,尽管我不喜欢将所有容器链接到 nginx 的想法。这并没有解决问题,这个 nginx 也应该作为这个主机上标准服务的反向服务。
任何idea/recommendation?
谢谢
如果你的 nginx 是 dockerized 并且你想访问其他容器或主机你应该使用主机 ip 而不是本地主机。默认值为 172.17.42.1,可在此处阅读 https://docs.docker.com/articles/networking/
所以你应该代理到:
proxy_pass http://172.17.42.1:$EXPOSED_OR_NATIVE_PORT;
在尝试了很多东西之后回答自己。我希望这对某人有所帮助。
我有以下过程:
正如@Ben 提到的,使用网桥 ip 有帮助,一切都很好。
但后来我意识到,此设置不适用于 ubuntu 上的 UFW,并且每个 docker 容器 运行 的每个暴露端口都可以从互联网访问。
原因是 docker 正在摆弄 iptables,这与 UFW 生成的 iptables 规则冲突。 在我看来非常危险。 为了解决这个问题,我用 DOCKER_OPTS="--iptables=false"
启动了 docker 守护进程。这解决了全球可达的公开 docker 端口的问题。但是现在我无法从 ngix 容器再次访问 docker 容器。这是 @Bryan 提供帮助的地方:以 --net host
开头的容器可以访问本地主机和所有公开的端口。
最后一步是必要的:需要添加此 iptables 规则才能从 docker 容器中访问 www:iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
LG 达奇
如果您希望容器内的 nginx 代理主机上的服务,您可以 运行 那个容器 --net=host
,这样它就不会放在网络名称空间内并访问主机的直接网络接口。