Docker跨主机连接————docker swarm模式
目录 一、前言二、总体架构图三、创建Swarm 集群四、构建Overlay network五、部署服务六、验证测试一、前言 当我们开发好微服务(笔者是基于SpringCloud开发的微服务)之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行。由于微服务个数通常会较多,把所有微服务部署在一台docker主机...
目录
一、前言
当我们开发好微服务(笔者是基于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互联成功。
更多推荐
所有评论(0)