Docker Swarm集群实战教程:从单节点部署到多节点集群

一、Docker Swarm集群基础

1.1 什么是Docker Swarm?

Docker Swarm是Docker官方提供的原生容器编排工具,它将多个Docker主机组织成一个虚拟的单一主机,实现容器的集中管理和调度。Swarm模式内置于Docker引擎中,无需额外安装复杂组件。

1.2 Swarm核心概念

  • ​管理节点(Manager Node)​​:负责集群状态维护、任务调度和服务编排
  • ​工作节点(Worker Node)​​:接收并执行来自管理节点的任务
  • ​服务(Service)​​:定义在集群中运行的应用,包括镜像、副本数、网络配置等
  • ​任务(Task)​​:服务的最小执行单元,对应一个运行的容器
  • ​覆盖网络(Overlay Network)​​:跨节点容器通信的网络解决方案

1.3 Swarm优势特点

  • ​简单易用​​:与Docker原生API兼容,学习曲线平缓
  • ​内置高可用​​:通过Raft共识算法实现管理节点高可用
  • ​服务发现​​:内置DNS服务,支持服务自动发现
  • ​负载均衡​​:内置的入口负载均衡机制
  • ​滚动更新​​:支持零停机时间的应用更新

二、单节点Swarm集群部署练习

2.1 环境准备(单节点练习环境)

​系统要求​​:

  • Linux服务器(推荐Ubuntu 20.04/22.04或CentOS 7/8)
  • Docker Engine 20.10.0或更高版本
  • 至少2GB内存,2核CPU

​本练习将使用单节点模拟Swarm集群​​(生产环境建议至少3个管理节点)

2.1.1 安装Docker(如未安装)
# 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
docker --version
2.1.2 检查Docker状态
# 检查Docker服务状态
sudo systemctl status docker

# 启动Docker(如果未运行)
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

2.2 初始化单节点Swarm集群

# 初始化Swarm集群(单节点既是管理节点也是工作节点)
docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')

# 或者明确指定IP(推荐)
# docker swarm init --advertise-addr 192.168.1.100

# 执行后会输出类似以下内容:
# Swarm initialized: current node (abc123...) is now a manager.
# 
# To add a worker to this swarm, run the following command:
# 
#     docker swarm join --token SWMTKN-1-xxxx 192.168.1.100:2377
# 
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

​重要说明​​:

  • --advertise-addr:指定管理节点对外通信的IP地址
  • 输出的token用于其他节点加入集群
  • 当前节点既是管理节点(Manager)也是工作节点(Worker)

2.3 验证单节点集群状态

# 查看节点列表
docker node ls

# 预期输出(单节点情况下):
# ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
# abc123... * (manager)         your-hostname       Ready               Active              Leader              24.0.7

# 查看Swarm详细信息
docker info | grep -i swarm

# 预期输出应包含:
# Swarm: active
#  Is Manager: true
#  NodeID: xxxxxxx
#  Is Leader: true

2.4 创建覆盖网络(用于多节点服务通信)

# 创建覆盖网络(跨节点容器通信必需)
docker network create --driver overlay --attachable my-overlay-network

# 验证网络创建
docker network ls

# 查看网络详情
docker network inspect my-overlay-network

2.5 部署第一个Swarm服务

​部署Nginx Web服务​​:

# 部署Nginx服务,3个副本,暴露8080端口
docker service create \
  --name nginx-service \
  --replicas 3 \
  --publish published=8080,target=80 \
  --network my-overlay-network \
  nginx:alpine

# 参数说明:
# --name: 服务名称
# --replicas: 副本数量
# --publish: 端口映射(主机端口:容器端口)
# --network: 使用的覆盖网络

​验证服务部署​​:

# 查看所有服务
docker service ls

# 预期输出:
# ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
# xyz123...          nginx-service       replicated          3/3                 nginx:alpine        *:8080->80/tcp

# 查看服务详情
docker service ps nginx-service

# 查看服务日志(查看任意一个任务的日志)
docker service logs nginx-service

# 访问服务(在管理节点上执行)
curl http://localhost:8080
# 或者在浏览器访问 http://<服务器IP>:8080

2.6 管理Swarm服务

​扩展服务副本数​​:

# 将nginx服务从3个副本扩展到5个
docker service scale nginx-service=5

# 或者使用update命令
# docker service update --replicas 5 nginx-service

# 验证扩展结果
docker service ps nginx-service

​更新服务镜像​​:

# 将nginx从alpine版本更新到最新稳定版
docker service update --image nginx:latest nginx-service

# 查看更新进度
docker service ps nginx-service

​回滚服务更新​​:

# 如果更新出现问题,可以回滚到上一个版本
docker service update --rollback nginx-service

​删除服务​​:

# 删除nginx服务
docker service rm nginx-service

三、单节点Swarm集群练习任务

3.1 练习1:部署多服务应用

​目标​​:部署一个包含前端(Nginx)和后端(Node.js)的简单应用

# 1. 创建专用网络
docker network create --driver overlay app-network

# 2. 部署Node.js后端服务(示例使用简单的HTTP服务器)
# 首先创建一个简单的Node.js应用Dockerfile
cat <<EOF > Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY server.js .
RUN npm install express
CMD ["node", "server.js"]
EOF

# 创建server.js文件
cat <<EOF > server.js
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from Node.js backend!');
});

app.listen(port, () => {
  console.log(\`Backend server running on port \${port}\`);
});
EOF

# 构建后端镜像
docker build -t my-node-backend .

# 3. 部署后端服务
docker service create \
  --name node-backend \
  --replicas 2 \
  --network app-network \
  --publish published=3000,target=3000 \
  my-node-backend

# 4. 部署Nginx前端服务
cat <<EOF > nginx.conf
events {}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://node-backend:3000;
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
        }
    }
}
EOF

# 创建nginx配置文件和Dockerfile
mkdir nginx-app && cd nginx-app
echo "$nginx.conf" > nginx.conf

cat <<EOF > Dockerfile
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EOF

# 构建nginx镜像
docker build -t my-nginx-proxy .

# 5. 部署Nginx服务
docker service create \
  --name nginx-proxy \
  --replicas 2 \
  --network app-network \
  --publish published=8081,target=80 \
  my-nginx-proxy

# 6. 验证应用
# 在管理节点上执行:
curl http://localhost:8081
# 应该看到 "Hello from Node.js backend!"

3.2 练习2:配置服务约束和资源限制

​目标​​:为服务设置运行约束和资源限制

# 1. 删除之前的nginx服务(如果存在)
docker service rm nginx-service

# 2. 部署带约束和资源限制的nginx服务
docker service create \
  --name constrained-nginx \
  --replicas 2 \
  --publish published=8082,target=80 \
  --constraint 'node.role==worker' \  # 只在worker节点运行(单节点环境下会自动忽略)
  --constraint 'engine.labels.region==china' \  # 自定义标签约束
  --limit-cpu 0.5 \  # 限制CPU使用为0.5核
  --limit-memory 256M \  # 限制内存为256MB
  --reserve-cpu 0.1 \  # 保留0.1核CPU
  --reserve-memory 128M \  # 保留128MB内存
  nginx:alpine

# 3. 为当前节点添加标签(因为单节点既是manager也是worker)
docker node update --label-add region=china $(docker node ls -q)

# 4. 查看服务配置
docker service inspect --pretty constrained-nginx

3.3 练习3:配置滚动更新策略

​目标​​:部署带有滚动更新策略的服务

# 1. 部署带滚动更新策略的nginx服务
docker service create \
  --name rolling-update-nginx \
  --replicas 3 \
  --publish published=8083,target=80 \
  --update-parallelism 1 \  # 每次更新1个副本
  --update-delay 10s \  # 每次更新间隔10秒
  --update-failure-action rollback \  # 更新失败时回滚
  --update-max-failure-ratio 0.3 \  # 允许30%的失败率
  --rollback-parallelism 1 \  # 回滚时每次回滚1个副本
  --rollback-delay 5s \  # 回滚间隔5秒
  nginx:alpine

# 2. 查看更新配置
docker service inspect --pretty rolling-update-nginx

# 3. 测试更新策略(模拟更新)
docker service update --image nginx:1.23-alpine rolling-update-nginx

# 4. 观察更新过程
watch -n 1 'docker service ps rolling-update-nginx'

四、单节点Swarm集群管理命令总结

4.1 集群管理命令

命令描述
docker swarm init初始化Swarm集群
docker swarm join加入现有Swarm集群
docker swarm leave离开当前Swarm集群
docker node ls列出集群中的所有节点
docker node inspect <NODE-ID>查看节点详细信息
docker node update更新节点配置

4.2 服务管理命令

命令描述
docker service create创建新服务
docker service ls列出所有服务
docker service ps <SERVICE>查看服务任务
docker service inspect查看服务详情
docker service update更新服务配置
docker service scale扩展/缩减服务副本数
docker service rm删除服务

4.3 网络管理命令

命令描述
docker network create创建网络
docker network ls列出网络
docker network inspect查看网络详情

五、练习总结与扩展

5.1 本练习要点回顾

  1. ​单节点Swarm集群初始化​​:理解管理节点和工作节点的概念
  2. ​服务部署​​:掌握docker service create的基本用法
  3. ​服务管理​​:学习服务的扩展、更新和删除操作
  4. ​网络配置​​:了解覆盖网络在Swarm中的作用
  5. ​高级特性​​:实践约束条件、资源限制和更新策略

5.2 生产环境扩展建议

  1. ​多节点部署​​:至少3个管理节点实现高可用
  2. ​安全配置​​:配置TLS加密和认证
  3. ​监控系统​​:集成Prometheus和Grafana监控
  4. ​日志管理​​:配置集中式日志收集
  5. ​持久化存储​​:为有状态服务配置volume

通过本教程,可以掌握Docker Swarm集群的核心概念和基本操作。这些技能是构建更复杂、多节点生产环境的基础。建议在实际项目中逐步应用这些知识,并根据具体需求探索更高级的Swarm功能和集成方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值