docker - swarm
系统
docker 安装完即可使用 swarm,不需要额外安装什么软件,要说有什么优势,估计就是上手超快吧。
本文就先把常用的内容,快速地过一遍,快速起一个 helloworld,细节以后补充。
初始化
执行 docker swarm init --advertise-addr 127.0.0.1,127.0.0.1要写主机的 IP 地址。
注意保存命令的执行结果,执行结果就是一些命令,其它节点加入集群会用到。
docker swarm init --advertise-addr 127.0.0.1
Swarm initialized: current node (qcjc4vkza2nr4uj2p1fwvpx4e) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join
--token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so
127.0.0.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
创建各个各节点
这些命令都可以在初始化步骤中直接复制,如果前面步骤忘记保存,执行 docker swarm join-token 查看。
# 管理节点执行下面这个命令,之后根据提示进行操作
docker swarm join-token manager
# 普通节点执行下面这个命令
docker swarm join
--token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so
192.168.21.142:2377
查看节点信息
docker node ls
启停节点
# 节点下线,drain 状态下,node 节点会结束 task,且不再接受来自 manager 节点的任务分派
docker node update --availability drain [id]
# 节点上线,active 状态下,node 可以接受来自 manager 节点的任务分派;
docker node update --availability active [id]
# 让节点主动离开
docker swarm leave
# 移除一个节点,从 node 列表中完全清除
docker node rm [id]
节点分配
配置电脑的时候,电脑性能是有差别的,我们希望一些程序能装在特定的计算机上,如何区分不同的机子呢?
- 给各个主机重命名,更方便进行查看(只是方便看,生产环境可能不允许修改)
hostnamectl set-hostname <newhostname>
- 给每个节点定义标签和角色
# 重新确定 Leader,这个命令会清除所有 manager(转移 leader 节点的时候会用到)
docker swarm init --force-new-cluster --advertise-addr 192.168.21.142
# 设置一个角色
docker node update --role manager node2
# 设置一个标签
docker node update --label-add mylabel=true node2
# 移除一个标签
docker node update --label-rm mylabel node2
# 这些配置对应于 yml 中的 constraints 配置
- 查看各个节点的信息
docker node inspect node2
需要用到的端口
The network ports required for a Docker Swarm to function properly are:
- TCP port 2376 for secure Docker client communication. This port is required for Docker Machine to work. Docker Machine is used to orchestrate Docker hosts.
- TCP port 2377. This port is used for communication between the nodes of a Docker Swarm or cluster. It only needs to be opened on manager nodes.
- TCP and UDP port 7946 for communication among nodes (container network discovery).
- UDP port 4789 for overlay network traffic (container ingress networking).
专有名词解释
前面涉及到的,都是通用的概念,了解集群的基本都能理解,后面这些是 swarm 环境下才有的。
-
Task:一个调度任务,负责安装一个容器。
A task is analogous to a “slot” where the scheduler places a container.
译:任务类似于调度任务放置容器的 “插槽”。 -
Service:一个服务,负责安装一个镜像。
A service is the definition of the tasks to execute on the manager or worker nodes.
译:一个服务规定了任务在各个节点上的执行方式。(服务是对执行方式的一种声明、定义。) -
Node:字面意义上的节点,也就是 swarm 集群下每一个 docker。
A node is an instance of the Docker engine participating in the swarm.
译:node 是参与 swarm 集群的 docker 引擎的一个实例。
运维常用命令
# 使用 docker service ls 来查看当前 Swarm 集群运行的服务。
docker service ls
# 使用 docker service ps 来查看某个服务的详情。
docker service ps nginx
# 使用 docker service logs 来查看某个服务的日志。
docker service logs nginx
# 增加或者减少容器的数量。
# 我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。
docker service scale nginx=5
# 使用 docker service rm 来从 Swarm 集群移除某个服务。
docker service rm nginx
# 如果部署完成之后有配置文件的修改,则可以通过deploy来更新服务(与部署命令一致)
docker stack deploy -c docker-compose.yml wordpress
# 单个service更新
docker service update kafka_kafka2
# 要移除服务,使用 docker stack down
# 该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm
docker stack down wordpress
使用 yml 部署集群
利用 yml 文件开始创建 swarm 集群。
这是常用的部署方式,前期多花点时间编写 yml,写完就可以对文件进行整理归档。
运维人员也不会有太多学习压力,只要知道 deploy 命令,就可完成部署。
# 使用 yml 部署镜像,如果需要变更配置,重新执行这个命令即可
docker stack deploy -c docker-compose.yml example
文件参考:
version: "3.7"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- webnet
volumes:
- "webdata:/usr/share/nginx/html"
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:latest
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
webnet:
volumes:
webdata:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具