转载请注明原始出处:http://blog.csdn.net/a464057216/article/details/71123165
后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
阅读本篇内容前,需要在Docker Registry上提前共享自己制作好的镜像。如果还没有,请阅读前一篇博文:Docker的初级使用:容器。
服务Service
线上产品一般由多个模块组成,比如web网站的前后端、数据库操作层、nginx服务器等,不同模块由于性能要求不同,可能需要多实例部署,实际生产中使用docker run
的方式启动容器是非常不易管理的,Docker提供了服务编排的功能可以方便扩展应用规模、配置流量负载均衡等。
服务编排通过YAML格式的配置文件定义,例如docker-compose.yml
(文件名字任意):
version: "3"
services:
web:
image: hub.c.163.com/learndocker/learndocker:v1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
上面的YAML文件定义如下几个规则:
- 运行5个
learndocker
的容器实例组成名为web
的服务,每个实例限制最高使用10%的整机CPU和50M内存。 - 如果某个容器运行失败,立即重启失败的容器。
- 建立宿主机的80端口到容器的80端口的映射。
- 令
web
服务的5个容器通过名为webnet
的网络共享80端口。 webnet
网络采用默认配置,即负载均衡覆盖网络,依次轮询每个子节点。
首先初始化集群服务,使用Docker的服务(service)功能必须先运行docker swarm init
,为了信息安全我把节点的node ID
用<node ID>
替代,token
码用<token>
替代:
$ docker swarm init
Swarm initialized: current node (<node ID>) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token <token> \
<ip>:<port>
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
随后登录Docker Registry,从Registry拉取镜像在一台机器运行服务(服务包含5个容器实例),learndocker
是给应用起的名字:
# Written by: CSDN - Mars Loo的博客
$ docker login hub.c.163.com
Username: marsloo
Password:
Login Succeeded
$ docker stack deploy -c docker-compose.yml learndocker
Creating network learndocker_webnet
Creating service learndocker_web
通过docker service ls
命令查看service id
,同时显示服务名(格式为<app_name>_<service_name>
),副本个数、镜像名:
$ docker service ls
ID NAME MODE REPLICAS IMAGE
9ujpa45jwkee learndocker_web replicated 5/5 hub.c.163.com/learndocker/learndocker:v1
一个服务内的每个容器称为任务(Task
),查看服务内Task运行情况:
$ docker service ps learndocker_web
docker service ps learndocker_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
6eisrbhjvya7 learndocker_web.1 hub.c.163.com/learndocker/learndocker:v1 moby Running Running 18 seconds ago
ftpo2tfhwk4d learndocker_web.2 hub.c.163.com/learndocker/learndocker:v1 moby Running Running 19 seconds ago
hrd76b70hdvn learndocker_web.3 hub.c.163.com/learndocker/learndocker:v1 moby Running Running 17 seconds ago
s9hfn4v4bvlz learndocker_web.4 hub.c.163.com/learndocker/learndocker:v1 moby Running Running 20 seconds ago
s9y3hpbzwn13 learndocker_web.5 hub.c.163.com/learndocker/learndocker:v1 moby Running Running 18 seconds ago
容器运行情况:
# Written by: CSDN - Mars Loo的博客
$ docker stack ps learndocker
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kymj866ml0n0 learndocker_web.1 hub.c.163.com/learndocker/learndocker:v1 localhost.localdomain Running Preparing about a minute ago
cnebfmpfmoob learndocker_web.2 hub.c.163.com/learndocker/learndocker:v1 localhost.localdomain Running Preparing about a minute ago
d6h6nlvqzb2x learndocker_web.3 hub.c.163.com/learndocker/learndocker:v1 localhost.localdomain Running Preparing about a minute ago
i7ezt3v2veas learndocker_web.4 hub.c.163.com/learndocker/learndocker:v1 localhost.localdomain Running Preparing about a minute ago
o32fpbvvdtdm learndocker_web.5 hub.c.163.com/learndocker/learndocker:v1 localhost.localdomain Running Preparing about a minute ago
浏览器访问主机的80端口,刷新几次浏览器可以发现Hostname是变化的,证明进行了负载均衡:
如果要增加容器运行的实例数量,直接修改YAML文件,然后docker stack deploy -c docker-compose.yml learndocker
即可,docker会增加相应的数量的容器,不会影响已经运行的容器。
停止运行应用:docker stack rm <appname>
,然后在swarm manager节点退出集群并删除:docker swarm leave --force
。
查看所有的应用列表:docker stack ls
查看某个应用的所有服务:docker stack services <appname>
集群Swarm
Docker swarm适用于多机多容器场景,swarm指运行Docker且加入同一个集群的机器(物理机或虚拟机)的集合。在swarm manager执行命令,相当于在集群执行命令,其余机器的角色是swarm worker。加入集群后,机器称为节点。
Swarm manager可以按不同策略运行容器,比如“空闲模式”——分配容器给利用率最低的机器,“全局模式”——确保每台机器都获得容器的一个运行实例。在Docker集群中,swarm manager起到管理作用,其余swarm worker仅仅起到扩容作用。
在swarm manager机器上使用docker swarm init
使能集群模式,然后在其他worker机器上使用类似如下命令加入集群:
# Written by: CSDN - Mars Loo的博客
docker swarm join \
--token <token> \
<ip>:<port>
This node joined a swarm as a worker.
如果出现类似Error response from daemon: rpc error: code = 14 desc = grpc: the connection is unavailable
的错误,可能是由于防火墙引起的,需要正确配置防火墙或关闭防火墙(为了应用安全,建议正确配置防火墙)。
在swarm manager节点使用docker node ls
命令可以查看集群内所有节点的情况。docker node inspect <node ID>
可以检查某个节点的情况。
worker加入集群后,在swarm manager上使用docker stack deploy -c config.yml <appname>
启动应用,然后使用docker stack ps <appname>
命令即可查看容器在集群中的分布情况:
# Written by: CSDN - Mars Loo的博客
$ docker stack ps learndocker
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
hff3wyl7ax3c learndocker_web.1 hub.c.163.com/learndocker/learndocker:v1 bogon Running Starting 2 seconds ago
exxmh1oj8e1w learndocker_web.2 hub.c.163.com/learndocker/learndocker:v1 bogon Running Starting 1 second ago
6b2mnx6n9zal learndocker_web.3 hub.c.163.com/learndocker/learndocker:v1 centos7.bak Running Preparing 6 seconds ago
qsv3sxschn1n learndocker_web.4 hub.c.163.com/learndocker/learndocker:v1 bogon Running Starting 1 second ago
yr58eka5b7gs learndocker_web.5 hub.c.163.com/learndocker/learndocker:v1 centos7.bak Running Preparing 6 seconds ago
如果镜像共享在自建的Docker Registry,部署时可以增加--with-registry-auth
参数,例如:docker stack deploy --with-registry-auth -c config.yml learndocker
。
如果集群中加入了新的机器、服务YAML配置有变化、镜像有更新,在swarm manager上重新运行docker stack deploy -c config.yml <appname>
命令即可。通过集群方式部署服务后,通过每个swarm节点的80端口均可访问服务,Docker底层通过入口路由网络(ingress routing mesh)实现此功能,入口路由网络图式如下:
即HTTP请求无论发往哪个机器的80端口,通过负载均衡算法,均可将请求转发至集群内的所有容器。使能入口路由网络依赖集群中的节点开放如下端口:
- 网络发现依赖TCP/UDP的7946端口
- Ingress网络依赖UDP的4789端口
如果某个worker节点要退出集群,使用docker swarm leave
命令。集群中所有worker节点退出后,如果要删除集群,最后在swarm manager节点执行docker swarm leave --force
命令。
如果忘记了某个集群的加入token码,可以在swarm manager机器上执行docker swarm join-token -q worker
命令查询。
接下来请继续阅读通过栈的方式在产品中使用Docker。
如果觉得我的文章对您有帮助,欢迎关注我(CSDN:Mars Loo的博客)或者为这篇文章点赞,谢谢!