目录

 

一、前言

二、总体架构图

三、创建Swarm 集群

四、构建Overlay network

五、部署服务

六、验证测试


一、前言

        当我们开发好微服务(笔者是基于SpringCloud开发的微服务)之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行。由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的,因此需要考虑到跨主机通信的问题,对实际部署必然会提出以下几点要求:

        1. 微服务作为一个docker container可以在任意host上运行;

        2. 同一host上可以运行多个相同的微服务;

        3. 运行在同一个host上的微服务之间可以相互通信;

        4. 运行在不同host上的微服务也可以相互通信;

        5. 每个微服务的ip地址不受host所在本地局域网ip地址段限制,即拥有独立网段,避免占用本地IP地址,同时确保container数量受限尽量小;

        6. 每个微服务container避免通过端口暴露的方式相互通信,确保不会因端口独占而导致无法灵活部署。

 

        综上原因,笔者研究并采用在docker swarm模式下将各微服务加入同一个overlay network网络的方式实现微服务之间的相互通信。

二、总体架构图

        

 

       说明:

 

  • 如图所示,假设本地局域网段10.159.62.0/24中存在主机10.159.62.231,10.159.62.232和10.159.62.233互联互通
  • 每个主机上都运行dockerengine,通过docker engine运行若干个docker container,例如图中的Order,Billing等等。
  • 将这3台主机建立成为一个dockerswarm集群
  • 创建一个docker overlay网络(网段10.10.0.0/24),每个主机上的container都被加入到该overlay网络中,通过overlay网络实现跨主机的container相互通信
  • 假设console,terminal和api这三个服务均需要暴露端口到物理网络,因为物理网络10.159.62.0/24无法直接访问overlay网络中的container,需要container中映射端口到物理网络。
  • overlay网络中的container默认通过与主机之间的bridge访问物理网络。

三、创建Swarm 集群

        1. 在主机231上创建管理节点

    $ docker swarm init --advertise-addr 10.159.62.231

        

        执行完会显示token,例如SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z

        创建工作节点时需要引用该token,Manager和Worker节点之间通信端口是2377

        

    2. 在主机232上创建工作节点

   $ docker swarm join --token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z10.159.62.231:2377

 

   3.在主机231上创建工作节点

   $ docker swarm join --token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z 10.159.62.231:2377

 

四、构建Overlay network

       在管理节点主机231上执行

$ docker network create -d overlay \
  --subnet=10.10.0.0/16 \
  --gateway=10.10.0.254 \
  --attachable=true \
overlay

 

五、部署服务

根据上文架构图中所示分别在各主机上执行类似的命令,将各微服务docker container启动起来。

对于不需要暴露端口的微服务,命令类似如下

$ docker run --name order --network=overlay 10.159.62.231/somecom/order:1.0.0 &

 对于需要暴露端口的微服务,命令类似如下:

$ docker run --name -p 9769:8769 api --network=overlay 10.159.62.231/somecom/api:1.0.0 &

 

 

六、验证测试

由于对于读者而言并不知道文中各微服务之间的关系,所以不从服务调用方面测试微服务之间可达,而通过代表各微服务的docker container间的ping ip的方式测试验证。

 

1. 查看231上已经启动的container

$ docker ps

CONTAINER ID        IMAGE                                                                                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
585c46f5f8fb        10.159.62.231/somecom/console:3.0.0                "/bin/sh -c 'java ..."    5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9086->8086/tcp   console
10e61f6fe11e        10.159.62.231/somecom/terminal:3.0.0               "/bin/sh -c 'java ..."   5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9088->8088/tcp   terminal

 

2. 查看其中console的overlay network ip地址

$ docker inspect -f {{.NetworkSettings.Networks.overlay.IPAMConfig.IPv4Address}} 585c46f5f8fb
10.10.0.2

 

3. 查看232上已经启动的container

CONTAINER ID        IMAGE                                                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
31411d3g33g1       10.159.62.231/somecom/sso:3.0.0        "/bin/sh -c 'java ..."   5 days ago          Up 5 days           22/tcp, 8085/tcp                  sso
151f48b3130b        10.159.62.231/somecom/api:3.0.0        "/bin/sh -c 'java ..."    5 days ago          Up 5 days           0.0.0.0:9769->8769/tcp      api

 

4. 查看api对应的pid

$ docker inspect -f {{.State.Pid}} 31411d3g33g1
22256

 

5. 进入container,ping 10.10.0.2

$ nsenter --target 22256 --mount --uts --ipc --net --pid
root@585c46f5f8fb:/#   ping 10.10.0.2
64 bytes from 10.10.0.2: icmp_seq=0 ttl=64 time=0.049 ms
64 bytes from 10.10.0.2: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 10.10.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 10.10.0.2: icmp_seq=3 ttl=64 time=0.055 ms

 

至此,验证跨主机的container之间通过overlay network互联成功。

 

Logo

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

更多推荐