一、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 本练习要点回顾
- 单节点Swarm集群初始化:理解管理节点和工作节点的概念
- 服务部署:掌握docker service create的基本用法
- 服务管理:学习服务的扩展、更新和删除操作
- 网络配置:了解覆盖网络在Swarm中的作用
- 高级特性:实践约束条件、资源限制和更新策略
5.2 生产环境扩展建议
- 多节点部署:至少3个管理节点实现高可用
- 安全配置:配置TLS加密和认证
- 监控系统:集成Prometheus和Grafana监控
- 日志管理:配置集中式日志收集
- 持久化存储:为有状态服务配置volume
通过本教程,可以掌握Docker Swarm集群的核心概念和基本操作。这些技能是构建更复杂、多节点生产环境的基础。建议在实际项目中逐步应用这些知识,并根据具体需求探索更高级的Swarm功能和集成方案。


被折叠的 条评论
为什么被折叠?



