在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,如果有一个视频共享网站,它可能包括一个用于将应用程序数据存储在数据库中的服务,一个在用户上传东西后在后台进行视频转码的服务,一个用于前端页面的服务等等。
服务实际上只是“生产中的容器”。每个服务只运行一个映像,但它编码了镜像的运行方式 - 应该使用哪个端口,容器应运行多少个副本以满足性能要求等等。 伸缩服务可以更改运行该软件的容器实例的数量,从而为进程中的服务分配更多计算资源。
定义、运行和伸缩 Docker 平台的服务很简单,只需要写一个 docker-compose.yml 文件。
Swarm services使用声明性模型,这意味着你可以定义服务的理想状态,并依靠Docker保持状态。状态信息如下:
- 运行服务容器所依赖的镜像名称和tag
- 该服务包含多少容器
- 是否有任何端口暴露在swarm集群的客户端上
- 当docker服务启动时,service是否自动启动
- 重新启动服务时发生的特定行为(例如是否使用回滚重新启动)
- 服务可以运行的节点的特性(如资源约束和位置偏好
一、docker service常用命令
常用命令我们主要看docker官网文档:docker service —— https://docs.docker.com/engine/reference/commandline/service_create/
// 1、docker service create 创建一个服务
// replicas 参数是指运行实例个数
// name 参数指定服务名称
// alpine 指的是使用的镜像名称
// ping docker.com 指的是容器运行的bash
docker service create --replicas 5 --name myhelloworld alpine ping docker.com
// 2、查看创建出来的服务
docker service ls
// 3、docker service update更新服务
// --publish-add参数指添加或者更新一个对外端口
// --image参数指更新镜像
// --hostname 更新或指定容器名称
// --force 指强制更新,即使本次更新没有任何改变
docker service update --publish-add 80 my_web
docker service update --image test_modb_front --force test_emcs-front
// 4、docker service inspect查看服务详情
docker service inspect my_web
// 5、docker service ps 搜索服务命令
docker service ps my_web
// 6、docker service rm删除服务
docker service rm my_web
// 7、docker service scale 扩展一个或多个服务
docker service scale webtier_nginx=5
二、docker service更新流程
serive更新其实并不是简单的更新,在swarm模式下的service都是在运行中的,是正在运行的时候进行更新。swarm用在生产环境,我们不想因为更新版本中断咱们的业务,想的是不影响正常的业务开展。在现实生产环境进行不宕机的更新远比现在咱们这种要复杂的多的多,咱们这次演示可能稍微简单,只是让大家明白一个思路。
我们测试的具体步骤如下:先创建一个service,从hub中拉取1.0版本,然后扩展service里面的容器数量为2,通过shell脚本的方式访问容器返回结果,然后将拉取1.0的版本升级为2.0版本,查看shell访问的返回是否中断。
1、必须创建overlay的network —— 创建名为 demo 的 overlay 网络
sudo docker network create -d overlay demo
2、创建servie
(1)拉取 1.0 版本,创建 python-flask-demo:1.0 服务,映射本地的 8080 端口 到 容器的 5000 端口
docker service create --name web -p 8080:5000 --network demo python-flask-demo:1.0
docker service ls
docker service ps web
(2)横向扩展容器数量
docker service scale web=2
docker service ls
docker service ps web
3、shell 循环请求 web —— 我们为了在测试更新过程中,查看更新时服务中不中断,所以写一个 shell 脚本一直访问
sh -c "while true;do curl 127.0.0.1:8080&&sleep 1;done"
4、开始更新为2.0版本 —— 更新过程中服务没有中断
docker service update --image python-flask-demo:2.0 web
// 1.0已经shutdown了,启动了2.0
docker service ps web
5、更新端口 —— 端口更新可能存在业务中断的情况
更新 service 端口映射 —— 将 外部访问端口 8080 变换为 8888
docker service update --publish-rm 8080:5000 --publish-add 8088:5000 web
docker service ps web
更新流程部分来源于这篇博客的学习笔记:https://blog.csdn.net/zhugeaming2018/article/details/8237922