docker-compose网络和发布端口

时间:2019-12-07 16:09:36

标签: docker docker-compose

我试图更好地了解docker网络,但以下几点让我感到困惑:

我通过docker-compose(客户端,api)启动了2个包含项。执行此操作时,将创建一个新网络myapp_default,每个容器都将加入该网络。该网络是桥接网络,位于172.18.0.1。客户端位于172.18.0.2,而api位于172.18.0.3

我现在可以在172.18.0.2:8080上访问客户端,并在172.18.0.3:3000上访问api-这很有意义。我在docker-compose中发布端口时感到困惑:客户端上为8080:8080,而api上为3000:3000。

现在我可以从以下位置访问容器:

  • 172.18.0.1:8080172.18.0.2:8080的客户端,以及docker0网络上172.17.0.1:8080的客户端
  • 位于172.18.0.1:3000172.18.0.3:8080的API以及位于172.17.0.1:3000的docker0网络上的

1)为什么在发布端口时可以通过docker0网络访问客户端和api?

2)为什么我完全可以通过172.17.0.1172.18.0.1连接到容器?

1 个答案:

答案 0 :(得分:0)

您只能访问容器专用的IP地址,因为您与Docker守护程序位于同一本地Linux主机上。这在任何其他环境(不同的主机,MacOS或Windows主机,Docker在VM中的Docker Toolbox之类的环境)中均不起作用,甚至使用product查找这些IP地址通常也不是最佳实践。

发布端口时,可以在主机上的这些端口上访问它们。 在所有环境中都有效(在Docker工具箱中,“主机”是VM),这是从Docker空间外部访问容器的推荐方法。除非您绑定到特定地址,否则容器可以在每个主机接口和每个主机IP地址上访问;其中包括使用Docker桥接网络创建的人工172.17.0.1

发布端口是Docker进行的其他与网络相关的设置的补充。并不会阻止您通过其他路径到达容器。

如果还没有,还应该阅读Docker文档中的Networking in Compose。无论是否发布端口,都可以使用model.getRow(j).getProduct()文件中的名称,例如docker inspectdocker-compose.yml作为主机名,连接实际服务器进程正在侦听的(未映射)端口。 。在此功能和您从发布端口获得的收益之间,实际上并不需要直接知道容器专用IP地址。