Docker - Swarm与Ingress使用

一、任务解析

部署前后分离

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

  • 部署多个副本

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

  • Nginx 做反向代理统一入口

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

docker - swarm集群搭建

这里先去小编写的这篇博客搭建一个五台虚拟机的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 会为每个服务创建两个网络接口:

  1. Ingress 网络:这是 Swarm 的默认入口网络,用于负载均衡和对外暴露服务。它允许外部流量通过 Swarm 集群的入口点访问你的服务。-p 8888:80

  2. 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 网络有以下优势:

  1. 隔离性:你可以为不同的应用或环境创建独立的网络,这样可以避免不同应用之间的潜在冲突,并且提高了安全性。

  2. 更灵活的网络策略:自定义网络允许你设置更多的网络策略,例如限制哪些服务可以与哪个网络通信等。

  3. 跨主机通信:overlay 网络支持跨主机的服务间通信,使得位于不同节点上的服务能够像在同一台机器上一样相互通信。这对于分布式应用尤其重要。

  4. 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 createDocker 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 \
  服务名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值