使用 Docker Swarm(集群) 和Docker Stack(堆栈)部署容器化应用

1、Docker Swarm简介

说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管理你的服务。

与Kubernetes相比,Docker Swarm的群集管理功能相对简单,Swarm更适合于小型到中型的容器部署,并且通常用于简单的应用程序部署和管理。

如果经常用docker-compose 的人员来说,可以这样容易理解。

  • docker-compose:可以在一台机器上使用docker-compose.yml轻松部署多个服务(如nginx,php,mysql)
  • docker swarm:将一个服务部署至多台机器(如nginx,部署到机器1,机器2,机器3)

2、使用Docker Swarm部署应用

这里用swarm部署一个简单的应用nginx,测试并熟悉swarm。

2.1、准备工作

两台机器,系统ubuntu。
192.168.203.129,192.168.203.130,1台作为manage主服务器,1台作为worker节点。

注:生产环境建议是 3个manager 以上,如果只有2台
manager,当主manager挂掉之后,另一台从manager是不会升级为主manager的
,因为从manager升级为主manager的条件是存活的从manager节点个数必须大于1。

安装docker最新版本默认安装有docker swarm。

防火墙,如果是云服务器,请开放端口2377,允许与工作节点服务器通讯。
一般而言,如果是在多台物理机上搭建swarm集群,那么port就是2377,如果是在docker虚拟机上搭建的,那么port就是2376。

2.2、初始化swarm集群,创建主管理节点

我这里测试129为manager服务器,直接用命令初始化。这将在当前主机上创建一个 Swarm,并将其设置为 Swarm 的管理节点。在此过程中,Docker 会生成一个用于其他节点加入的 token,务必妥善保管这个 token。

sudo docker swarm init --advertise-addr 192.168.203.129

运行结果:

ubuntu@ubuntu:~$ sudo docker swarm init --advertise-addr 192.168.203.129
Swarm initialized: current node (xcpn4el8vvs2hymojpbay8m6q) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-08hc7u7ed38xnli6ikqzq8flfrr7kzn0bi7d2qiekdsxnstqlm-ed7h0bzk2dno6dmn8luzssj84 192.168.203.129:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

输出文字的意思是此地址已经加入到了这个swarm,你可以使用 docker swarm join --token xxxxx 命令将其它节点加入到这个swarm中来成为工作节点。

查看节点信息:sudo docker node ls,管理节点已经起来了。

ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           26.0.0

2.3、添加工作节点

在工作节点服务器,执行上面提示的token即可加入。

sudo docker swarm join --token SWMTKN-1-08hc7u7ed38xnli6ikqzq8flfrr7kzn0bi7d2qiekdsxnstqlm-ed7h0bzk2dno6dmn8luzssj84 192.168.203.129:2377

提示This node joined a swarm as a worker,没有报错说明已经加入管理节点。

住管理节点服务器,再次运行sudo docker node ls,查看节点,已经成功添加。

ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
iha4vzuoyihcblayk08v7mya4     ubuntu     Ready     Active                          26.0.0
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           26.0.0

这里swarm集群就已经搭建完了,是不是很简单。

节点类型转换,如果想将worker节点转换为manager节点,可以运行如下命令。

sudo docker node promote worker-nodename

worker-nodename为自己节点的名称,我这里也可以用ID操作,显示如下,切换成功,状态为Reachable。如果另外一台管理节点挂掉,则新加入的manager节点状态由reachable变为leader, 之前的manager节点状态为unreachable.

ubuntu@ubuntu:~$ sudo docker node promote iha4vzuoyihcblayk08v7mya4
Node iha4vzuoyihcblayk08v7mya4 promoted to a manager in the swarm.
ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
iha4vzuoyihcblayk08v7mya4     ubuntu     Ready     Active         Reachable        26.0.0
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           
<think>嗯,用户现在问的是Docker Swarm集群管理的应用场景、部署重点程序特点。之前他们问了Kubernetes的应用特点,现在转向Docker Swarm,可能是想比较这两者或者在寻找更轻量级的解决方案。首先,我需要回忆Docker Swarm的核心功能,它作为Docker原生的集群管理工具,相对于K8s来说更简单易用,适合中小型应用。 用户可能想知道Docker Swarm在哪些实际场景下适用,比如是否适合他们的项目规模或者技术栈。然后部署重点方面,可能需要强调初始化的步骤、网络配置、服务管理这些方面,因为Swarm部署确实比K8s简单,但也有一些需要注意的地方,比如节点的角色管理、服务发现等。程序特点的话,应该突出其内置在Docker引擎中的优势,声明式服务模型,以及Docker生态的无缝集成。 另外,用户之前已经了解过K8s,所以在回答时可能需要对比两者的不同,特别是Swarm的轻量级易用性,但也要提到它的局限性,比如生态系统扩展性不如K8s。需要确保回答结构清晰,分点列出应用场景、部署重点程序特点,可能还要给出部署步骤的简要说明,帮助用户快速上手。 还要注意用户可能没有提到的深层需求,比如是否适合他们的团队技能水平,或者是否需要考虑未来扩展。这时候需要指出Swarm适合快速部署小规模集群,而K8s更适合复杂大规模的环境。最后,确保语言口语化,避免技术术语堆砌,让用户容易理解。</think>以下是Docker Swarm集群管理的核心内容解析: --- ### **一、典型应用场景** 1. **轻量级容器编排** - 适合中小规模集群(10-50节点),快速部署无状态Web服务(如Nginx、Node.js应用) - 示例:部署3节点Swarm集群运行电商网站前端服务,利用全局服务(`--mode global`)在每个节点运行日志收集容器 2. **传统应用容器化迁移** - 将单体应用拆分为多个服务(如Java应用+MySQL),通过`docker-compose.yml`直接升级到Swarm集群 - 使用`docker stack deploy`批量部署多服务系统 3. **边缘计算场景** - 在资源受限的IoT设备集群中,通过轻量级Swarm管理容器化数据处理模块 --- ### **二、程序核心特点** | 特性 | 具体表现 | |---------------------|--------------------------------------------------------------------------| | **原生集成** | 直接通过`docker swarm`命令管理,无需额外安装组件 | | **极简架构** | 仅需`manager``worker`两种节点角色,无复杂控制平面组件 | | **服务模式** | 支持`replicated`(固定副本数)`global`(每个节点1副本)两种部署模式 | | **滚动更新** | 通过`--update-parallelism`控制批次,`--update-delay`设置间隔时间 | | **内置Overlay网络** | 自动创建跨节点虚拟网络,服务间通过服务名直接通信(DNS轮询负载均衡) | | **密钥管理** | 通过`docker secret`集中管理数据库密码、API密钥等敏感信息 | --- ### **三、部署重点步骤** #### **1. 集群初始化** ```bash # Manager节点初始化(自动生成token) docker swarm init --advertise-addr <MANAGER_IP> # Worker节点加入(使用init生成的token) docker swarm join --token SWMTKN-xxx <MANAGER_IP>:2377 ``` #### **2. 关键配置项** - **节点高可用**:部署≥3个manager节点,使用`docker node promote`提升节点角色 - **网络规划**: ```bash # 创建自定义Overlay网络(避免使用默认网络) docker network create -d overlay --subnet 10.1.0.0/24 my_net ``` - **存储卷映射**:通过`docker volume create`创建持久化存储,避免容器重启数据丢失 #### **3. 服务部署示例** ```yaml # docker-compose.yml version: '3.8' services: web: image: nginx:alpine ports: - "80:80" deploy: replicas: 3 update_config: parallelism: 2 delay: 10s networks: - my_net networks: my_net: driver: overlay ``` 执行部署:`docker stack deploy -c docker-compose.yml myapp` --- ### **四、运维关键点** 1. **故障排查工具** - `docker service logs`查看服务日志 - `docker node inspect`检查节点状态 - `docker network inspect`诊断网络连通性 2. **监控方案** - 内置`docker stats`查看容器资源使用 - 集成Prometheus+`cAdvisor`收集集群指标 3. **安全加固** - 定期轮换Swarm join token(`docker swarm join-token --rotate`) - 限制manager节点的API端口(2377/TCP)访问权限 --- ### **五、与Kubernetes对比** | 维度 | Docker Swarm | Kubernetes | |--------------------|---------------------------------------|-------------------------------------| | 学习曲线 | 1天内可掌握基本操作 | 需要1-2周系统学习 | | 集群规模 | 建议≤50节点 | 支持5000+节点 | | 扩展性 | 插件较少,依赖Docker生态 | 丰富的CRDOperator扩展机制 | | 更新策略 | 简单的滚动更新 | 蓝绿部署、金丝雀发布等高级策略 | | 适用场景 | 快速搭建小型容器平台 | 企业级复杂应用编排 | --- ### **六、总结** Docker Swarm以**极简设计****开箱即用**为核心优势,适合需要快速搭建容器编排系统的场景。其与Docker CLI的无缝衔接大幅降低学习成本,但在大规模集群管理、精细化调度等方面弱于Kubernetes。建议在原型验证、边缘计算等场景优先采用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值