Docker Swarm Mode下Service之间的交互

如果把docker swarm mode下的service看作微服务,那么在实际应用中会有多个service,可能会出现1个service需要访问其他service的情况。

这时候就需要使用docker swarm的一个功能:overlay network

最简单的服务见交互#

本文使用的示例见使用Docker Swarm Mode创建最简单的服务

通过命令创建overlay网络(需要在swarm的manager节点上创建):

1
docker network create --driver overlay --subnet 10.0.9.0/24 mynet

删除原来的服务:

1
docker service rm hello-service

重新创建,设置network参数:

1
2
3
4
docker service create \
--network mynet \
--name hello-service \
marshalw/hello-service:0.2.1

创建一个新的服务,设置相同的network参数:

1
2
3
docker service create --name terminal \
--network mynet \
alpine:3.4 sleep 3000

这个服务使用Alpine Linux并且sleep 3000秒退出。我要趁它没退出的时候登录到这个容器中,再运行curl命令访问hello-service的服务。

首先要找到terminal服务部署到哪个节点了:

1
2
3
$ docker service ps terminal
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
1btubdkvijg6af5qkx1l6xs5t terminal.1 alpine:3.4 t2 Running Preparing 13 seconds ago

t2登录,执行命令找到该容器的id:

1
2
3
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e5813456854 alpine:3.4 "sleep 3000" 3 minutes ago Up 3 minutes terminal.1.1btubdkvijg6af5qkx1l6xs5t

执行登录terminal容器的命令(具体见Docker Alpine容器无法通过bash登录的问题):

1
docker exec -it 4e5813456854  sh

登录到容器后,需要安装curl,执行:

1
apk add --update curl

然后,执行命令访问hello-service服务:

1
curl http://hello-service:3000/hello/name

解释一下:

  • 服务是可以通过名字访问的,docker swarm mode提供了一套在swarm内针对服务的dns解析系统
  • 这让发现服务变得非常简单容易
  • 这个名字是支持负载均衡的,即:
    • 比如这个service的scale=2,那么访问会被平均分配到2个不同的service实例上的
    • 如果访问的service实例失效,是会自动转发到正常工作的service实例上的(这个我没有测试)

编写代码实现服务间交互#

未完。