swarm1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | type 必选项,1表示container,2表示swarm stack,3表示compose stack title 必选项 description 必选项 image 必选项,该应用使用的docker镜像 administrator_only 可选项,是否只有管理员可用模板 name 可选项,该模板在管理界面中显示的名称 log 可选项,自定义的logo registry 可选项,docker镜像的仓库,默认是Dockerhub command 可选项,容器里面运行的命令,如果没有指定,则默认运行dockerfile的 command network 可选项,模板使用的网络 volumes 可选项,模板使用的volume ports 可选项,模板exposed的端口 labels 可选项,模板上定义的labels privileged 可选项,容器是否能在超级权限启动 interactive 可选项,容器启动时是否是交互模式,即添加-i -t restart_policy 可选项,容器的重启策略 hostname 可选项,容器的主机名 note 可选项,关于模板的信息 platform 可选项,支持的平台,一般是linux或者windows categories 可选项,模板的类别,可以在UI上通过category来过滤 |
1 2 3 4 5 6 7 8 9 10 | primary 初级的 Dashboard 仪表板 App Templates 应用程序模板 Stacks 堆栈 Containers 容器 Volumes 卷 Secrets 秘密 Extensions 扩展 Endpoints 端点 Registries 注册处 |
然后在manager-node管理节点上看一下集群节点的状态:
1 2 3 4 5 | [root@manager-node ~] # docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1gi8utvhu4rxy8oxar2g7h6gr * manager-node Ready Active Leader ei53e7o7jf0g36329r3szu4fi node1 Ready Active f1obgtudnykg51xzyj5fs1aev node2 Ready Active |
温馨提示:更改节点的availablity状态
availability状态active、drain,其中:
1 2 | active:node可以接受来自manager节点的任务分派; drain:ode节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。 |
当状态改为drain后,那么该节点就不再接受任务分发,就算之前已经接受的任务也会转移到别的节点上。
1 2 3 | [root@manager-node ~] # docker node update --availability drain node1 #将node1节点下线 [root@manager-node ~] # docker node update --availability active node1 #将下线的节点再次上线 [root@manager-node ~] # docker node rm --force node1 #删除node1节点 |
Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。
1 2 3 4 5 6 | 在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式 [root@manager-node ~] # docker network create -d overlay ngx_net [root@manager-node ~] # docker network ls 。。。 3ye6vfp996i6 ngx_net overlay swarm 。。。 |
在manager-node节点上使用上面这个覆盖网络创建nginx服务:
1 2 3 | #这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。 #创建具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx [root@manager-node ~] # docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx |
使用 docker service ls 查看正在运行的服务的列表
1 2 3 | [root@manager-node ~] # docker service ls ID NAME REPLICAS IMAGE COMMAND 0jb5eebo8j9q my- test 1 /1 nginx |
查询Swarm中服务的信息
--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@manager-node ~] # docker service inspect --pretty my-test ID: 0jb5eebo8j9qb1zc795vx3py3 Name: my- test Mode: Replicated Replicas: 1 Placement: UpdateConfig: Parallelism: 1 On failure: pause ContainerSpec: Image: nginx Resources: Networks: 3ye6vfp996i6eq17tue0c2jv9 Ports: Protocol = tcp TargetPort = 80 PublishedPort = 80 |
1 2 3 4 5 6 | 查询到哪个节点正在运行该服务。如下该容器被调度到manager-node节点上启动了,然后访问http: //182 .48.115.237即可访问这个容器应用(如果调度到其他节点,访问也是如此) [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 2m8qqpoa0dpeua5jbgz1infuy my- test .1 nginx manager-node Running Running 3 minutes ago 注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。 |
1 2 3 4 | 有上面命令可知,该服务在manager-node节点上运行。登陆该节点,可以查看到nginx容器在运行中 [root@manager-node ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ea1d72007da nginx:latest "nginx -g 'daemon off" 4 minutes ago Up 4 minutes 80 /tcp my- test .1.2m8qqpoa0dpeua5jbgz1infuy |
-----------------------------------------------------------在Swarm中动态扩展服务(scale)-----------------------------------------------------------
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 比如将上面的my- test 容器动态扩展到5个,命令如下: [root@manager-node ~] # docker service scale my-test=5 和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器 [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 2m8qqpoa0dpeua5jbgz1infuy my- test .1 nginx manager-node Running Running 9 minutes ago aqko8yhmdj53gmzs8gqhoylc2 my- test .2 nginx node2 Running Running 2 minutes ago erqk394hd4ay7nfwgaz4zp3s0 my- test .3 nginx node1 Running Running 2 minutes ago 2dslg6w16wzcgboa2hxw1c6k1 my- test .4 nginx node1 Running Running 2 minutes ago bmyddndlx6xi18hx4yinpakf3 my- test .5 nginx manager-node Running Running 2 minutes ago 可以看到,之前my- test 容器只在manager-node节点上有一个实例,而现在又增加了4个实例。 这5个副本的my- test 容器分别运行在这三个节点上,登陆这三个节点,就会发现已经存在运行着的my- test 容器。 ---------------------------------------------------------------------------------------- |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | ------------- 特别需要清楚的一点: 如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。 比如: 将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来, 只能等别的节点出现故障后转移task实例到它的上面。使用命令 "docker node ls" ,发现node1节点已不在swarm集群中了。 然后过一会查询服务的状态列表 [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 2m8qqpoa0dpeua5jbgz1infuy my- test .1 docker.io /nginx manager-node Running Running 33 minutes ago aqko8yhmdj53gmzs8gqhoylc2 my- test .2 docker.io /nginx node2 Running Running 26 minutes ago di99oj7l9x6firw1ai25sewwc my- test .3 docker.io /nginx node2 Running Running 6 minutes ago erqk394hd4ay7nfwgaz4zp3s0 \_ my- test .3 docker.io /nginx node1 Shutdown Complete 5 minutes ago aibl3u3pph3fartub0mhwxvzr my- test .4 docker.io /nginx node2 Running Running 6 minutes ago 2dslg6w16wzcgboa2hxw1c6k1 \_ my- test .4 docker.io /nginx node1 Shutdown Complete 5 minutes ago bmyddndlx6xi18hx4yinpakf3 my- test .5 docker.io /nginx manager-node Running Running 26 minutes ago 发现,node1节点出现故障后,它上面之前的两个task任务已经转移到node2节点上了。 登陆到node2节点上,可以看到这两个运行的task任务。当访问182.48.115.239节点的80端口,swarm的负载均衡会把请求路由到一个任意节点的可用的容器上。 [root@node2 ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 216abf6bebea docker.io /nginx :latest "nginx -g 'daemon off" 7 minutes ago Up 7 minutes 80 /tcp my- test .3.di99oj7l9x6firw1ai25sewwc 1afd12cc9140 docker.io /nginx :latest "nginx -g 'daemon off" 7 minutes ago Up 7 minutes 80 /tcp my- test .4.aibl3u3pph3fartub0mhwxvzr cc90da57c25e docker.io /nginx :latest "nginx -g 'daemon off" 27 minutes ago Up 27 minutes 80 /tcp my- test .2.aqko8yhmdj53gmzs8gqhoylc2 再次在node2节点上将从node1上转移过来的两个task关闭 [root@node2 ~] # docker stop my-test.3.di99oj7l9x6firw1ai25sewwc my-test.4.aibl3u3pph3fartub0mhwxvzr my- test .3.di99oj7l9x6firw1ai25sewwc my- test .4.aibl3u3pph3fartub0mhwxvzr 再次查询服务的状态列表,发现这两个task又转移到node1上了(即在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上) [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 2m8qqpoa0dpeua5jbgz1infuy my- test .1 docker.io /nginx manager-node Running Running 38 minutes ago aqko8yhmdj53gmzs8gqhoylc2 my- test .2 docker.io /nginx node2 Running Running 31 minutes ago 7dhmc63rk0bc8ngt59ix38l44 my- test .3 docker.io /nginx node1 Running Running about a minute ago di99oj7l9x6firw1ai25sewwc \_ my- test .3 docker.io /nginx node2 Shutdown Complete about a minute ago erqk394hd4ay7nfwgaz4zp3s0 \_ my- test .3 docker.io /nginx node1 Shutdown Complete 9 minutes ago 607tyjv6foc0ztjjvdo3l3lge my- test .4 docker.io /nginx node1 Running Running about a minute ago aibl3u3pph3fartub0mhwxvzr \_ my- test .4 docker.io /nginx node2 Shutdown Complete about a minute ago 2dslg6w16wzcgboa2hxw1c6k1 \_ my- test .4 docker.io /nginx node1 Shutdown Complete 9 minutes ago bmyddndlx6xi18hx4yinpakf3 my- test .5 docker.io /nginx manager-node Running Running 31 minutes ago ---------------------------------------------------------------------------------------------------- 同理,swarm还可以缩容,如下,将my- test 容器变为1个。 [root@manager-node ~] # docker service scale my-test=1 [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 2m8qqpoa0dpeuasdfsdfdfsdf my- test .1 nginx manager-node Running Running 3 minutes ago 登录node2节点,使用docker ps 查看,会发现容器被stop而非 rm --------------------------------------------------------------------------------------------------- 删除容器服务 [root@manager-node ~] # docker service --help //查看帮助 [root@manager-node ~] # docker service rm my-test //这样就会把所有节点上的所有容器(task任务实例)全部删除了 my-nginx --------------------------------------------------------------------------------------------------- 除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。 [root@manager-node ~] # docker service update --replicas 3 my-test my- test 更新完毕以后,可以查看到REPLICAS已经变成3 /3 [root@manager-node ~] # docker service ls ID NAME REPLICAS IMAGE COMMAND d7cygmer0yy5 my- test 3 /3 nginx /bin/bash [root@manager-node ~] # docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR ddkidkz0jgor751ffst55kvx4 my- test .1 nginx node1 Running Preparing 4 seconds ago 1aucul1b3qwlmu6ocu312nyst \_ my- test .1 nginx manager-node Shutdown Complete 5 seconds ago 4w9xof53f0falej9nqgq064jz \_ my- test .1 nginx manager-node Shutdown Complete 19 seconds ago 0e9szyfbimaow9tffxfeymci2 \_ my- test .1 nginx manager-node Shutdown Complete 30 seconds ago 27aqnlclp0capnp1us1wuiaxm my- test .2 nginx manager-node Running Preparing 1 seconds ago 7dmmmle29uuiz8ey3tq06ebb8 my- test .3 nginx manager-node Running Preparing 1 seconds ago docker service update 命令,也可用于直接 升级 镜像等。 [root@manager-node ~] # docker service update --image nginx:new my-test [root@manager-node ~] # docker service ls ID NAME REPLICAS IMAGE COMMAND d7cygmer0yy5 my- test 3 /3 nginx:new /bin/bash |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现