无法从主机访问Docker自定义网桥网络中发布的端口

时间:2018-08-13 13:54:05

标签: docker networking bridge

因此,情况如下。我有两个容器,一个提供数据库服务,另一个提供前端。前端容器使用其端口之一连接到DB容器,然后发布其自己的端口以提供一系列RESTful服务。

此配置在默认网桥中运行正常。但是,我已经阅读了Docker文档,建议不要在生产环境中的默认桥上运行容器,因为这些端口将暴露给任何计算机,而不仅仅是网络内部。他们建议在这种情况下使用自定义网桥。

(例如,在文档中描述的一种使用案例中),想法是通过发布相应的端口可以从主机访问主机的前端,但是不能通过数据库容器访问前端,因此,前端容器连接到同一自定义桥。

我已经设置了这样的配置,但是现在,即使前端的端口已经公开并发布,也无法从主机访问它。我想我做错了什么或误解了一些概念,但我似乎无法弄清楚。

我采取的步骤如下:

  • 创建自定义网络:

    docker network create --subnet=172.19.0.0/16 -o com.docker.network.bridge.enable_ip_masquerade=true -o com.docker.network.bridge.host_binding_ipv4="172.19.0.1" -o com.docker.network.bridge.enable_icc=true -o com.docker.network.bridge.name="serversBridge" servers

  • 运行数据库容器:

    docker run -d --name testDb --network servers --ip 172.19.0.2 couchdb

  • 运行前端容器:

    docker run --name myApp --network servers --ip 172.19.0.3 -p 12345:12345 myApp

如果我随后运行docker ps,则会得到下一行:

`CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                            NAMES
6b8e93e6e9e1          myApp                        "./myApp"             4 hours ago         Up 4 hours             172.19.0.1:12345->12345/tcp                                      myApp`

但是,如果我尝试从主机访问该IP地址和端口,则会收到“连接被拒绝”消息。我已经检查了IP表,但是有一个规则:

target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.19.0.3           tcp dpt:12345

因此,我目前的猜测是,我的请求实际上已转发到容器并被其拒绝。是我做错了什么还是我误解了一些概念?

1 个答案:

答案 0 :(得分:0)

我最终通过在本地广播IP地址(0.0.0.0)上的容器内部运行应用程序,而不是将其绑定为在本地IP地址(127.0.0.1)上进行侦听解决了这个问题。

我了解到,主机访问IP地址172.19.0.1才能到达此容器,请求不会来自127.0.0.1界面,因此将被拒绝。

即使我尝试将端口转发到主机的0.0.0.0:12345并通过从主机向localhost:12345发送请求来访问网络,也是如此,因为我的默认网桥会创建一个NAT伪装并使用相应的内部IP地址(172.19.0.3)在本地转发请求。

我仍然不完全了解为什么相同的配置可以在默认网桥上工作。我认为化妆舞会的方式不一样