我试图更好地了解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:8080
,172.18.0.2:8080
的客户端,以及docker0网络上172.17.0.1:8080
的客户端172.18.0.1:3000
,172.18.0.3:8080
的API以及位于172.17.0.1:3000
的docker0网络上的1)为什么在发布端口时可以通过docker0网络访问客户端和api?
2)为什么我完全可以通过172.17.0.1
和172.18.0.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 inspect
和docker-compose.yml
作为主机名,连接实际服务器进程正在侦听的(未映射)端口。 。在此功能和您从发布端口获得的收益之间,实际上并不需要直接知道容器专用IP地址。