【问题标题】:docker: networking without linkingdocker:没有链接的网络
【发布时间】:2015-07-22 00:11:21
【问题描述】:

我在一台主机上运行以下设置:

  • 1 个带有 nginx 的容器:这个容器用作某些 Web 服务的反向代理
  • x 容器提供 Web 服务,已向主机公开端口
  • x “oldschool”/非 dockerized 网络服务

在配置nginx代理到“localhost:$EXPOSED_OR_NATIVE_PORT”时,这不起作用,因为nginx无法连接到这个端口。 我必须如何配置 dockerized nginx 才能充当容器和标准服务的代理?

将 nginx 与 docker webserives 链接可能是一种解决方案,尽管我不喜欢将所有容器都链接到 nginx 的想法。这并没有解决问题,这个 nginx 也应该作为这个主机上标准服务的反向。

有什么想法/建议吗?

谢谢

【问题讨论】:

  • 如果你想让容器中的 nginx 代理主机上的服务,你可以使用 --net=host 运行该容器
  • 啊,修复了它。您能否将其发布为答案,以便我可以选择此作为解决方案?

标签: web-services nginx proxy docker


【解决方案1】:

如果您希望容器内的 nginx 代理主机上的服务,您可能只需使用 --net=host 运行该容器,因此它不会放置在网络命名空间中并直接访问主机的网络接口。

【讨论】:

    【解决方案2】:

    在尝试了很多东西后回答自己。我希望这对某人有所帮助。

    我有以下过程: 正如@Ben 提到的,使用网桥 ip 有所帮助,一切都很好。
    但后来我意识到,此设置不适用于 ubuntu 上的 UFW,并且每个运行的 dockercontainer 的每个暴露端口都可以从 Internet 访问。
    原因是 docker 正在摆弄 iptables,这与 UFW 生成的 iptables 规则相冲突。 在我看来相当危险。为了解决这个问题,我用DOCKER_OPTS="--iptables=false" 启动了dockerdaemon。这解决了全球可访问的暴露 dockerport 的问题。但现在我无法从 ngix 容器再次访问 docker 容器。这就是 @Bryan 提供帮助的地方:以 --net host 开头的容器可以访问 localhost 和所有暴露的端口。
    最后一步是必要的:需要添加此 iptables 规则才能从 docker 容器中访问 www:iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

    LG 达基

    【讨论】:

      【解决方案3】:

      如果你的 nginx 是 dockerized 并且你想访问其他容器或主机,你应该使用主机 ip 而不是 localhost。默认为 172.17.42.1,可以在此处阅读 https://docs.docker.com/articles/networking/

      所以你应该代理到:

      proxy_pass http://172.17.42.1:$EXPOSED_OR_NATIVE_PORT;
      

      【讨论】:

      • 嗯舒尔?在 Dockerhost 上:curl http://172.17.42.1:8080 <html><body>You are being <a href="http://172.17.42.1:8080/users/sign_in">redirected</a>.</body> </html> 在容器中:cat < /dev/tcp/172.17.42.1/8080 不返回任何内容/没有提示
      • 所以它在主机上工作,而不是在容器内?添加ifconfigcurl -I http://172.17.42.1:8080 的输出(来自Dockerhost 和容器内部)也会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多