docker-swarm
单机部署示例
# 初始化集群
docker swarm init
# 设置节点标签
docker node update --label-add nodetype=InDrive \
--label-add nodelabels=Middleware \
--label-add nodeportainer=Portainer \
$(docker node ls -q)
# 创建共享网络
docker network create -d overlay --attachable macrowing
docker network create -d overlay --attachable agent_network
# 部署中间件
docker stack deploy -c middleware_test.yml middleware
# 部署应用服务
docker stack deploy -c app.yml app
# 部署管理服务
docker stack deploy -c portainer.yml portainer
# 创建所有需要的本地目录
mkdir -p /data_dir/data/{mysql,redis,rabbitmq,es}
# 查看服务状态
docker service ls
watch docker service ls
# 检查特定服务日志
docker service logs app_nginx --tail 100
docker service logs -f app_nginx
# 验证网络连通性
docker exec -it $(docker ps -q -f name=app_nginx) curl http://middleware_mysql:3306
# 查看集群运行情况
docker stack ls
多机部署
# 集群初始化命令
# 在主节点执行
docker swarm init --advertise-addr <管理节点IP>
# 在工作节点执行(显示在init命令的输出中)
docker swarm join --token <TOKEN> <管理节点IP>:2377
# 节点标签设置
# 设置中间件节点(假设节点ID为abc123)
docker node update --label-add nodelabels=Middleware abc123
# 设置应用节点(假设节点ID为def456)
docker node update --label-add nodetype=InDrive def456
# 设置管理节点(主节点自身)
docker node update --label-add nodeportainer=Portainer $(docker node ls -q -f role=manager)
应用服务的compose.yml调整
# 所有应用服务部署到应用节点
services:
xxxx:
deploy:
placement:
constraints:
- node.labels.nodetype == InDrive
# 增加节点角色约束(可选)
- node.role == worker
中间件的compose.yml调整
services:
mysql:
deploy:
placement:
constraints:
- node.labels.nodelabels == Middleware
# 防止部署到管理节点
- node.role != manager
管理服务的compose.yml调整
services:
portainer:
deploy:
placement:
constraints:
- node.labels.nodeportainer == Portainer
# 固定到管理节点
- node.role == manager
多机部署命令序列
# 1. 在管理节点创建共享网络
docker network create -d overlay --attachable macrowing
docker network create -d overlay --attachable agent_network
# 2. 中间件部署到指定节点
docker stack deploy -c middleware.yml -c middleware-secrets.yml middleware
# 3. 应用服务部署到另一批节点(等待中间件就绪)
docker stack deploy -c app-services.yml -c app-configs.yml app
# 4. 最后部署Portainer
docker stack deploy -c portainer-agent.yml portainer
多机特殊配置
存储卷处理
# 使用NFS共享存储(示例)
volumes:
- type: volume
source: nfs_share
target: /xxxxDocs
volume:
nocopy: true
volumes:
nfs_share:
driver: local
driver_opts:
type: nfs
o: addr=<NFS服务器IP>,rw
device: ":/path/to/nfs/share"
服务副本控制
# 在文档1中增加负载均衡
services:
nginx:
deploy:
replicas: 2 # 多实例部署
update_config:
parallelism: 1
delay: 10s
跨节点通信优化
# 调整Swarm参数(在管理节点执行)
docker swarm update --max-snapshots 5
docker swarm update --cert-expiry 720h
关键验证命令
# 查看节点标签分布
docker node ls -q | xargs docker node inspect -f '{{ .Description.Hostname }} {{ .Spec.Labels }}'
# 检查服务分布情况
docker service ps app_nginx --no-trunc
# 跨节点网络测试
docker exec -it $(docker ps -q -f name=middleware_mysql) ping app_nginx
中间件代理配置
user nginx;
worker_processes 10;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 50000;
}
stream {
upstream mysql {
server mysql:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 9527;
proxy_connect_timeout 10s;
proxy_timeout 120s;
proxy_pass mysql;
}
upstream es {
server es:9200 max_fails=3 fail_timeout=30s;
}
server {
listen 9528;
proxy_connect_timeout 10s;
proxy_timeout 120s;
proxy_pass es;
}
upstream rabbitmq {
server rabbitmq:15672 max_fails=3 fail_timeout=30s;
}
server {
listen 9529;
proxy_connect_timeout 10s;
proxy_timeout 120s;
proxy_pass rabbitmq;
}
upstream redis {
server redis:6379 max_fails=3 fail_timeout=30s;
}
server {
listen 9530;
proxy_connect_timeout 10s;
proxy_timeout 120s;
proxy_pass redis;
}
}