我想了解docker中暴露端口的内部工作方式,即我想知道主机上使用了哪些接口。让我们考虑三种情况:
(1)
docker run -p 80:80 nginx
(2)
dokcer-compose:
用于 docker swarm
....
services:
ports:
published: 80
target: 80
....
请不要在这种情况下使用overlay
网络。
(3)
dokcer-compose:
用于 docker swarm
....
services:
ports:
published: 80
target: 80
mode: host
....
首先,让我们强调一个事实,它取决于容器中包含的进程所选择的接口 绑定。但是,它在主机中的绑定位置在哪里?我的意思是选择哪个接口(lo,eth0 ..)作为要绑定的接口?
特别是,(2)和(3)方法有什么区别?
修改
让我们考虑第四种情况:
(4)
`dokcer-compose:` for *docker swarm*
....
services:
s1:
ports:
published: 1234
target: 1234
mode: host
networks:
n1
s2:
ports:
published: 1234
target: 1234
mode: host
networks:
n1
networks:
n1:
driver: overlay
其中s1
和s2
被强制部署在不同的节点上(使用约束)。现在,我们假设s1
使用端口s2
与s2
对话,s1
与1234
对话,并且:
(1)服务的IP地址(或服务名称)
(2)主机的IP地址(物理地址)。
如果使用(1)或(2)覆盖网络n1
,请告诉我。请注意,这两个服务都已连接到该网络。
答案 0 :(得分:1)
您应该在文档中清楚地得到答案
https://docs.docker.com/engine/swarm/services/#publish-a-services-ports-directly-on-the-swarm-node
在您的情况下(2)
services:
ports:
published: 80
target: 80
如果您有3个节点N1,N2,N3
,那么即使仅将其部署在一个节点80
上,也可以在这3个节点中的任意一个节点上按N3
进入应用程序。
在Case (3)
services:
ports:
published: 80
target: 80
mode: host
由于仅在N3
上部署了该服务,所以您只能在N3
上访问80,因此N1
和N2
不会在端口80
上响应