目录

 

什么是overlay网络

两者在overlay网络中的公共操作

swarm服务在overlay网络的操作

单一容器在overlay网络中的操作

其他


什么是overlay网络

overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密,当我们初始化一个swarm或是加入到一个swarm中时,在docker主机上会出现两种网络:

1、称为ingress的overlay网络,用于传递集群服务的控制或是数据消息,若在创建swarm服务时没有指定连接用户自定义的overlay网络,将会加入到默认的ingress网络

2、名为docker_gwbridge桥接网络会连接swarm中所有独立的docker系统进程

可以使用docker network create创建自定义的overlay网络,容器以及服务可以加入多个网络,只有同一网络中的容器可以相互交换信息,可以将单一容器或是swarm服务连接到overlay网络中,但是两者在overlay网络中的行为会有所不同,接下来会描述两者在overlay网络中的共同行为以及不同行为

 

两者在overlay网络中的公共操作

  • 注意事项:
  • 如果想要连接到overlay网络,请确保连接前下列端口没有服务,并且服务器防火墙要允许下列端口通过:
  1. TCP端口2377,用于集群管理信息的交流
  2. TCP、UDP端口7946用于集群中节点的交流
  3. UDP端口4789用于overlay网络中数据报的发送与接收
  • 无论是否需要使用集群服务,都需要使用docker swarm init初始化本地主机为swarm管理节点或是使用docker swarm join加入现有得swarm

 

  • 创建自定义overlay网络的方式:
$ docker network create -d overlay my-overlay

       为了创建可以让单一容器、服务相互交流的网络,需要在命令中加入--attachable参数:

$ docker network create -d overlay --attachable my-attachable-overlay

       同时也可以指定IP地址范围、子网掩码、网关等其他选项

 

  • 在overlay网络中,默认情况下传递的控制信息是加密的,它们使用AES加密算法,每隔12小时交换一次密钥。

       可以在创建overlay网络时加上--opt encrypted来加密容器间通信的信息,例如:

$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

        这种加密会带来不可忽视的性能损失,开启后,docker会在所有集群节点之间创建IPSEC通道,使用的加密算法以及密钥交换的周期与控制信息的一致,在windows中,无法提供这种加密服务

 

  • 17.05或是更高版本的docker容器允许更改ingress网络的配置,如果想要更改ingress网络的配置,首先要移除ingress网络,并在配置后重新创建,如果集群中的服务发布了端口,需要先在集群中移除这个服务,如果没有发布端口,则在ingress网络重新启动前,集群中服务无法进行负载均衡,接下来举一个例子:
  1. 使用命令docker network inspect ingress确保ingress网络存在,移除所有发布了端口的服务,否则下一步会失败
  2. 移除ingress网络:
    $ docker network rm ingress
    
    WARNING! Before removing the routing-mesh network, make sure all the nodes
    in your swarm run the same docker engine version. Otherwise, removal may not
    be effective and functionality of newly created ingress networks will be
    impaired.
    Are you sure you want to continue? [y/N]
  3. 使用--ingress参数创建overlay网络,设置必要的配置参数,ingress网络的名称不一定就是ingress,例如下列将其命名为my-ingress
    $ docker network create \
      --driver overlay \
      --ingress \
      --subnet=10.11.0.0/16 \
      --gateway=10.11.0.2 \
      --opt com.docker.network.driver.mtu=1200 \
      my-ingress
  4. 让第一步中的服务重新连接该网络

 

  • docker_gwbridge是一个虚拟网桥,连接docker系统进程所处的物理网络和overlay网络,它存在于docker的内核中,如果我们想配置这个网络,首先需要确保主机不在集群中,接着进行下面的步骤:
  1. 停止docker
  2. 删除现存的docker_gwbridge接口:
    $ sudo ip link set docker_gwbridge down
    
    $ sudo ip link del dev docker_gwbridge
  3. 重启docker,但是不要加入集群
  4. 使用docker network create命令创建docker_gwbridge桥接网络,更多的选项信息请查看: Bridge driver options
    $ docker network create \
    --subnet 10.11.0.0/16 \
    --opt com.docker.network.bridge.name=docker_gwbridge \
    --opt com.docker.network.bridge.enable_icc=false \
    --opt com.docker.network.bridge.enable_ip_masquerade=true \
    docker_gwbridge
  5. 重新加入集群或是创建集群(集群不存在的前提下)

 

swarm服务在overlay网络的操作

overlay网络中的服务彼此可以使用对方的任意接口,如果外界想要访问服务,则需要使用docker service create或是docker service update指令的-p或是-publish参数发布端口,格式如下:

swarm服务默认会使用一个叫做routing mesh的东西,当我们向任何集群节点上已发布的端口发送请求时(无论它是否运行给定的服务),请求将被重定向到运行该服务的容器中,这就是routing mesh的功能,如果不想使用routing mesh,官方提供的方式如下:

默认情况下,控制信息和容器之间的通信信息是在同一个网络中传输的,如果想要使两者不在一个网络上传输,在将服务加入到集群时,需要指定--advertise-addr 以及 --datapath-addr参数

 

单一容器在overlay网络中的操作

如果创建的ingress网络未指定--attachable参数,则ingress网络只允许服务连接到overlay网络中,想要连接单一容器到overlay网络,就必须在创建overlay网络时添加--attachable参数,并且单一容器并不是暴露所有端口到overlay网络中,需要自己发布:

 

 

其他

我们知道一个服务可以由多个容器(称为任务)组成,运行DNS查询:tasks.<service-name>.可以查看一个服务后面的任务列表,即容器个数

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐