Linux中Docker Swarm实践

发布于:2025-08-12 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、部署前后分离

  • 使用你自己的自定义镜像

  • 部署多个副本

  • 所有副本使用相同的配置和逻辑

  • Nginx 做反向代理统一入口

  • 外部访问形式如:http://your-domain/api/xxx

1.1 建立私库

镜像已构建并推送到可访问的镜像仓库

启动 Docker Registry 容器

docker run -d -p 5000:5000 --restart=always --name registry registry:2

这会在本地启动一个私有的 Docker Registry,并监听 5000 端口。

配置 HTTPS 或者信任不安全的 Registry,可以通过以下方式让 Docker 客户端信任这个不安全的 Registry:

每个机器都要编辑 /etc/docker/daemon.json 文件(如果没有则创建),添加如下内容:

{
  "insecure-registries" : ["【ip】:5000"]
}

每个机器都要,然后重启 Docker 服务:

sudo systemctl restart docker

管理机上将 my-java 并推送镜像到 Docker Registry

docker tag my-java [ip]:5000/my-backend:1.0

管理机将镜像上传到 Docker Registry

docker push [ip]:5000/my-backend:1.0

1.2 下载镜像

在其他工作机上下载镜像

docker pull [镜像私库ip]:5000/my-backend:1.0

1.3 创建覆盖 network

这个要在主节点上创建

docker network create --driver overlay --attachable app_network

1.4 部署服务

主节点上部署

docker service create \
  --name backend-api \
  --network app_network \
  --replicas 3 \
  192.168.107.157:5000/my-backend:1.0

创建 Nginx 配置文件

mkdir /test

cd /test

vim default.conf

upstream backend_api {
    server backend-api:8081;
}

server {
    listen 80;
    server_name localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ =404;
    }

    location ~ ^/api/(.*)$ {
        rewrite ^/api/(.*)$ /$1 break;
        proxy_pass http://backend_api;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}

注意:

backend-api 是你上面创建的服务名称

请求 /api/xxx 会被转发到任意一个 backend-api 的副本上

1.5 启动 Nginx 服务

manager添加标签并进行节点更新

docker node update --label-add role=lb manager

注释:
标签role
值为lb

根据标签指定部署

docker service create \
  --name my-nginx \
  --network app_network \
  --publish 80:80 \
  --mount type=bind,source=/test/default.conf,target=/etc/nginx/conf.d/default.conf \
  --replicas 1 \
  --constraint 'node.labels.role == lb' \
  nginx:latest

注释:
constraint   指定部署到标签值为lb的机器
replicas     运行一台机器 
mount        运行指定文件

测试访问

curl http://localhost/api/getMsg

来访问你的后端服务。请求会由 Nginx 转发到任意一个 backend-api 副本上,实现负载均衡。

1.6 更新服务

如果你更新了镜像,可以这样滚动更新:

docker service update \
  --image 【镜像名】:【镜像版本】 \
  --update-parallelism 2 \
  --update-delay 10s \
  服务名

注释:

--update-parallelism 2      一次更新两个服务
--update-delay 10s          更新一次休息10秒

如果后台压力过大可以多增加几个后台服务

-- 将服务增加10个
docker service update \
  --replicas 10 \
  服务名