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;

    }
}

results matching ""

    No results matching ""