一、任务解析
部署前后分离
-
使用你自己的自定义镜像
-
部署多个副本
-
所有副本使用相同的配置和逻辑
-
Nginx 做反向代理统一入口
-
外部访问形式如:
http://your-domain/api/xxx
这里先去小编写的这篇博客搭建一个五台虚拟机的swarm集群
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
在私库服务器本地构建并推送镜像到 Docker Registry
-- 需要Dockerfile文件
docker build -t 192.168.24.141:5000/my-backend:1.0 .
注释:
docker build 构建镜像
-t 打标签,--tag的缩写)
. 构建当前目录下的dockerfile文件
管理机将镜像上传到 Docker Registry
docker push [ip]:5000/my-backend:1.0
1.2 下载镜像
在其他工作机上下载镜像
docker pull [镜像私库ip]:5000/my-backend:1.0
二、Docker Swarm 网络概念
当在 Docker Swarm 中创建服务时,默认情况下,Swarm 会为每个服务创建两个网络接口:
-
Ingress网络:这是Swarm的默认入口网络,用于负载均衡和对外暴露服务。它允许外部流量通过Swarm集群的入口点访问你的服务。-p 8888:80 -
Docker Gossip网络(内部网络):这个网络主要用于集群内部的管理和通信,但不适用于服务之间的直接通信。
2.1. 什么是 Ingress 网络?
`Ingress` 网络是一个特殊的 **Overlay(覆盖)网络**,是 `Docker Swarm` 默认自动创建的(`ingress`)。它的核心目的是以一种智能、负载均衡的方式,将外部客户端的请求**路由**到发布端口的服务上,无论这些服务的副本(容器)实际运行在哪个 `Swarm` 节点上。
2.2 Ingress 工作原理
当创建一个发布端口的服务时。
-- 可以自己去使用看看
docker service create -d --name svc1 --network overnet --publish published=5000,target=80 nginx

-
上述命令,部署了一个名为
“svc1”的Swarm服务。该服务连接到了overnet网络,并发布到5000端口。 -
按上述方式发布
Swarm服务(--publish published=5000,target=80)会在Ingress网络的5000端口进行发布。因为Swarm全部节点都接入了Ingress网络,所以这个端口被发布到了Swarm范围内。 -
集群确保到达
Ingress网络中 任意节点 的5000端口的流量,都会被路由到80端口的“svc1”服务。 -
当前
“svc1”服务只部署了一个副本,集群中有一条映射规则:“所有访问Ingress网络5000端口的流量都需要路由到运行了“svc1”服务副本的节点之上”。 -
红线展示了访问
Node的5000端口的流量,通过Ingress网络,被路由到了Node2节点正在运行的服务副本之上。
入站流量可能访问4个Swarm节点中的任意一个,但是结果都是一样的,了解这一点很重要。这是因为服务通过Ingress网络实现了Swarm范围内的发布。
此外,还有一点很重要:如果存在多个运行中的副本,流量会平均(
Swarm提供了内置的负载均衡器)到每个副本之上。
虽然 Swarm 的默认网络能够确保服务可以通过服务名称相互发现(比如通过 backend-api 这样的服务名),但在某些情况下,使用自定义的 overlay 网络有以下优势:
-
隔离性:你可以为不同的应用或环境创建独立的网络,这样可以避免不同应用之间的潜在冲突,并且提高了安全性。
-
更灵活的网络策略:自定义网络允许你设置更多的网络策略,例如限制哪些服务可以与哪个网络通信等。
-
跨主机通信:
overlay网络支持跨主机的服务间通信,使得位于不同节点上的服务能够像在同一台机器上一样相互通信。这对于分布式应用尤其重要。 -
DNS 解析:自定义
overlay网络提供了更好的服务发现机制。在同一个自定义网络中的服务可以通过服务名称互相解析并通信,而不需要依赖于 Swarm 的默认入口网络。
2.3 Ingress 与 Docker Gossip 的区别
Ingress网络与Docker Gossip网络的区别
Ingress网络与Docker Gossip网络的区别
| 特性 | Ingress 网络 (ingress) | Docker Gossip 网络 (通常指 docker_gwbridge) |
|---|---|---|
| 主要目的 | 对外暴露服务,实现负载均衡和服务发现 | Swarm 集群内部管理通信,容器与外界互联网的桥梁 |
| 网络模式 | Overlay 网络 (跨主机网络) | Bridge 网络 (本地桥接网络) |
| 可见性 | 对发布端口的服务外部客户端可见 | 仅对Swarm节点和容器本身可见,外部不可见 |
| 流量类型 | 入站流量 (外部 -> 服务) | 出站流量 (容器 -> 互联网),控制平面流量 (节点间通信) |
| 是否默认 | 是,Swarm 初始化时自动创建 | 是,Swarm 初始化时自动创建 docker_gwbridge |
| 用户配置 | 可自定义,但通常使用默认 | 可自定义参数,但每个节点都需要一个 |
| IP地址管理 | 由 Swarm 自动管理,为服务分配VIP | 为每个容器分配一个本地私有IP,用于NAT上网 |
2.4 创建覆盖 network
这个要在主节点上创建
docker network create --driver overlay --attachable app_network
注释:
--driver overlay 指定 overlay 驱动
--attachable
允许非 Swarm 服务(手动运行的容器)连接到这个 overlay 网络,默认情况下 overlay 网络仅对 Swarm 服务可见
不需要在所有机器上手动执行
docker network create --driver overlay app_network。只需要 在一个 Manager 节点上执行一次这个命令,Docker Swarm 就会自动将这个网络同步到集群中的所有节点(包括 Worker 和其他 Manager,但是 Worker 节点上的网络并没有出现,而是在创建其他服务使用该网络时,相应的 Worker 节点才会自动同步该网络,也就是按需同步的机制。),这样所有节点上的服务都可以使用这个网络。
创建一个临时服务,使用刚才创建的 app_network,并指定运行在 Worker 节点上
# 指定运行在 Worker 节点
docker service create --name test-network-sync --network app_network --constraint 'node.role==worker' --replicas 1 alpine sleep 300 # 使用一个轻量级镜像并执行一个短暂的任务
2.5 部署服务
主节点上部署
docker service create \
--name backend-api \
--network app_network \
--replicas 3 \
192.168.107.157:5000/my-backend:1.0
配置 Nginx 配置文件
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的副本上
2.6 启动 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=/opt/project/html,target=/usr/share/nginx/html \
--mount type=bind,source=/opt/project/nginx/default.conf,target=/etc/nginx/conf.d/default.conf \
--replicas 1 \
--constraint 'node.labels.role == lb' \
nginx:latest
| 参数 / 选项 | 具体含义 |
|---|---|
docker service create | Docker Swarm 中创建服务的核心命令(区别于单机的 docker run) |
--name my-nginx | 给服务命名为 my-nginx,方便后续管理(如查看日志、扩缩容) |
--network app_network | 将服务加入名为 app_network 的 Swarm 覆盖网络,让服务能和同网络的其他服务通信 |
--publish 80:80 | 端口映射:将宿主机的 80 端口映射到容器内的 80 端口(宿主机端口:容器端口) |
--mount type=bind,... | 绑定挂载(宿主机文件 / 目录和容器内对应路径关联,修改宿主机内容会实时同步到容器):- 第一处挂载:将宿主机 /opt/project/html 挂载到容器 Nginx 默认静态文件目录- 第二处挂载:将宿主机 /opt/project/nginx/default.conf 挂载到 Nginx 站点配置文件路径 |
--replicas 1 | 设置服务的副本数为 1(即只运行 1 个 Nginx 容器实例) |
--constraint 'node.labels.role == lb' | 节点约束:仅在带有 role == lb 标签的 Swarm 节点上运行该服务(通常用于指定负载均衡节点) |
nginx:latest | 服务使用的基础镜像:官方最新版 Nginx |
测试访问
curl http://localhost/api/getMsg
来访问你的后端服务。请求会由 Nginx 转发到任意一个 backend-api 副本上,实现负载均衡。
2.7 更新服务
如果你更新了镜像,可以这样滚动更新:
docker service update \
--image 【镜像名】:【镜像版本】 \
--update-parallelism 2 \
--update-delay 10s \
服务名
注释:
--update-parallelism 2 一次更新两个服务
--update-delay 10s 更新一次休息10秒
如果后台压力过大可以多增加几个后台服务
-- 将服务增加10个
docker service update \
--replicas 10 \
服务名
265

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



