将服务/进程绑定到接口以防在docker中暴露

时间:2018-06-27 15:00:08

标签: docker cluster-computing docker-swarm

我想了解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

其中s1s2被强制部署在不同的节点上(使用约束)。现在,我们假设s1使用端口s2s2对话,s11234对话,并且: (1)服务的IP地址(或服务名称) (2)主机的IP地址(物理地址)。

如果使用(1)或(2)覆盖网络n1,请告诉我。请注意,这两个服务都已连接到该网络。

1 个答案:

答案 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,因此N1N2不会在端口80上响应