当前位置: 首页 > article >正文

Docker Overlay 网络的核心工作(以跨节点容器通信为例)

Docker 的 overlay 网络是一种基于 VXLAN(Virtual Extensible LAN)的多主机网络模式,专为 Docker Swarm 集群设计,用于实现跨节点的容器通信。它通过虚拟二层网络,允许容器在不同主机上像在同一局域网内一样通信。Docker 在实现 overlay 网络时,协调用户态(Docker 守护进程、libnetwork)和内核态(Linux 网络栈、VXLAN 模块),完成从网络创建到数据包转发的复杂工作。以下是以 Markdown 格式输出的详细讲解,以两个跨节点容器(例如节点 1 的 gindemo1 和节点 2 的 gindemo2)通信为例,深入分析 Docker 的核心工作,并具体展示路由表和数据包转发流程。


我们假设以下场景:

  • 节点 1:IP 192.168.1.9,主机名 node01,运行容器 gindemo1(IP: 10.0.1.2)。
  • 节点 2:IP 192.168.1.10,主机名 node02,运行容器 gindemo2(IP: 10.0.1.6)。
  • 网络my-overlay-network,VNI(VXLAN Network Identifier)为 4097,子网 10.0.1.0/24,网关 10.0.1.1
  • 通信gindemo2(节点 2)访问 gindemo1(节点 1),例如 curl http://gindemo1

Docker 在实现这一通信的过程中,完成了以下核心工作,并涉及具体的路由表配置。

1. 网络创建与配置

Docker 通过 libnetwork 和 Swarm 控制平面创建和管理 overlay 网络。

  • 创建网络

    • 命令:
      docker network create -d overlay --attachable my-overlay-network
      
    • 工作:
      • 使用 overlay 驱动分配网络 ID 和子网(10.0.1.0/24)。
      • 生成唯一的 VNI(4097),存储在配置中(com.docker.network.driver.overlay.vxlanid_list)。
      • 配置 MTU(默认 1450,适应 VXLAN 50 字节开销)。
      • 设置 attachable: true,允许手动附加容器(避免 not manually attachable 错误)。
  • Swarm 同步

    • 将网络配置(VNI、子网、网关)存储在 Swarm 的分布式键值存储(Raft 协议)。
    • 通过 TCP 2377(Swarm 管理)和 TCP/UDP 7946(gossip 协议)端口,分发到节点 1 和节点 2。
    • 确保节点 2 无需手动创建 my-overlay-network,直接使用集群配置。
  • IPAM(IP 地址管理)

    • 分配子网 10.0.1.0/24,网关 10.0.1.1
    • 为容器动态分配 IP:gindemo110.0.1.2)、gindemo210.0.1.6)。

2. VXLAN 接口与桥接网络初始化

Docker 在每个节点上创建 VXLAN 接口和桥接网络,支持跨节点二层通信。

  • VXLAN 接口

    • 在节点 1 和节点 2 上为 my-overlay-network 创建 VXLAN 接口(例如 vxlan0)。
    • 配置:
      • VNI:4097
      • 目标端口:UDP 4789(VXLAN 默认端口)。
      • 绑定物理网卡:enp0s3(你的节点 2 网卡)。
      • MTU:1450。
    • 示例(节点 2,若接口正常显示):
      ip -d link show vxlan0
      
      输出:
      10: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group defaultlink/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ffvxlan id 4097 srcport 0 0 dstport 4789 ...
      
  • 桥接网络

    • 创建桥接接口(例如 br-xxxx),连接 VXLAN 接口和容器虚拟接口。
    • 示例(节点 2,假设 brctl 已安装):
      brctl show
      
      输出:
      bridge name     bridge id               STP enabled     interfaces
      br-xxxx         8000.0242ac110006       no              vxlan0veth30344ea
      docker_gwbridge 8000.0242bf32025b       no              vetha7fbe75
      
      • vxlan0:VXLAN 接口,处理跨节点通信。
      • veth30344eagindemo2 的虚拟接口。
      • docker_gwbridge:用于外部网络连接。
  • 你的情况

    • 节点 2 未显示 VXLAN 接口(ip -d link show type vxlan 无输出),但抓包确认 VNI 4097 和通信正常,说明 VXLAN 功能通过内核或其他机制运行。

3. 容器网络命名空间配置

Docker 为每个容器创建独立的网络命名空间,配置 IP、MAC 和路由。

  • 命名空间创建

    • gindemo1gindemo2 创建网络命名空间,隔离网络栈。
    • 示例(节点 2,gindemo2):
      docker inspect gindemo2 | grep -A 5 Network
      
      输出:
          "Networks": {"my-overlay-network": {"IPAddress": "10.0.1.6","Gateway": "10.0.1.1","EndpointID": "xxxx","MacAddress": "02:42:ac:11:00:06"}}
      
  • 虚拟接口

    • 创建 veth 接口对:
      • 容器端:eth0(IP: 10.0.1.6,MAC: 02:42:ac:11:00:06)。
      • 主机端:veth30344ea,连接到桥接接口(br-xxxxdocker_gwbridge)。
    • 示例(容器内):
      docker exec -it gindemo2 ip addr
      
      输出:
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536inet 127.0.0.1/8 scope host lo
      30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450inet 10.0.1.6/24 brd 10.0.1.255 scope global eth0
      
  • 路由表配置

    • Docker 为容器配置路由表,确保数据包通过网关或直接发送到目标。
    • 示例(gindemo2 容器内):
      docker exec -it gindemo2 ip route
      
      输出:
      default via 10.0.1.1 dev eth0
      10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.6
      
      • 解释
        • 默认路由:通过网关 10.0.1.1(虚拟网关,由 Docker 实现)。
        • 本地子网:10.0.1.0/24 直接通过 eth0 访问,覆盖 gindemo110.0.1.2)。
  • 主机路由表

    • 主机上为 my-overlay-network 配置路由,确保数据包进入 VXLAN 隧道。
    • 示例(节点 2 主机):
      ip route
      
      输出:
      default via 192.168.1.1 dev enp0s3
      10.0.1.0/24 dev br-xxxx proto kernel scope link src 10.0.1.1
      192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.10
      
      • 解释
        • 10.0.1.0/24:通过桥接接口(br-xxxx)访问,网关 10.0.1.1
        • 外部流量通过物理网卡 enp0s3 和默认网关 192.168.1.1

4. DNS 解析与服务发现

Docker 提供内置 DNS 服务,简化容器间通信。

  • DNS 配置

    • Swarm 维护分布式 DNS 记录,将容器名称映射到 IP。
    • 示例:gindemo1 解析为 10.0.1.2gindemo2 解析为 10.0.1.6
    • 配置存储在 Swarm 键值存储中,通过 gossip 协议同步。
  • 通信过程

    • gindemo2 执行 curl http://gindemo1
      • DNS 查询 gindemo1,解析到 10.0.1.2
      • 数据包通过容器路由表发送到 eth0
  • 你的抓包

    • 抓包显示 10.0.1.6gindemo2)访问 10.0.1.2gindemo1)的 websm 端口(80 或 443),DNS 解析正常。

5. VXLAN 数据包封装与转发

Docker 协调内核 VXLAN 模块,完成数据包的封装和跨节点转发。

  • 数据包生成

    • gindemo210.0.1.6)发送 HTTP 请求到 gindemo110.0.1.2)。
    • 容器内路由表:
      10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.6
      
      • 数据包通过 eth0 发送,目标 IP 10.0.1.2,MAC 未解析(需 ARP)。
  • ARP 解析

    • Docker 通过 Swarm 的 gossip 协议或多播,解析 10.0.1.2 的 MAC(例如 02:42:ac:11:00:02)。
    • FDB 表记录 MAC 到节点映射:
      bridge fdb show dev vxlan0
      
      输出(节点 2):
      02:42:ac:11:00:02 dst 192.168.1.9 self
      
      • 表示 gindemo1 的 MAC 映射到节点 1(192.168.1.9)。
  • VXLAN 封装

    • 数据包进入主机桥接接口(br-xxxx),转发到 VXLAN 接口(vxlan0)。
    • 内核 VXLAN 模块封装数据包:
      • 内部帧:源 10.0.1.6(MAC: 02:42:ac:11:00:06),目标 10.0.1.2(MAC: 02:42:ac:11:00:02)。
      • VXLAN 头:VNI 4097
      • 外部 UDP:源 192.168.1.10(动态端口,例如 50730),目标 192.168.1.9:4789
      • 外部 IP:源 192.168.1.10,目标 192.168.1.9
    • 你的抓包:
      07:22:12.656724 IP 192.168.1.10.50730 > 192.168.1.9.vxlan: VXLAN, flags [I] (0x08), vni 4097
      IP 10.0.1.6.35126 > 10.0.1.2.websm: Flags [S], seq 2498547307, win 28200, ...
      
  • 转发

    • 数据包通过物理网卡(enp0s3)发送到节点 1。
    • 主机路由表(节点 2):
      192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.10
      
      • 目标 192.168.1.9 通过 enp0s3 直接发送。
  • 节点 1 解封装

    • 节点 1 接收 UDP 4789 数据包,VXLAN 接口(vxlan0)解封装。
    • 内部帧转发到 gindemo110.0.1.2)的 eth0
    • 节点 1 路由表(容器内):
      default via 10.0.1.1 dev eth0
      10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.2
      

6. iptables 和外部连接

Docker 配置 iptables,支持容器与外部网络的通信。

  • NAT 配置

    • 为端口映射(例如 -p 8081:80)配置 iptablesnat 表(DOCKER 链)。
    • 示例(节点 2):
      sudo iptables -t nat -L DOCKER
      
      输出:
      Chain DOCKER (2 references)
      target     prot opt source               destination
      DNAT       tcp  --  anywhere             0.0.0.0/0            tcp dpt:8081 to:10.0.1.6:80
      
  • docker_gwbridge

    • 连接容器到外部网络,处理外部访问(例如通过 192.168.1.10:8081 访问 gindemo2)。
    • 你的输出:
      10: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...link/ether 02:42:bf:32:02:5b ...
      24: vetha7fbe75@if23: ... master docker_gwbridge ...
      31: veth30344ea@if30: ... master docker_gwbridge ...
      
  • 防火墙

    • 确保 UDP 4789(VXLAN)、TCP 2377(Swarm 管理)、TCP/UDP 7946(gossip)端口开放。
    • 示例:
      sudo ufw allow 4789/udp
      

7. Swarm 控制平面管理

Docker Swarm 提供分布式管理,确保 overlay 网络跨节点一致。

  • 网络同步

    • 通过 Raft 协议存储网络配置(VNI、子网、FDB)。
    • 节点 2 无需手动创建 my-overlay-network,Swarm 自动分发。
  • 服务发现

    • Swarm 维护 DNS 记录,动态更新容器 IP 和名称。
    • 示例:gindemo2 查询 gindemo1,返回 10.0.1.2
  • 故障处理

    • 检测节点状态(docker node ls),重新同步配置。
    • 你的问题(节点 2 无 VXLAN 接口)可能因同步或内核问题,Docker 仍通过其他机制维持通信。

8. 性能优化

Docker 优化 overlay 网络的性能。

  • 内核 VXLAN

    • 使用 Linux 内核的 VXLAN 模块,高效处理封装。
    • 支持网卡硬件卸载(如果支持)。
  • 多播/单播

    • 默认使用多播分发 ARP,动态切换到单播(你的环境中可能为单播)。
    • FDB 表动态更新:
      02:42:ac:11:00:02 dst 192.168.1.9 self
      
  • MTU

    • 设置 MTU 1450,适应 VXLAN 封装。
    • 你的抓包显示 mss 1410,确认 MTU 正确。

9. 调试与监控

Docker 提供工具支持 overlay 网络调试。

  • 网络检查

    • docker network inspect my-overlay-network:显示 VNI(4097)、子网、容器 IP。
    • docker inspect gindemo2:确认 IP 和 MAC。
  • 抓包

    • 你的抓包:
      IP 192.168.1.10.50730 > 192.168.1.9.vxlan: VXLAN, flags [I] (0x08), vni 4097
      
      • 验证 VNI 和通信。
  • 日志

    • journalctl -u docker:记录网络错误。

10. 异常处理

Docker 处理 overlay 网络的异常情况。

  • 你的问题(节点 2 无 VXLAN 接口)

    • 可能原因:VXLAN 模块未加载(modprobe vxlan)、iproute2 过旧、Docker 网络栈异常。
    • Docker 仍通过内核直接处理 VXLAN 流量(抓包确认),但接口未显示。
  • 解决方案

    • 加载 VXLAN 模块:
      sudo modprobe vxlan
      
    • 更新 iproute2
      sudo yum update iproute
      
    • 重启 Docker:
      systemctl restart docker
      

具体路由表和数据包流程

以下是 gindemo2(节点 2,10.0.1.6)访问 gindemo1(节点 1,10.0.1.2)的详细流程,包含路由表。

1. gindemo2 容器(节点 2)

  • 路由表
    docker exec -it gindemo2 ip route
    
    default via 10.0.1.1 dev eth0
    10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.6
    
  • 流程
    • curl http://gindemo1 解析为 10.0.1.2(Swarm DNS)。
    • 数据包:源 10.0.1.6:35126,目标 10.0.1.2:80(HTTP)。
    • 路由匹配 10.0.1.0/24,通过 eth0 发送。
    • ARP 请求 10.0.1.2 的 MAC,解析为 02:42:ac:11:00:02

2. 节点 2 主机

  • 路由表
    ip route
    
    default via 192.168.1.1 dev enp0s3
    10.0.1.0/24 dev br-xxxx proto kernel scope link src 10.0.1.1
    192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.10
    
  • FDB 表
    bridge fdb show dev vxlan0
    
    02:42:ac:11:00:02 dst 192.168.1.9 self
    
  • 流程
    • 数据包从 veth30344ea 进入桥接接口(br-xxxx)。
    • VXLAN 接口(vxlan0,若存在)封装数据包:
      • 内部:源 10.0.1.6(MAC: 02:42:ac:11:00:06),目标 10.0.1.2(MAC: 02:42:ac:11:00:02)。
      • 外部:源 192.168.1.10:50730,目标 192.168.1.9:4789,VNI 4097
    • 路由匹配 192.168.1.0/24,通过 enp0s3 发送。

3. 节点 1 主机

  • 路由表
    ip route
    
    default via 192.168.1.1 dev enp0s3
    10.0.1.0/24 dev br-yyyy proto kernel scope link src 10.0.1.1
    192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.9
    
  • 流程
    • 接收 UDP 4789 数据包,VXLAN 接口解封装。
    • 内部帧转发到桥接接口(br-yyyy),匹配 10.0.1.2
    • 数据包通过 veth 接口送达 gindemo1eth0

4. gindemo1 容器(节点 1)

  • 路由表
    docker exec -it gindemo1 ip route
    
    default via 10.0.1.1 dev eth0
    10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.2
    
  • 流程
    • 接收数据包,处理 HTTP 请求。
    • 响应通过相同路径返回(反向封装,VXLAN 到节点 2)。

总结

Docker 在 overlay 网络中完成以下核心工作:

  1. 网络创建:分配 VNI(4097)、子网(10.0.1.0/24),通过 Swarm 同步。
  2. VXLAN 初始化:创建 VXLAN 接口(vxlan0)、桥接接口(br-xxxx)。
  3. 容器配置:分配 IP(10.0.1.2, 10.0.1.6)、MAC,配置路由表和 veth 接口。
  4. DNS 解析:提供 Swarm DNS,解析 gindemo110.0.1.2
  5. 数据封装:封装 VXLAN 数据包(外部: 192.168.1.10192.168.1.9,VNI 4097),维护 FDB。
  6. iptables:配置 NAT 和端口映射,连接 docker_gwbridge
  7. Swarm 管理:分布式同步,故障恢复。
  8. 优化与调试:内核 VXLAN、MTU 1450、抓包支持。

相关文章:

Docker Overlay 网络的核心工作(以跨节点容器通信为例)

Docker 的 overlay 网络是一种基于 VXLAN&#xff08;Virtual Extensible LAN&#xff09;的多主机网络模式&#xff0c;专为 Docker Swarm 集群设计&#xff0c;用于实现跨节点的容器通信。它通过虚拟二层网络&#xff0c;允许容器在不同主机上像在同一局域网内一样通信。Dock…...

用 R 语言打造交互式叙事地图:讲述黄河源区生态变化的故事

目录 🌟 项目背景:黄河源头的生态变迁 🧰 技术栈介绍 🗺️ 最终效果预览 💻 项目构建步骤 1️⃣ 数据准备 2️⃣ 构建 Leaflet 地图 3️⃣ 使用 scrollama 实现滚动触发事件 4️⃣ 使用 R Markdown / Quarto 打包发布 🎬 效果展示截图 📦 完整代码仓库 …...

Java Stream常见误区解析:五大错误与规避方法

Java Stream API以函数式编程风格提供了一种强大的数据处理方式&#xff0c;使代码更简洁和可读。然而&#xff0c;误用Stream可能导致性能低下、错误频发或代码难以维护。本文将探讨开发者在使用Java Stream时最常见的五种错误&#xff0c;并提供规避方法。 1. 在Stream处理中…...

【树莓派Pico FreeRTOS】-中断服务与二值信号量

中断服务与二值信号量 RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 FreeRTOS 由 Real Time Engineers Ltd. 独家拥有、开发和维护。FreeRTO…...

构建灵活可扩展的接口抽象层:支持多种后端数据存取的最佳实践

构建灵活可扩展的接口抽象层:支持多种后端数据存取的最佳实践 在现代应用开发中,后端数据存取的需求可能非常多样化:本地数据库、云存储服务、REST API,甚至是文件系统。因此,设计一套支持多种后端数据存取的接口抽象层是提高系统灵活性和可维护性的关键。本文将详细探讨…...

Scade 语言词法介绍

Scade 6 是一种具备形式化语法与形式化语义的领域特定语言&#xff08;注1&#xff09;。自2008年发布&#xff08;注5&#xff09;起&#xff0c;在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。 注1&#x…...

如何配置环境变量HADOOP_HOMEM、AVEN_HOME?不配置会怎么样

以下是在不同操作系统中配置 HADOOP_HOME 和 JAVA_HOME 环境变量的方法&#xff0c;以及不配置可能产生的后果&#xff1a; 配置 HADOOP_HOME - Windows系统&#xff1a;下载并解压Hadoop安装包&#xff0c;然后右键“此电脑”&#xff0c;选择“属性”&#xff0c;点击“高级…...

YOLO学习笔记 | 基于YOLOv8的植物病害检测系统

以下是基于YOLOv8的植物病害检测系统完整技术文档,包含原理分析、数学公式推导及代码实现框架。 基于YOLOv8的智能植物病害检测系统研究 摘要 针对传统植物病害检测方法存在的效率低、泛化性差等问题,本研究提出一种基于改进YOLOv8算法的智能检测系统。通过设计轻量化特征提…...

在已有的vue项目中使用vuex

介绍 Vuex 是一个用于 Vue.js 应用程序的状态管理模式 库。它充当应用程序中所有组件的集中存储&#xff0c;其规则确保状态只能以可预测的方式进行更改。 专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个插件对vue应用中多个组件的共享状态进行集中式的管…...

基于uniapp的鸿蒙APP大数据量性能优化

文章目录 一、问题诊断与性能瓶颈分析1.1 大数据场景下的典型性能问题1.2 性能监测工具使用1.2.1 HBuilderX内置分析器1.2.2 鸿蒙DevEco工具链1.2.3 自制性能埋点 二、数据加载优化方案2.1 分页加载实现&#xff08;带错误重试机制&#xff09;2.2 数据流优化策略2.2.1 数据压缩…...

C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式

int A(参数...) override { return 某个对象.A(参数...);} 一.目标 本文将用一个简单的“数学运算器”例子&#xff0c;从零解释以下 C 语法特性&#xff1a; virtual 虚函数 override 重写关键字 函数体内部的“转发调用” 数组引用作为函数参数 适合初学者和希望加深…...

山东科技大学深度学习考试回忆

目录 一、填空&#xff08;五个空&#xff0c;十分&#xff09; 二、选择题(五个&#xff0c;十分&#xff09; 三、判断题&#xff08;五个&#xff0c;五分&#xff09; 四、论述题&#xff08;四个&#xff0c;四十分&#xff09; 五、计算题&#xff08;二个&#xff…...

sql server 学习计划

目标定位&#xff08;适用于开发人员、架构师、DBA&#xff09; 精通 SQL Server 的数据建模、T-SQL 编程、并发控制、性能优化、索引策略 掌握事务、锁机制、统计信息、执行计划 能独立完成复杂系统的数据库设计、调优与可用性设计 具备解决大数据量、高并发、长事务、数据…...

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…...

致远OA——自定义开发rest接口

文章目录 :apple: 业务流程 &#x1f34e; 业务流程 代码案例&#xff1a; https://pan.quark.cn/s/57fa808c823f 官方文档&#xff1a; https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登录系统 —— 后台管理 —— 切换系…...

No package docker-ce available问题的解决

安装docker时提示 rootk8s-node3 ~]# yum install -y docker-ce docker-ce-cli containerd.io Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com No packag…...

群晖威联通飞牛等nas如何把宿主机硬盘挂接到可道云docker容器中

可道云系统是用户常用的一款面向个人用户的轻量级私有云存储工具&#xff0c;以高效管理和安全存储为核心&#xff0c;打造便捷的数字化办公体验。但是用户希望把原有其他磁盘中文件挂接到这个新系统中有很大的难度,主要是对linux文件系统理解有很大的误区,认为目录结构是固定的…...

使用docker该怎么做:从公有仓库拉取镜像并上传到私有仓库

在容器化部署中&#xff0c;将公有镜像仓库&#xff08;如Docker Hub&#xff09;的镜像迁移到私有仓库&#xff08;如Harbor、Nexus&#xff09;是常见需求。 一、为什么需要将镜像从公有仓库传到私有仓库&#xff1f; 网络连通性&#xff1a;公有仓库依赖公网访问&#xff…...

软件开发指南——GUI 开发方案推荐

1. LVGL (Light and Versatile Graphics Library) 适用场景&#xff1a;嵌入式设备、资源受限环境 优势&#xff1a; 专为嵌入式设计的开源 GUI 库&#xff0c;内存占用极小&#xff08;最低仅需 64KB RAM&#xff09;支持触摸屏、硬件加速&#xff08;如 STM32 的 LTDC&…...

使用 Azure AKS 保护 Kubernetes 部署的综合指南

企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探讨了如何使用 Azure Kubernetes 服务 (AKS) 来利用 D…...

C#: 用Libreoffice实现Word文件转PDF

现实场景中要实现Word格式转PDF格式还是比较常见的。 如果要用开源的组件&#xff0c;只有用Libreoffice了。 一、下载安装Libreoffice 先进入如下链接&#xff0c;找到最新版本和匹配的操作系统来安装。 官网试过&#xff0c;下载是能下载&#xff0c;但安装了用不了&…...

Node.js 创建 HTTP 服务端

Node.js 创建 HTTP 服务端的用法总结&#xff0c;内容涵盖了 核心模块、基本用法、Express 简化用法、常见场景、错误处理、以及实用小贴士。 ✅ 一、Node.js 创建 HTTP 服务的方式 Node.js 使用内置的 http 模块即可快速创建一个 Web 服务&#xff0c;无需额外安装依赖。 ✅ …...

Uniapp:列表选择提示框

目录 一、出现场景二、效果展示三、具体使用 一、出现场景 在项目的开发过程中&#xff0c;有这样一种场景&#xff0c;就是点击按钮走后续的逻辑之前还需要选择前提条件&#xff0c;就一个条件的情况下如果使用弹出框就显示比较多余&#xff0c;列表选择提示框刚好能够满足我…...

【python】django sqlite版本过低怎么办

方法一&#xff1a;下载最新版本 复制上面的内容的链接 在服务器上进行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…...

山东大学软件学院创新项目实训开发日志(18)之对话自动生成标题设为用户第一次对话发的文字

本次功能的实现主要集中在后端&#xff0c;前端代码不用改变&#xff1a; 前端界面效果展示&#xff1a;...

【机器学习】PCA-奇异值分解-上采样与下采样-傅里叶变换

1. PCA 主成分分析 主成分分析&#xff08;PCA&#xff09;是一种常用的数据降维方法。 它通过找到数据中方差最大的方向&#xff08;主成分&#xff09;&#xff0c;将原始高维数据映射到较低维空间&#xff0c;同时尽可能保留原始信息。 数学实现上&#xff0c;通常通过协方…...

[图论]生成树 引言

生成树 引言 生成树&#xff1a;一个连通图的生成树是该图的一个极小连通子图。生成树中含有图中全部(设 V V V个)顶点及构成一棵树的 V − 1 V-1 V−1条边&#xff0c;且生成树中不应有环。最小生成树(MST)&#xff1a;图的所有生成树中&#xff0c;边权之和最小的生成树。显…...

前端与Java后端交互出现跨域问题的14种解决方案

跨域问题是前端与后端分离开发中的常见挑战&#xff0c;以下是14种完整的解决方案&#xff1a; 1 前端解决方案( 开发环境代理) 1.1 Webpack开发服务器代理 // vue.config.js 或 webpack.config.js module.exports {devServer: {proxy: {/api: {target: http://localhost:8…...

【day8】调用AI接口,生成自动化测试用例

1、项目结构建议 project/ ├── api_docs/ # 存放接口文档 │ └── XX系统.swagger.json ├── ai_generator/ # AI测试用例生成模块 │ └── test_case_generator.py ├── tests/ # 生成的测试用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…...

C#中同步任务和异步任务

同步任务和异步任务在编程中各有其独特的优缺点 同步任务 优点 逻辑简单清晰&#xff1a;同步任务的执行流程与代码编写顺序一致&#xff0c;依次执行各个操作&#xff0c;开发者无需考虑复杂的异步回调、任务状态管理等问题&#xff0c;代码的逻辑和执行顺序易于理解和调试…...