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

【容器化技术 Docker 与微服务部署】详解

容器化技术 Docker 与微服务部署

一、容器化技术概述

(一)概念

容器化技术是一种操作系统级别的虚拟化方法,它允许将应用程序及其依赖项(如运行时环境、系统工具、库等)打包成一个独立的、可移植的单元,这个单元就是容器。容器在运行时与宿主机共享操作系统内核,但又能在用户空间实现进程、网络、文件系统等资源的隔离,使得应用程序可以在不同的环境中以一致的方式运行。

(二)特点

1. 轻量级
  • 与传统虚拟机相比,容器不需要为每个应用程序模拟完整的操作系统,而是共享宿主机的内核,只在用户空间进行资源隔离和虚拟化。这使得容器的启动速度更快,占用的磁盘空间和内存资源更少。例如,一个简单的 Java 应用程序容器镜像可能只有几十兆字节,而一个包含完整操作系统的虚拟机镜像往往会达到几个吉字节。从源码层面看,Docker(以 Docker 为例阐述容器化技术实现,后续会详细介绍)通过使用 Linux 内核的 cgroups(控制组)来限制容器对 CPU、内存等资源的使用量,通过 namespaces 实现进程、网络、文件系统等的隔离,这些内核特性的巧妙运用使得容器能够以轻量级的方式运行。
2. 环境一致性
  • 容器将应用程序及其依赖项打包在一起,无论在开发、测试还是生产环境,只要宿主机安装了容器运行时(如 Docker),容器就能以相同的配置和依赖运行,避免了传统开发中常见的 “在我机器上能运行,在其他机器上不行” 的环境不一致问题。这是因为容器内部的文件系统、环境变量等都是在构建镜像时就确定好的,不会受到宿主机环境变化的影响。
3. 快速部署
  • 容器可以快速启动和停止,基于镜像创建容器的过程通常只需要几秒到几十秒,相比于传统虚拟机的部署(可能需要几分钟甚至更长时间来启动操作系统和配置应用),大大提高了部署效率。例如,在应对突发流量时,可以快速启动多个容器实例来扩展服务能力。
4. 可移植性强
  • 容器镜像可以在不同的操作系统和云平台上运行,只要该平台支持相应的容器运行时。这方便了应用的迁移和部署,比如可以在本地开发环境构建好容器镜像,然后轻松部署到云端的生产环境中。

(三)与传统虚拟机的区别

1. 资源隔离与共享
  • 传统虚拟机:在硬件层面通过虚拟化技术(如 VMware、Hyper-V 等使用的技术)模拟出完整的硬件环境,每个虚拟机都有自己独立的操作系统内核,资源隔离是基于硬件级别的模拟实现的,不同虚拟机之间的资源完全独立,对硬件资源的消耗较大。
  • 容器:如前面所述,容器是基于操作系统内核的特性实现资源隔离,多个容器共享宿主机的内核,只是在用户空间进行隔离,在资源利用上更加高效,能在一台宿主机上运行更多的容器实例,但同时也因为共享内核,如果内核出现问题可能会影响所有容器。
2. 启动速度与资源占用
  • 传统虚拟机:启动时需要加载完整的操作系统内核、初始化各种系统服务等,启动过程耗时较长,并且由于每个虚拟机都包含完整的操作系统及应用,占用的磁盘空间和内存资源较多。
  • 容器:直接利用宿主机的内核,启动时只需加载容器自身的应用和配置,启动速度极快,而且镜像体积小,资源占用少,更适合在资源有限的环境下大规模部署应用。
3. 可移植性
  • 传统虚拟机:由于依赖特定的虚拟化平台和硬件环境,将虚拟机从一个平台迁移到另一个平台可能会遇到兼容性问题,需要进行复杂的配置和转换工作。
  • 容器:基于容器镜像的标准化格式,只要目标平台支持容器运行时,就能轻松迁移和部署,可移植性非常好。

(四)Docker 在微服务架构下的应用优势

1. 快速部署微服务
  • 在微服务架构中,通常有多个微服务组成一个完整的应用系统。使用 Docker,可以为每个微服务构建独立的镜像,然后快速部署成容器实例,每个微服务的部署和启动都变得简单快捷,减少了整体的部署时间。例如,一个电商系统包含用户服务、商品服务、订单服务等多个微服务,通过 Docker 可以将它们分别打包成镜像并快速部署到生产环境中。
2. 环境隔离
  • 不同微服务可能依赖不同的运行时环境、库版本等,Docker 容器能够很好地实现这种环境隔离。比如用户服务可能基于 Java 11 开发,商品服务基于 Python 开发,通过 Docker 容器可以确保它们在各自独立的环境中运行,互不干扰,避免了不同微服务之间因依赖冲突而导致的问题。
3. 资源高效利用
  • 微服务架构下,各个微服务的资源需求不同,有的可能需要较多的 CPU 资源,有的可能更依赖内存资源。Docker 可以通过配置参数(基于 cgroups 等内核特性实现)为每个容器精确分配资源,实现资源的高效利用,避免资源浪费,同时保证各个微服务都能获得所需的资源来稳定运行。
4. 便于服务的扩展和收缩
  • 根据业务流量的变化,可以方便地通过启动或停止 Docker 容器来扩展或收缩微服务的实例数量。比如在电商促销活动期间,可以快速启动更多的订单服务容器来处理大量的订单请求,活动结束后再减少容器数量,节省资源,提高资源的灵活性和利用率。
5. 版本管理和回滚方便
  • Docker 镜像的版本管理清晰,每个镜像都有对应的标签(如版本号等),在微服务升级过程中,如果发现新的版本出现问题,可以快速回滚到之前稳定的版本,只需要切换使用对应的镜像来启动容器即可,降低了微服务升级的风险。

二、Docker 的基本概念、安装与配置

(一)基本概念

1. 镜像(Image)
  • 镜像是一个只读的模板,包含了运行容器所需的所有文件和配置信息,如应用程序代码、运行时环境、系统库等。可以把镜像看作是容器的 “蓝图”,它是通过一系列的文件系统层叠加而成的(在 Docker 的存储驱动底层,采用了分层存储的机制,比如 aufs、overlay2 等存储驱动,通过对不同层的文件系统进行合并和管理来构建镜像,每层只存储与上一层相比发生变化的文件,这样可以减少镜像的体积并提高复用性)。镜像可以被创建、共享和分发,多个容器可以基于同一个镜像创建。
2. 容器(Container)
  • 容器是基于镜像创建的运行实例,是镜像的可运行态。它在运行时拥有独立的文件系统、进程空间、网络配置等,但共享宿主机的内核。容器可以被启动、停止、删除,并且可以动态地调整资源分配(通过 Docker 命令或者 API 基于 cgroups 等进行资源配置调整),在其生命周期内可以执行各种操作,比如运行应用程序、对外提供服务等。
3. 仓库(Repository)
  • 仓库是用于存放 Docker 镜像的地方,类似于代码仓库(如 GitHub)存放代码一样。它可以是公共的(如 Docker Hub,上面有大量开源的镜像可供使用),也可以是私有的(企业内部为了安全和隐私构建的镜像仓库)。通过仓库,可以方便地分享、拉取和管理镜像,在构建微服务的容器化部署时,通常会将自己构建的微服务镜像推送到仓库中,以便在不同环境中部署使用。

(二)安装与配置过程

1. 在 Linux 系统(以 Ubuntu 为例)下安装 Docker

更新包索引并安装依赖包:

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

添加 Docker 的官方 GPG 密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置稳定版仓库:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

安装 Docker 引擎:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

验证安装是否成功:

sudo docker run hello-world

如果看到输出 Hello from Docker! 等欢迎信息,则表示 Docker 安装成功。

2. 配置 Docker(可选)

配置镜像加速器(以国内使用阿里云镜像加速器为例):

对于国内用户,拉取 Docker 镜像时可能速度较慢,可以配置镜像加速器来提高速度。

创建或编辑 /etc/docker/daemon.json 文件(如果不存在则创建),添加以下内容:

{"registry-mirrors": ["https://<你的阿里云加速器地址>.mirror.aliyuncs.com"]
}

然后重启 Docker 服务:

sudo systemctl restart docker

(三)创建和管理 Docker 镜像

1. 使用 docker commit 创建镜像(不推荐用于生产,常用于临时测试等场景)

首先,拉取一个基础镜像(以 Ubuntu 为例)并运行容器:

docker run -it ubuntu:latest /bin/bash

在容器内安装一些软件(假设安装 curl):

apt-get update
apt-get install curl

然后退出容器,使用 docker commit 命令基于修改后的容器创建新的镜像:

docker commit <容器 ID> my-custom-ubuntu:1.0

这里 <容器 ID> 是刚才运行并安装了软件的容器的唯一标识符,可以通过 docker ps -a 命令查看,my-custom-ubuntu:1.0 就是创建的新镜像名称及版本标签。

2. 使用 Dockerfile 定义镜像构建过程(推荐做法)

示例:构建一个简单的 Java 应用程序镜像
假设我们有一个简单的 Java 项目,目录结构如下:

my-java-app/
├── src/
│   └── Main.java
└── Dockerfile

Main.java 内容如下(简单打印一句话):

public class Main {public static void main(String[] args) {System.out.println("Hello from my Java app in Docker!");}
}

Dockerfile 内容如下:

# 基于 OpenJDK 11 基础镜像
FROM openjdk:11-jdk# 设置工作目录
WORKDIR /app# 将当前目录下的所有文件(除了 Dockerfile 本身)复制到容器内的 /app 目录下
COPY. /app# 编译 Java 代码
RUN javac src/Main.java# 设置容器启动时执行的命令
CMD ["java", "src/Main.class"]

构建镜像过程:
在包含 Dockerfile 的目录下(这里是 my-java-app 目录),执行以下命令:

docker build -t my-java-app:1.0.

其中 -t 参数用于指定镜像的名称和标签,最后的 . 表示使用当前目录下的 Dockerfile 进行构建。在构建过程中,Docker 会按照 Dockerfile 中的指令依次执行,先拉取 openjdk:11-jdk 基础镜像,然后设置工作目录、复制文件、编译代码、设置启动命令等操作,最终构建出 my-java-app:1.0 这个镜像。

(四)运行和管理 Docker 容器

1. 运行容器

使用刚才构建的 my-java-app:1.0 镜像运行容器:

docker run my-java-app:1.0

这会启动一个容器,容器内的 Java 应用程序将会运行,在控制台输出 Hello from my Java app in Docker!。
可以添加一些参数来配置容器的运行,比如:

  • -d 参数表示让容器在后台运行(守护态),例如:
docker run -d my-java-app:1.0
  • -p 参数用于端口映射,假设容器内的应用监听 8080 端口,要将其映射到宿主机的 8080 端口,可以这样做:
docker run -p 8080:8080 my-java-app:1.0
  • –name 参数可以给容器指定一个名称,方便后续对容器进行管理,比如:
docker run --name my-java-app-container -p 8080:8080 my-java-app:1.0
2. 查看容器状态

使用 docker ps 命令可以查看正在运行的容器状态,加上 -a 参数(docker ps -a)可以查看所有的容器(包括已经停止的容器),输出信息会包含容器的 ID、名称、镜像名称、状态等信息,方便了解容器的运行情况和进行后续管理操作。

3. 停止和删除容器
  • 停止容器可以使用 docker stop <容器名称或 ID> 命令,例如:
docker stop my-java-app-container
  • 删除容器使用 docker rm <容器名称或 ID> 命令,不过要先停止容器才能删除,或者使用 -f 参数强制删除正在运行的容器(不建议,可能导致数据丢失等问题),比如:
docker rm my-java-app-container
  • 如果要删除所有已经停止的容器,可以使用以下命令组合:
docker container prune

三、使用 Docker 进行微服务的部署

(一)构建微服务的镜像

####1. 以 Spring Boot 微服务为例
假设我们有一个简单的 Spring Boot 微服务项目,用于提供用户管理功能,项目结构如下:

user-service/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/userservice/
│       │       ├── UserController.java
│       │       ├── UserService.java
│       │       ├── UserRepository.java
│       │       └── User.java
│       └── resources/
│           ├── application.properties
│           └── static/
└── Dockerfile

关键代码(简化示例):
UserController.java:

@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}
}

UserService.java:

@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}
}

UserRepository.java:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

User.java:

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// 省略构造函数、Getter 和 Setter 等方法
}

application.properties:

server.port=8080
spring.datasource.url=jdbc:mysql://<数据库地址>/<数据库名称>
spring.datasource.username=<用户名>
spring.datasource.password=<密码>

Dockerfile 示例:

# 基于 OpenJDK 11 构建 Spring Boot 微服务镜像
FROM openjdk:11-jdk# 设置工作目录
WORKDIR /app# 复制项目的 JAR 文件到容器内(假设已经通过 Maven 或 Gradle 构建好 JAR 文件)
COPY target/user-service-1.0.jar /app/user-service-1.0.jar# 设置容器启动时执行的命令,运行 Spring Boot 微服务
CMD ["java", "-jar", "user-service-1.0.jar"]

构建镜像过程:

  • 先在项目目录下通过 Maven 或 Gradle 构建出可执行的 JAR 文件(以 Maven 为例,执行 mvn clean package),然后在包含 Dockerfile 的目录下执行以下命令构建镜像:
docker build -t user-service:1.0.

这样就构建出了名为 user-service:1.0 的 Spring Boot 微服务镜像,后续可以基于此镜像部署容器实例。

(二)配置容器网络

1. 容器网络基础

Docker 提供了多种网络模式,以满足不同的应用场景和网络需求,常见的网络模式如下:

桥接模式(Bridge):
  • 这是 Docker 默认的网络模式,其实现依赖于 Linux 内核中的 bridge 模块。从源码角度来看,当启动 Docker 并采用桥接模式时,Docker 守护进程会在内核中创建一个虚拟网桥(相当于一个虚拟交换机),这个网桥负责连接各个容器以及与外部网络的通信交互。
  • 在这种模式下,每个启动的容器都会被连接到这个虚拟网桥上,并且会被分配一个属于内部网段的 IP 地址(通常在 172.17.0.0/16 这样的网段内,不过具体网段是可以通过 Docker 的网络配置参数进行调整的)。例如,启动多个容器后,它们各自获得如 172.17.0.2、172.17.0.3 等不同的内部 IP 地址,这些容器之间可以基于这些内部 IP 地址实现相互通信,就如同它们处于同一个局域网中一样。
  • 同时,为了让容器能够与外部网络(如互联网或者宿主机所在的局域网)进行通信,Docker 支持通过端口映射机制来实现。在启动容器时,使用 -p 参数可以指定宿主机的端口与容器内部端口的映射关系。比如,容器内的应用监听 8080 端口,执行 docker run -p 8080:8080 <镜像名称> 命令后,外部网络的请求发送到宿主机的 8080 端口时,就会被转发到对应的容器内的 8080 端口上,从而实现容器对外提供服务以及接收外部请求的功能。
  • 从性能方面考虑,桥接模式在一般的应用场景下能够提供较好的网络隔离和通信效率,不过由于网络数据包需要经过虚拟网桥的转发,在大规模容器通信或者对网络延迟要求极高的场景下,可能会存在一定的性能损耗,但对于大多数微服务部署场景来说,是完全可以满足需求的。
  • 在实际应用场景中,比如一个微服务架构下的电商系统,用户服务、商品服务、订单服务等多个微服务分别部署在不同容器中,采用桥接模式时,这些容器之间可以方便地基于内部 IP 地址进行相互调用,协同完成业务逻辑,同时又能通过端口映射对外提供相应的 API 接口供前端应用或者第三方系统访问。
主机模式(Host):
  • 在主机模式下,容器会直接使用宿主机的网络命名空间,这意味着容器中的网络配置与宿主机完全一致,容器内的网络接口就是宿主机的网络接口,容器共享宿主机的 IP 地址以及所有网络配置信息(如网络接口、IP 路由表等)。
  • 从实现原理来讲,在 Docker 创建容器并指定为主机模式时,它不会像桥接模式那样为容器单独创建虚拟网络环境,而是让容器直接复用宿主机的网络相关数据结构和配置。例如,容器内运行的网络服务监听某个端口时,实际上就是在宿主机的对应端口上进行监听,外部网络访问宿主机该端口就直接能访问到容器内的服务了,不存在端口映射的概念。
  • 这种模式的优势在于网络性能上几乎没有额外的损耗,因为没有中间的虚拟网络层进行转发,网络通信就如同直接在宿主机上运行的应用一样高效,特别适合对网络性能要求极高且对网络隔离要求相对较低的场景。然而,其缺点也很明显,由于容器和宿主机共享网络,可能会导致端口冲突等问题,并且容器之间的网络隔离性较差,一个容器对网络配置的修改(比如修改了 IP 地址或者路由规则)可能会影响到宿主机以及其他共享网络的容器。
  • 例如,在一个容器化的监控系统中,监控代理容器需要实时获取宿主机的网络状态信息并且对网络性能要求极高,此时采用主机模式,监控代理可以直接利用宿主机的网络接口收集数据,避免了网络转发带来的延迟和性能损耗,更好地保障监控数据的及时性和准确性。
overlay 网络模式:
  • overlay 网络模式主要用于跨多台宿主机的容器网络通信场景,它构建在已有的网络之上(可以是物理网络或者其他虚拟网络),实现不同宿主机上的容器之间能够像在同一局域网内一样进行通信。
  • 其实现基于网络虚拟化技术以及分布式键值存储(如 etcd 等,用于存储和同步网络配置信息),在每台宿主机上,Docker 会创建一个 overlay 网络驱动实例,这个驱动负责将本地容器连接到 overlay 网络中,并且与其他宿主机上的 overlay 网络实例进行通信协调。当容器需要跨宿主机通信时,数据包会经过一系列的封装和转发处理(在源码中涉及到网络协议栈的相关处理以及对 overlay 网络特定协议的实现),通过已有的网络基础设施传输到目标宿主机,然后再解封装并转发到目标容器。
  • 例如,在一个分布式的微服务应用部署场景中,微服务被部署在多台服务器上的 Docker 容器中,为了让这些分布在不同宿主机上的微服务能够相互协作,就可以采用 overlay 网络模式,使得不同宿主机上的容器可以通过统一的网络命名空间进行通信,就像它们都在同一个物理网络中一样,方便实现服务间的调用和数据交互,保障整个分布式系统的正常运行。
  • 这种模式的优势在于能够很好地支持大规模的分布式容器部署,实现跨主机的网络通信和服务发现,但由于涉及到复杂的网络封装、转发以及分布式协调等机制,相对来说网络配置和管理会复杂一些,并且在一定程度上会有网络性能损耗,不过随着技术的不断发展和优化,其性能在很多场景下也是可以接受的。
macvlan 网络模式:
  • macvlan 网络模式允许容器拥有自己独立的 MAC 地址,使得容器在网络中看起来就像一台独立的物理主机一样,可以直接连接到物理网络或者二层网络交换机上,实现与外部网络设备的直接通信。
  • 在实现上,Docker 通过配置 Linux 内核的 macvlan 网络驱动,为每个容器创建一个虚拟的网络接口,赋予其独特的 MAC 地址,并将其关联到指定的物理网络接口或者 VLAN 上。从网络层面看,容器的网络流量就如同从独立的物理设备发出一样,遵循传统的网络二层和三层协议进行转发和通信,外部网络设备(如路由器、交换机等)可以基于容器的 MAC 地址和 IP 地址对其进行路由和访问控制。
  • 例如,在企业内部的网络环境中,有一些对网络兼容性和直接接入物理网络有要求的应用容器,采用 macvlan 网络模式,这些容器可以无缝接入现有的网络架构,无需对网络基础设施进行大规模的改造,并且能够方便地与其他物理设备或者基于物理网络的系统进行通信和协作,同时也保障了容器网络的独立性和可管理性。
  • 不过,使用 macvlan 网络模式需要注意网络中的 MAC 地址冲突问题以及对物理网络环境的一些配置要求(如交换机的端口配置等),并且由于容器直接接入物理网络,可能会增加网络管理的复杂性和潜在的安全风险,需要根据实际的网络环境和安全策略进行合理的应用。
  • 不同的 Docker 网络模式各有其特点和适用场景,在实际使用 Docker 进行微服务部署时,需要根据具体的业务需求、网络环境以及性能要求等因素综合考虑,选择合适的网络模式来构建容器网络,以保障微服务之间能够高效、安全地进行通信和协作。

(三)与其他容器编排工具(如 Kubernetes 等)的协同工作方式

1. Kubernetes 概述

Kubernetes
是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理,它提供了丰富的功能和机制来处理容器化应用在复杂环境下的运行、调度以及资源分配等问题。

从架构层面来看,Kubernetes 由多个核心组件构成,例如:

Master 节点组件:
  • kube-apiserver:这是 Kubernetes 的 API 服务器,是整个系统的 “大脑”,对外提供 RESTful API,用于接收和处理来自客户端(如命令行工具 kubectl、其他管理界面等)的各种请求,包括创建、查询、更新和删除 Kubernetes 资源(如 Pod、Service、Deployment 等)的操作。它对请求进行验证、授权以及持久化存储等处理,并且协调其他组件之间的工作,所有对 Kubernetes 集群的操作基本都要通过它来实现,在源码中,它实现了大量的 HTTP 处理逻辑以及对各种资源操作的接口定义和实现,保障 API 的稳定和高效运行。
  • kube-controller-manager:它是一组控制器的集合,负责运行各种控制器(如 ReplicationController、DeploymentController、NodeController 等),这些控制器会持续监控集群内的资源状态,并根据预设的规则和期望状态进行自动调节。例如,ReplicationController 会确保指定数量的 Pod 副本始终在运行,如果发现实际运行的 Pod 数量少于期望数量,就会自动创建新的 Pod;DeploymentController 则主要用于管理 Deployment 资源,实现应用的滚动更新等功能。通过这些控制器的协同工作,保障了集群内资源状态的稳定和符合预期,在源码中,各个控制器都有其独立的逻辑实现和状态管理机制,通过不断地循环检查和处理来维护集群的正常运行。
  • kube-scheduler:它的主要职责是为新创建的 Pod 选择合适的 Node(节点,也就是运行容器的宿主机)进行部署,会综合考虑多个因素,如 Node 的可用资源(CPU、内存等)、Pod 的资源需求、亲和性和反亲和性规则(决定哪些 Pod 适合或者不适合部署在同一 Node 上)等,通过一套复杂的调度算法(在源码中有详细的算法实现和相关的数据结构来支持调度决策)来找到最优的 Node,从而实现容器在集群内的合理分布和资源的高效利用。
Node 节点组件:
  • kubelet:运行在每个 Node 上,它负责与 Master 节点通信,接收 Master 发来的指令并在本地执行,比如创建、启动、停止和删除 Pod 等操作。同时,它还会监控本地容器的运行状态,向 Master 节点汇报资源使用情况(如 CPU、内存的使用率等),在源码中,kubelet 实现了与容器运行时(如 Docker、containerd 等)的交互接口,通过调用相应的 API 来管理容器,并且维护了本地容器的详细状态信息,保障容器在 Node 上的正常运行和与集群的协调一致。
  • kube-proxy:主要负责实现 Kubernetes 集群内的服务发现和负载均衡功能,它通过在 Node 上设置网络规则(如 iptables 规则、IPVS 规则等,不同的实现方式可以通过配置选择),将对服务(Service)的访问请求转发到对应的 Pod 集合上。例如,当有外部请求访问一个后端由多个 Pod 组成的服务时,kube-proxy 会根据设定的负载均衡策略(如轮询、随机等)将请求均匀地分配到各个 Pod 上,保障服务的高可用性和负载均衡,在源码中,kube-proxy 有针对不同网络代理机制的具体实现代码,用于准确地配置和更新网络规则,实现高效的服务转发和负载均衡功能。
2. Docker 与 Kubernetes 的协同工作

在实际的微服务部署场景中,Docker 与 Kubernetes 常常配合使用,各自发挥优势来构建高效、可靠的容器化应用平台。

容器运行时层面的协作:
  • Kubernetes 本身支持多种容器运行时,Docker 就是其常用的一种(当然也可以使用其他如 containerd 等)。在 Kubernetes 集群中,kubelet 作为与容器运行时交互的关键组件,当需要创建、启动或管理容器时,kubelet 会调用 Docker 的 API(通过实现相应的接口规范,在源码中有对应的调用逻辑和参数传递等实现细节)来执行具体的操作。例如,当一个新的 Pod(Pod 是 Kubernetes 中最小的可部署和可管理的计算单元,里面可以包含一个或多个容器)需要被部署到某个 Node 上时,kubelet 会向 Docker 发送创建容器的请求,按照 Pod 的配置信息(如镜像名称、容器启动命令、资源需求等)来启动相应的 Docker 容器,并且在容器运行过程中,kubelet 会持续监控容器状态,通过 Docker 的 API 获取容器的资源使用情况、运行状态等信息,并反馈给 Kubernetes 的其他组件,实现容器在集群内的统一管理和状态跟踪。
镜像管理与使用方面的协作:
  • Docker 构建的镜像可以无缝地被 Kubernetes 使用。在 Kubernetes 的资源配置文件(如 Deployment、Pod 等资源定义文件)中,通过指定镜像名称和标签(例如 image: my-service:1.0,这里 my-service:1.0 就是 Docker 构建的镜像),Kubernetes 在调度 Pod 部署时会从相应的镜像仓库(可以是 Docker Hub 等公共仓库,也可以是企业内部的私有仓库)拉取指定的镜像,然后基于该镜像启动容器。同时,Kubernetes 也提供了镜像更新、版本管理等功能,当需要升级微服务时,可以通过修改资源配置文件中的镜像标签来触发滚动更新(例如从 my-service:1.0 更新到 my-service:2.0),Kubernetes 会按照设定的更新策略(如逐步替换旧的 Pod 等),利用 Docker 的镜像拉取和容器启动功能,平稳地完成微服务的版本升级,保障业务的连续性和稳定性。
网络配置方面的协作:
  • 在网络配置上,Kubernetes 有自己的一套网络模型和配置机制,它旨在实现容器之间以及容器与外部网络的可靠、高效通信,同时要满足集群内复杂的服务发现、负载均衡等需求。虽然 Docker 本身有多种网络模式可供选择,但在 Kubernetes 集群中,通常会采用 Kubernetes 原生的网络插件(如 Calico、Flannel 等)来构建网络。这些网络插件会与 Docker 的网络功能相互配合,例如,在容器启动时,Kubernetes 网络插件会基于 Docker 的网络接口(通过调用 Docker 的网络相关 API 或者利用 Docker 已创建的网络环境基础)为容器配置合适的 IP 地址、设置网络路由以及实现跨节点的网络通信等功能,保障容器在 Kubernetes 集群环境下能够按照集群的网络规划进行通信和协作,实现不同微服务之间的相互调用以及对外提供统一的服务接口。
资源管理和调度方面的协作:
  • Kubernetes 通过资源配额(Resource Quota)、限制范围(Limit Range)等机制来对集群内的资源(如 CPU、内存等)进行统一管理和分配,确保各个微服务(以 Pod 为单位进行资源分配考量)能够获得合理的资源来稳定运行,避免资源的过度占用或浪费。在这个过程中,Docker 提供了基于 cgroups 等内核特性的资源限制和统计功能(前面介绍 Docker 基本概念时有提到),Kubernetes 在调度 Pod 时,会参考 Docker 提供的容器资源使用情况(通过 kubelet 获取并上报的信息)以及预先设定的资源需求参数(在 Pod 资源配置文件中定义),利用自身的调度算法(如前面提到的 kube-scheduler 的调度算法),将 Pod 合理地分配到不同的 Node 上,并且在运行过程中持续监控资源使用情况,通过与 Docker 的交互(如调整容器的资源限制参数等)来保障资源的有效利用和整个集群的性能平衡,实现微服务在资源层面的高效部署和稳定运行。

通过 Docker 与 Kubernetes 的紧密协作,能够充分发挥 Docker 在容器构建、镜像管理等方面的便利性以及 Kubernetes 在容器编排、资源管理、服务发现等方面的强大功能,为微服务的大规模部署、运行和管理提供了一个完善的解决方案,满足复杂业务场景下对容器化应用的各种需求。

(四)实际项目案例演示微服务的容器化部署流程

1. 案例背景

假设有一个在线商城系统,采用微服务架构,包含用户服务(负责用户注册、登录、信息查询等功能)、商品服务(管理商品信息的添加、查询、修改等操作)、订单服务(处理订单的创建、支付、查询等流程)以及支付服务(对接第三方支付平台完成支付操作)等多个微服务。该系统需要部署到生产环境中,并且要满足高可用性、可扩展性以及易于管理等要求,我们将使用 Docker 和 Kubernetes 来实现微服务的容器化部署。

2. 架构设计
整体架构:
  • 整个系统架构基于 Kubernetes 集群进行部署,Kubernetes 集群由多个 Master 节点(用于管理集群资源、调度等操作)和多个 Node 节点(作为容器的宿主机,运行各个微服务的容器)组成。每个微服务都构建为独立的 Docker 镜像,然后通过 Kubernetes 的资源配置文件进行定义和部署,实现微服务之间的相互协作以及对外提供服务。
微服务镜像构建:

以用户服务为例,其项目结构和代码实现(简化示例)如下:

user-service/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/userservice/
│       │       ├── UserController.java
│       │       ├── UserService.java
│       │       ├── UserRepository.java
│       │       └── User.java
│       └── resources/
│           ├── application.properties
│           └── static/
└── Dockerfile

UserController.java:

@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping("/register")public User registerUser(@RequestBody User user) {return userService.registerUser(user);}
}

UserService.java:

@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}public User registerUser(User user) {return userRepository.save(user);}
}

UserRepository.java:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

User.java:

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// 省略构造函数、Getter 和 Setter 等方法
}

application.properties:

server.port=8080
spring.datasource.url=jdbc:mysql://<数据库地址>/<数据库名称>
spring.datasource.username=<用户名>
spring.datasource.password=<密码>

Dockerfile 示例:

# 基于 OpenJDK 11 构建 Spring Boot 微服务镜像
FROM openjdk:11-jdk# 设置工作目录
WORKDIR /app# 复制项目的 JAR 文件到容器内(假设已经通过 Maven 或 Gradle 构建好 JAR 文件)
COPY target/user-service-1.0.jar /app/user-service-1.0.jar# 设置容器启动时执行的命令,运行 Spring Boot 微服务
CMD ["java", "-jar", "user-service-1.0.jar"]
构建用户服务镜像的步骤如下:
  • 首先,在用户服务项目目录下通过 Maven 或 Gradle 构建出可执行的 JAR 文件(以 Maven 为例,执行 mvn clean package),然后在包含 Dockerfile 的目录下执行以下命令构建镜像:
docker build -t user-service:1.0.
  • 同样的方式,可以为商品服务、订单服务、支付服务等其他微服务分别构建对应的 Docker 镜像,只是每个微服务的代码实现和配置会根据其具体功能有所不同。
Kubernetes 资源配置:

接下来,为了在 Kubernetes 集群中部署这些微服务,需要创建相应的 Kubernetes 资源配置文件。
以用户服务为例,创建一个 user-service-deployment.yaml 文件用于定义 Deployment(用于管理 Pod 的创建、更新和副本数量等)资源:

apiVersion: apps/v1
kind: Deployment
metadata:name: user-service-deploymentlabels:app: user-service
spec:replicas: 3selector:matchLabels:app: user-servicetemplate:metadata:labels:app: user-servicespec:containers:- name: user-service-containerimage: user-service:1.0ports:- containerPort: 8080

在这个配置文件中:

  • apiVersion、kind 等字段定义了这是一个 apps/v1 版本的 Deployment 资源,名称为 user-service-deployment,并且通过 labels 打上了 app: user-service 的标签用于标识和筛选。
  • replicas 字段指定了要创建 3 个副本的 Pod,以保障服务的高可用性,即使某个容器出现故障,还有其他副本可以继续提供服务。
  • selector 用于指定该 Deployment 管理哪些 Pod,通过匹配 labels 中的 app: user-service 来关联对应的 Pod。
  • template 部分定义了 Pod 的模板,每个 Pod 内包含一个名为 user-service-container 的容器,使用之前构建的 user-service:1.0 镜像,并且容器内的应用监听 8080 端口。

还需要创建一个 user-service-service.yaml 文件用于定义 Service(用于实现服务发现和负载均衡)资源,使得其他微服务或者外部客户端能够访问到用户服务:

apiVersion: v1
kind: Service
metadata:name: user-service
spec:selector:app: user-serviceports:- protocol: TCPport: 8080targetPort: 8080type: ClusterIP

在这个 Service 配置文件中:

  • 通过 selector 关联到之前定义的带有 app: user-service 标签的 Pod,这样 Service 就知道要将请求转发到哪些后端 Pod 上。
  • ports 字段定义了服务暴露的端口信息,这里将外部访问的端口(port)和转发到容器内部的目标端口(targetPort)都设置为 8080,并且协议为 TCP。
  • type 字段设置为 ClusterIP,表示该服务在 Kubernetes 集群内部可访问,外部网络默认无法直接访问,如果需要对外暴露,可以根据实际情况修改为 NodePort 或 LoadBalancer 等类型(NodePort 会在每个 Node 节点上开放一个指定端口用于外部访问,LoadBalancer 通常用于结合云平台的负载均衡器对外提供服务)。

类似地,为商品服务、订单服务、支付服务等其他微服务也分别创建对应的 Deployment 和 Service 资源配置文件,只是配置中的名称、镜像等信息根据各自微服务进行相应修改。

3. 部署流程
准备 Kubernetes 集群:
  • 首先,需要搭建好一个 Kubernetes 集群,可以通过多种方式实现,比如使用 kubeadm 工具在多台服务器上进行安装和初始化(以下是简单的 kubeadm 初始化 Master 节点示例,实际操作可能需要根据具体环境进行更多配置和调整):
    在 Master 节点上执行以下命令:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://packages.cloud.google.com/apt kubernetes-xenial main"
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • 初始化完成后,按照提示配置 kubectl 命令的使用权限(一般需要执行类似 mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config 的命令)。
    然后,安装网络插件(以 Flannel 网络插件为例),在 Master 节点上执行:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 接着,将 Node 节点加入到 Kubernetes 集群中,在每个 Node 节点上执行 kubeadm join 命令(命令参数需要根据 Master 节点初始化完成后输出的提示信息进行填写)。
部署微服务到 Kubernetes 集群:
  • 在确保 Kubernetes 集群正常运行且网络配置完成后,就可以将之前创建的微服务资源配置文件部署到集群中了。

以用户服务为例,在包含 user-service-deployment.yaml 和 user-service-service.yaml 文件的目录下,执行以下命令分别创建 Deployment 和 Service 资源:

kubectl apply -f user-service-deployment.yaml
kubectl apply -f user-service-service.yaml
  • 同样的方式,依次将其他微服务(商品服务、订单服务、支付服务等)对应的 Deployment 和 Service 资源配置文件部署到 Kubernetes 集群中,执行完这些操作后,Kubernetes 会根据配置自动调度并在合适的 Node 节点上创建相应的 Pod 副本,启动容器,并且通过 Service 资源实现服务之间的相互访问和负载均衡。

可以使用以下 kubectl 命令来查看部署情况:

  • 查看所有的 Deployment 资源状态:
kubectl get deployments

输出类似如下信息,展示各个微服务的 Deployment 的名称、可用副本数、期望副本数等情况:

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
user-service-deployment   3/3     3            3           10m
product-service-deployment   3/3     3            3           8m
order-service-deployment    3/3     3            3           6m
payment-service-deployment   3/3     3            3           4m

查看所有的 Service 资源状态:

kubectl get services

输出类似如下信息,展示各个微服务的 Service 的名称、类型、集群内部 IP 地址以及暴露的端口等情况:

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
user-service            ClusterIP   10.96.123.123    <none>        8080/TCP   10m
product-service         ClusterIP   10.96.234.234    <none>        8080/TCP   8m
order-service           ClusterIP   10.96.345.345    <none>        8080/TCP   6m
payment-service          ClusterIP   10.96.456.456    <none>        8080/TCP   4m
  • 通过上述完整的流程,利用 Docker 构建微服务镜像,再结合 Kubernetes 进行容器编排和资源管理,成功实现了在线商城系统微服务的容器化部署,并且能够方便地进行扩展、管理以及保障服务的高可用性和稳定运行。
  • 在实际项目中,可以根据业务需求的变化,比如流量增长需要增加微服务副本数量、微服务版本更新等情况,通过修改 Kubernetes 的资源配置文件并执行相应的 kubectl 命令来实现灵活的调整和部署,充分发挥容器化技术和容器编排平台在微服务架构下的优势。

希望通过这个实际案例,能让读者更清晰地理解如何使用 Docker 与 Kubernetes 协同进行微服务的容器化部署,在实际的项目开发和部署中能够更好地运用这些技术来构建高效、可靠的分布式系统。

总之,容器化技术特别是 Docker 以及与之配合的容器编排工具如Kubernetes,为微服务的部署和管理带来了极大的便利和优势,从镜像构建、容器运行到集群化的资源调配和服务管理,形成了一套完整的解决方案,助力企业应对复杂多变的业务场景和不断增长的系统规模需求。

相关文章:

【容器化技术 Docker 与微服务部署】详解

容器化技术 Docker 与微服务部署 一、容器化技术概述 &#xff08;一&#xff09;概念 容器化技术是一种操作系统级别的虚拟化方法&#xff0c;它允许将应用程序及其依赖项&#xff08;如运行时环境、系统工具、库等&#xff09;打包成一个独立的、可移植的单元&#xff0c;这…...

MySQL——数据类型

一、常见的数据类型及分类 其中上述的数值类型包含了整形和浮点型&#xff0c;文本、二进制类型主要是字符串类型。 整数类型&#xff08;Integer Types&#xff09;&#xff1a; TINYINT&#xff1a;范围为-128到127或0到255&#xff08;无符号&#xff09;&#xff0c;用于…...

基于傅立叶神经网络(FNN)与物理信息神经网络(PINN)求解泊松方程(附Pytorch源代码)

基于傅立叶神经网络(FNN)与物理信息神经网络(PINN)求解泊松方程 一、引言 偏微分方程(Partial Differential Equation, PDE)在科学与工程领域有着广泛的应用。传统数值方法(如有限差分法、有限元法)在求解这类问题时,尽管已经非常成熟,但随着问题复杂度的增加,其计…...

FastExcel:超越EasyExcel的新一代Excel处理工具

简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有优点&#xff0c;并且在性能和功能上进行了显著的提升和创新。 FastExcel的特点 高性能读写&#xff1a;FastExcel专注于性能优化&#xff0c;能够高效处理…...

项目优化性能监控

目录 1. 性能平台搭建 1.1 影响性能的关键要素 1.2 压力测试 1.3 压力测试指标 1.4 Jmeter 1.5 Jmeter常用插件 1.6 性能关键指标 1.7 服务器硬件资源监控 1.8 系统负载:load average 1.9 搭建压测监控平台 1.10 梯度压测&#xff1a;分析接口性能瓶颈 2. 项目优化…...

linux装git

前言 以 deepin 深度系统为例&#xff0c;安装命 令行版 Git 非常简单。 安装 注意&#xff1a;需要输入账号密码&#xff0c;否则无法进行。 打开终端&#xff0c;执行如下命令即可。 sudo apt-get install git成功 如下图所示&#xff0c;输入 git &#xff0c;命令识别即…...

2024 年度总结

时光荏苒&#xff0c;2024 年即将画上句号&#xff0c;回顾这一年的写博历程&#xff0c;有付出、有收获、有成长&#xff0c;也有诸多值得回味与反思的瞬间。 一、内容创作 主题涉猎&#xff1a;这一年&#xff0c;我致力于探索多样化的主题&#xff0c;以满足不同读者群体的…...

实验八 指针2

7-1 利用指针返回多个函数值 分数 30 全屏浏览 切换布局 作者 陈晓梅 单位 广东外语外贸大学 读入n个整数&#xff0c;调用max_min()函数求这n个数中的最大值和最小值。 输入格式: 输入有两行&#xff1a; 第一行是n值&#xff1b; 第二行是n个数。 输出格式: 输出最大…...

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…...

C进阶-字符串与内存函数介绍(另加2道典型面试题)

满意的话&#xff0c;记得一键三连哦&#xff01; 我们先看2道面试题 第一道&#xff1a; 我们画图理解&#xff1a; pa&#xff0c;先使用再&#xff0c;pa开始指向a【0】&#xff0c;之后pa向下移动一位&#xff0c;再解引用&#xff0c;指向a【1】&#xff0c;a【1】又指向…...

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…...

充电桩语音提示IC方案-支持OTA远程更换语音WT2003H让充电更智能

随着新能源汽车产业的蓬勃发展&#xff0c;充电桩作为电动汽车能量补给的关键设施&#xff0c;其智能化、人性化设计日益成为行业关注的焦点。在这一背景下&#xff0c;WT2003H4-16S语音芯片方案的推出&#xff0c;无疑为充电桩的智能化升级注入了新的活力。该方案不仅提升了充…...

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;...

开源的Vue低代码表单设计器 form-create-designer v3.2.9 版本发布,新增10多种功能

form-create-designer 是一款开源的低代码表单设计器&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 项目采…...

0042__【小沐学OpenGL】Ubuntu环境下glfw的安装和使用

【小沐学OpenGL】Ubuntu环境下glfw的安装和使用_ubuntu glfw-CSDN博客 OpenGL 打开绘制窗口 学习笔记_glfwmakecontextcurrent-CSDN博客...

第一节:电路连接【51单片机+A4988+步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机A4988步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制模块 ②开关电源 ③A4988模块转接座 ④二相四线步进电机 ⑤电线若干 二、接线 三、A49…...

k8s 部署meilisearch UI

https://github.com/riccox/meilisearch-ui 拉取镜像 sudo docker pull riccoxie/meilisearch-ui:latestk8s 部署 apiVersion: v1 kind: Service metadata:name: meilisearch-uinamespace: meilisearch spec:type: NodePortselector:app: meilisearch-uiports:- port: 24900…...

在基于Centos7的服务器上启用【Gateway】的【Clion Nova】(即 ReSharper C++ 引擎)

1. 检查启动报错日志&#xff0c;目录在 ~/.cache/JetBrains/CLion202x.x.x/log/backend.202x-xx-xx_xxxx.xxxx-err.log 2. 大致可能有两种报错 a. Process terminated. Couldnt find a valid ICU package installed on the system. 这个报错只需要装一下 libicu-devel 包即可…...

【Rust自学】7.4. use关键字 Pt.1:use的使用与as关键字

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.4.1. use的作用 use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则&#xff0c;也就是只有公共的部分引入进来才…...

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码&#xff0c;春节新年网…...

C++新特性||线程协程(代码解析1)

原文https://blog.csdn.net/ke_wu/article/details/144807820?sharetypeblogdetail&sharerId144807820&sharereferPC&sharesourceke_wu&spm1011.2480.3001.8118 #ifndef ZERO_THREADPOOL_H #define ZERO_THREADPOOL_H#include <future> // 用于…...

《成瘾-在放纵中寻找平衡》

安娜伦布克&#xff08;Anna Lembke&#xff09;是美国著名的精神病学家、成瘾医学专家以及《多巴胺国度》&#xff08;Dopamine Nation&#xff09;的作者。她在书中深入探讨了现代社会中的成瘾问题&#xff0c;并结合科学研究与临床经验&#xff0c;揭示了为什么现代人更容易…...

Docker搭建Skywalking

Docker搭建Skywalking 虚拟机IP&#xff1a;192.168.0.109Nacos服务地址&#xff1a;http://192.168.0.109:8848/nacosMySQL服务&#xff1a; IP&#xff1a;192.168.0.109端口&#xff1a;3306用户名&#xff1a;root密码&#xff1a;root ElasticSearch服务&#xff1a; IP&a…...

Vue axios 异步请求,请求响应拦截器

在 Vue.js 中使用 axios 进行网络请求是非常常见的做法&#xff0c;因为它提供了比原生的 Fetch API 更丰富的功能&#xff0c;并且更易于处理错误和配置。结合 Axios 的拦截器功能&#xff0c;你可以对所有的请求或响应进行预处理&#xff0c;比如添加认证头信息、统一处理错误…...

解决 ffmpeg “Unknown encoder ‘hevc_nvenc‘“

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: ffmpeg 剪切视频 问题描述 详细报错: [vost#0:0 @ 0x46ae00] Unknown encoder hevc_nvenc 原因分析: ffmpeg 安装错误 解决方案: 重新安装ffmpeg: conda install ffmpeg 检查当前安装的 FFmpeg 是否支…...

Kafka安全优化文档:漏洞修复到安全加固

文章目录 1.1.漏洞修复1.1.1.Apache Kafka反序列化漏洞1.1.2.pm2-kafka代码执行漏洞1.1.3.Apache Kafka安全绕过漏洞1.1.4.Apache Kafka Distribution - Schema Repository跨站请求伪造漏洞1.1.5.Apache Kafka输入验证错误漏洞的补丁1.1.6.Apache Kafka信息泄露漏洞1.1.7.Apach…...

Django 中数据库迁移命令

在 Django 中&#xff0c;python manage.py makemigrations、python manage.py sqlmigrate polls 0003 和 python manage.py migrate 是与数据库迁移相关的重要命令。它们的作用和对应内容如下&#xff1a; 1. python manage.py makemigrations 功能: 此命令会根据你的模型文…...

2024 高通边缘智能创新应用大赛智能边缘计算赛道冠军方案解读

2024 高通边缘智能创新应用大赛聚焦不同细分领域的边缘智能创新应用落地&#xff0c;共设立三大热门领域赛道——工业智能质检赛道、智能边缘计算赛道和智能机器人赛道。本文为智能边缘计算赛道冠军项目《端侧大模型智能翻译机》的开发思路与成果分享。 赛题要求 聚焦边缘智能…...

前端超大缓存IndexDB、入门及实际使用

文章目录 往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情 删除数据 总结 往期回顾 在之前的文章中&#xff0c;我们介绍了IndexDB vs Cookies vs Session这几个的对比&#xff0c;但是没有做实际项目的演示&#xff0c;今天我们用…...

[创业之路-229]:《华为闭环战略管理》-5-平衡记分卡与战略地图

目录 一、平衡记分卡 1. 财务角度&#xff1a; 2. 客户角度&#xff1a; 3. 内部运营角度&#xff1a; 4. 学习与成长角度&#xff1a; 二、BSC战略地图 1、核心内容 2、绘制目的 3、绘制方法 4、注意事项 一、平衡记分卡 平衡记分卡&#xff08;Balanced Scorecard&…...

形象地理解UE4中的数据结构 TLinkedListBase

大家都熟知链表&#xff0c;但不一定能快速看懂UE4中的数据结构。 TLinkedListBase表示“链接”中的一个结点&#xff0c;有三个成员&#xff1a; 一、ElementType Element; 表示具体的业务&#xff0c;例如int链条中的一个整数。 二、NextLink 表示 “下一个Node”&#…...

如何在谷歌浏览器中创建安全的密码

在数字化时代&#xff0c;网络安全变得日益重要。谷歌浏览器提供了多种工具和功能帮助用户创建和管理强密码&#xff0c;确保在线账户的安全。本文将简要介绍几种方法&#xff0c;帮助您在谷歌浏览器中创建和管理安全密码。 一、启用自动填充功能 确认密码保存功能已开启&…...

Nginx1.20.2-Linux-安装

文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本&#xff0c;指定编译路径为/usr/local/nginx 5.编译并安装6.…...

网页版3D预览插件3dfindit

需求背景 如果你需要在浏览器上显示3D的模型&#xff0c;那么你可以看看这个3dfindit。不需要专业的代码开发&#xff0c;上传模型或者图片就行&#xff0c;他会自动生成3D预览。 效果图 // 效果图预览地址https://ksb-embedded.partcommunity.com/3d-cad-models/boa-compact…...

产品经理2025年展望

产品经理作为连接技术、设计与市场需求的桥梁&#xff0c;在快速变化的商业环境中扮演着至关重要的角色。展望2025年&#xff0c;随着技术的不断进步和消费者需求的日益多样化&#xff0c;产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用&#xff1a; 到…...

计算机找不到xinput1_3.dll无法执行怎么办?电脑缺失xinput1_3.dll文件怎么修复?

当计算机提示找不到xinput1_3.dll文件&#xff0c;导致某些程序或游戏无法执行时&#xff0c;可以采取以下步骤来修复这个问题&#xff1a; 一、了解xinput1_3.dll文件 xinput1_3.dll是Microsoft DirectX for Windows的控制模块&#xff0c;它包含了一组函数和数据结构&#…...

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…...

你了解DNS吗?

你了解DNS吗&#xff1f; 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 …...

pyinstaller打包exe可执行文件

cd命令符进入要打包文件路径下&#xff0c;执行&#xff1a; 1.打包单个py文件&#xff0c;在控制台执行;dist下会生成2个文件&#xff0c;一个是exe文件 pyinstaller -D happy.py (cd命令符进入要打包文件路径下&#xff0c;执行) 打包单个py文件&#xff0c;在控制台执行;…...

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…...

rust学习-初识rust

rust学习-初识rust 什么是 Rust&#xff1f;Rust 的特点什么是 Cargo&#xff1f;Cargo 的主要功能使用 Cargo 创建和管理项目Cargo.toml 文件详解常用 Cargo 命令什么是 Rustup&#xff1f;Rustup 的主要功能安装 Rustup验证安装使用 Rustup 管理工具链使用 Rustup 管理目标平…...

word怎么添加链接,点击直接到参考文献

word怎么添加链接,点击直接到参考文献 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 在Word中添加点击可直接跳转到参考文献的链接,主要有以下两种方法: 使用交叉引用和超链接结合的方法 插入参考文献: 首先,在文档中需要插入参考…...

数字赋能:制造企业如何靠“数字能力”实现可持续“超车”?

如今&#xff0c;制造业数字化转型可是个热门话题&#xff0c;全球都在积极推进。我国更是出台了一系列给力的政策来助力制造业数字化转型&#xff0c;像《中国制造 2025》就明确提出要加快制造业数字化、网络化、智能化发展&#xff0c;各省市也纷纷响应&#xff0c;从资金、税…...

C++——deque的了解和使用

目录 引言 标准库中的deque 一、deque的基本概念 二、deque的常用接口 1.deque的迭代器 2.deque的初始化 3.deque的容量操作 3.1 有效长度和容量大小 3.2 有效长度和容量操作 4.deque的访问操作 5.deque的修改操作 三、deque的应用场景 结束语 引言 在C中&#x…...

vue使用el-select下拉框自定义复选框

在 Vue 开发中&#xff0c;高效且美观的组件能极大地提升用户体验和开发效率。在vue中使用elementplus 的 el-select下拉框实现了一个自定义的多选下拉框组件。 一、代码功能概述 这段代码创建了一个可多选的下拉框组件&#xff0c;通过el-select和el-checkbox-group结合的方…...

《探秘开源大模型:AI 世界的“超级引擎”》

《探秘开源大模型:AI 世界的“超级引擎”》 一、开源大模型崛起之路二、开源大模型发展历程回顾(一)早期奠基:理论突破与初步实践(二)快速发展:百花齐放的模型格局(三)当下态势:走向成熟与多元融合三、开源大模型核心技术剖析(一)Transformer 架构:基石之稳(二)…...

浏览器跨域原因及解决方式

一、为什么会有跨域 浏览器的同源策略 用于限制一个源的文档或它所加载的脚本如何能与另一个源交互。 它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介 二、什么是同源 两个url&#xff0c;只要它们的协议、域名、端口有一个不相同&#xff0c;就会导致跨域&#xf…...

如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory

Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4&#xff0c;CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题&#xff0c;编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …...

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…...

idea项目导入gitee 码云

1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚&#xff0c;推荐前两种方法&#xff0c; 搜索码云插件的时候记得名字是gitee&#xff0c;gitosc已经搜不到了。 2、使用码云托管项目 如果之…...