docker 镜像详解

在这里插入图片描述
Docker镜像是一种轻量级、可移植的软件打包格式,它包含了运行应用程序所需的一切,是构建和分发应用程序的基础。以下是对Docker镜像的详细解释:

一、镜像的定义

镜像本质上是一个只读文件,包含了文件系统、源码、库文件、依赖、工具等运行应用程序所必须的文件。它可以被理解为一个模板,通过这个模板可以实例化出很多容器。每个容器都是镜像的一个运行实例,包含了运行应用程序所需的所有内容,如代码、运行时环境、系统工具和库。
具体来说,容器镜像通常是由多层文件系统叠加而成的,每一层都包含了一些特定的文件或配置。这些层是联合文件系统(Union File System)的一部分,它们可以被组合在一起以形成一个完整的镜像。当对镜像进行修改时,实际上是在创建一个新的层,这个新层包含了所做的修改,而底层的层则保持不变。这种分层的设计使得容器镜像非常灵活和高效,因为它可以充分利用共享层来减少存储空间的占用,并且可以快速构建和分发新的镜像。
容器镜像可以存储在本地或远程仓库中,方便用户进行共享和分发。通过容器镜像,用户可以轻松地创建和管理容器实例,实现应用程序的快速部署和扩展。同时,容器镜像还具有一定的安全性和隔离性,因为容器是运行在独立的命名空间中,它们之间的资源是相互隔离的,这保证了应用程序的稳定性和安全性。
在容器化技术中,Docker是最流行的容器平台之一,它使用自己的镜像格式来打包和分发应用程序。但是,除了Docker之外,还有其他容器平台也使用类似的镜像格式,如Kubernetes中的容器镜像通常也是基于Docker镜像格式构建的。

二、镜像的构成

Docker镜像是由一层层文件系统叠加而成的,每一层都包含了一些特定的文件或配置。这些层是联合文件系统(Union File System)的一部分,它们可以被组合在一起以形成一个完整的镜像。当对镜像进行修改时,实际上是在创建一个新的层,这个新层包含了所做的修改,而底层的层则保持不变。这种分层的设计使得Docker镜像非常灵活和高效,因为它可以充分利用共享层来减少存储空间的占用。
在这里插入图片描述

1、基础概念

  1. 容器镜像:是容器的模板,容器是镜像的运行实例。容器镜像挂载在容器根目录下,为容器中的应用提供隔离后执行环境的文件系统。容器镜像打包了整个操作系统的文件和目录(rootfs),也包括应用本身,以保证本地和云端的一致性。
  2. 分层结构:容器镜像采用分层文件系统,每一层都是基于前面一层进行的更改或添加。这种分层结构使得镜像的共享、容器创建和分发非常高效。

2、镜像的组成部分

  1. 基础镜像层(Base Image Layer)
  • 定义:基础镜像层是容器镜像的最底层,通常包含了一个轻量级的操作系统环境,如Alpine Linux、Ubuntu等。
  • 作用:为上层的应用程序提供必要的运行环境和依赖项。
  • 样例:官方的Python运行时作为基础镜像。
# 使用官方的Python 3.7-slim作为父镜像  
FROM python:3.7-slim
  1. 依赖项层(Dependencies Layer)
  • 定义:在基础镜像层之上,可能会叠加多个依赖项层,这些层包含了应用程序运行所需的各种库文件、软件包等。
  • 作用:确保应用程序能够在目标环境中找到所有必要的依赖项。
  • 样例:需要安装一些额外的Python包,这些包将作为依赖项层添加到镜像中。
# 设置工作目录为/app  
WORKDIR /app  
  
# 复制当前目录的内容到容器的/app目录下  
COPY . /app  
  
# 安装requirements.txt中指定的任何需要的包  
RUN pip install --trusted-host pypi.python.org -r requirements.txt
  1. 应用程序层(Application Layer)
  • 定义:应用程序层是容器镜像的最上层,包含了应用程序的二进制文件、脚本、配置文件等。
  • 作用:提供应用程序本身及其所需的运行时环境。
  • 样例:在依赖项层之上,添加应用程序本身。在这个例子中,假设我们有一个名为app.py的Python应用程序。
# 容器启动时运行app.py  
CMD ["python", "app.py"]
  1. 元数据(Metadata)
  • 定义:元数据是与容器镜像相关的各种信息,如镜像的创建者、创建时间、版本信息、标签(Tag)等。
  • 作用:提供关于镜像的额外信息,有助于镜像的管理和分发。
  • 样例:可以通过Docker命令(如docker build -t your-image-name .)中的-t选项来指定镜像的名称和标签,从而间接地包含元数据。
  1. 配置文件(Configuration Files)
  • 定义:配置文件可能包含在镜像的多个层中,特别是应用程序层。这些文件定义了应用程序的运行方式、环境变量、网络配置等。
  • 作用:确保应用程序在容器中以预期的方式运行。
  • 样例:可以通过Dockerfile中的ENV指令来设置环境变量,或者使用Docker的–env-file选项来加载外部配置文件。
# 设置环境变量  
ENV NAME World

OR

docker run --env-file ./env.list your-image-name
  1. 存储驱动层(Storage Driver Layer)
  • 定义:虽然存储驱动层不是镜像的直接组成部分,但它是容器运行时环境的一部分。存储驱动负责将镜像的层叠加在一起,形成一个完整的文件系统。Docker支持多种存储驱动,如overlay2、aufs、devicemapper、btrfs和zfs等。选择哪种存储驱动取决于操作系统、内核版本和特定的性能需求。
  • 作用:提供对镜像文件系统的访问,并支持容器的读写操作。
    • 分层存储:Docker镜像由多个只读层组成,这些层叠加在一起形成最终的文件系统。存储驱动层负责这些层的叠加和管理。
    • 写时复制:当容器需要修改某个文件时,存储驱动层会采用写时复制(Copy-on-Write,CoW)机制,将只读层中的文件复制到可写层,然后在可写层中进行修改。这样可以确保镜像层的完整性,同时实现文件的隔离性。
    • 资源共享:不同的容器可以共享相同的基础镜像层,从而节省存储空间。存储驱动层通过管理这些共享的层来实现资源的优化。
  • 样例
    • 查看支持的存储驱动:
      使用docker info命令可以查看Docker支持的所有存储驱动。
docker info | grep "Storage Drivers"
- 配置存储驱动:

在Docker的配置文件中(如/etc/docker/daemon.json),可以通过设置storage-driver选项来指定存储驱动。

{  
  "storage-driver": "overlay2"  
}
  1. 安全特性(Security Features)
  • 定义:容器镜像可能包含一些安全特性,如签名和验证机制,以确保镜像的完整性和可信度。
  • 作用:保护镜像免受恶意攻击和篡改。
  • 特性
    1. 镜像签名与验证
      • 特性描述:镜像签名是通过数字签名技术,对镜像进行身份认证和完整性校验的过程。只有经过签名验证的镜像才能被允许运行,从而防止恶意镜像的入侵。
      • 示例:Docker平台支持镜像签名功能,可以使用Docker Content Trust(DCT)等工具对镜像进行签名和验证。
      • 配置建议:在Docker配置中启用DCT功能,要求所有部署的镜像必须经过签名验证。
    2. 最小权限原则
      • 特性描述:在制作镜像时,应遵循最小权限原则,即只包含应用程序运行所需的最小基础设施和依赖库,从而减少潜在的安全风险。
      • 示例:在Dockerfile中,使用官方的基础镜像,并只安装必要的软件包和依赖库。
      • 配置建议:定期审查Dockerfile和镜像内容,确保只包含必要的组件和服务。
    3. 安全更新与漏洞扫描
      • 特性描述:容器镜像应定期更新以修复已知的安全漏洞,并使用漏洞扫描工具对镜像进行扫描,以确保镜像的安全性。
      • 示例:使用Docker Security Hub等安全工具,定期扫描镜像并获取安全更新。
      • 配置建议:将漏洞扫描和安全更新纳入CI/CD流程,确保每次构建和部署都经过安全验证。
    4. 运行时安全保护
      • 特性描述:通过配置容器的运行时安全保护机制,如Seccomp、AppArmor等,可以限制容器的权限和行为,增强容器的安全性。
      • 示例:在Docker中配置Seccomp Profile,限制容器可以执行的系统调用。
      • 配置建议:根据应用程序的需求,定制合适的Seccomp Profile和AppArmor策略,并应用到容器中。
    5. 隔离与限制
      • 特性描述:容器技术通过提供隔离的运行环境,将应用程序与其依赖的资源隔离开来,从而减少了应用程序之间的相互影响。同时,可以通过配置资源限制,防止单个容器消耗过多的系统资源。
      • 示例:在Docker中,使用–cpus、–memory等参数限制容器的CPU和内存使用。
      • 配置建议:根据应用程序的需求和资源情况,合理配置容器的资源限制和隔离策略。
  1. 运行时配置(Runtime Configuration)
  • 定义:虽然运行时配置不是镜像的直接组成部分,但它与镜像紧密相关。运行时配置指定了容器在启动时应如何配置,包括资源限制、网络配置、存储配置等。
  • 示例
一、资源限制配置
1. CPU限制
	配置方式:通过--cpus参数来限制容器可以使用的CPU数量。
	示例:docker run --cpus=1.5 my-container-image,这表示容器最多可以使用1.5个CPU核心。
2. 内存限制
	配置方式:通过--memory参数来限制容器可以使用的内存大小。
	示例:docker run --memory=512m my-container-image,这表示容器最多可以使用512MB的内存。
3. 磁盘I/O限制
	配置方式:通过--device-read-bps、--device-write-bps等参数来限制容器对特定设备的读写速度。
	示例:docker run --device-read-bps /dev/sda:1mb my-container-image,这表示容器对/dev/sda设备的读取速度被限制为每秒1MB。
二、安全设置配置
1. Seccomp Profile
	配置方式:通过--security-opt seccomp=profile.json参数来指定Seccomp Profile文件,该文件定义了容器可以执行的系统调用。
	示例:docker run --security-opt seccomp=seccomp-profile.json my-container-image,其中seccomp-profile.json是预定义的Seccomp Profile文件。
2. AppArmor策略
	配置方式:通过Docker的AppArmor集成来应用特定的AppArmor策略。
	示例:在Docker守护进程中配置AppArmor策略,或者在运行容器时通过--security-opt apparmor=profile_name参数指定策略。
3. 只读根文件系统
	配置方式:通过--read-only参数将容器的根文件系统设置为只读模式。
	示例:docker run --read-only my-container-image,这表示容器的根文件系统将以只读模式运行。
三、网络配置
1. 网络模式
	配置方式:通过--network参数来指定容器的网络模式,如bridge、host、none等。
	示例:docker run --network=bridge my-container-image,这表示容器将使用默认的bridge网络模式。
2. 端口映射
	配置方式:通过-p或--publish参数来将容器内的端口映射到宿主机上的端口。
	示例:docker run -p 8080:80 my-container-image,这表示将容器内的80端口映射到宿主机的8080端口上。
3. 自定义网络
配置方式:通过Docker网络命令创建一个自定义网络,并在运行容器时指定该网络。
四、其他配置
1. 环境变量
	配置方式:通过-e或--env参数来设置容器的环境变量。
	示例:docker run -e MY_VAR=myvalue my-container-image,这表示在容器中设置了一个名为MY_VAR的环境变量,其值为myvalue。
2. 日志配置
	配置方式:通过--log-driver和--log-opt参数来配置容器的日志驱动和日志选项。
	示例:docker run --log-driver=json-file --log-opt max-size=10m my-container-image,这表示容器将使用json-file日志驱动,并且日志文件的最大大小为10MB。
3. 存储卷
	配置方式:通过-v或--volume参数来将宿主机的目录或文件挂载到容器内。
	示例:docker run -v /my/data:/data my-container-image,这表示将宿主机的/my/data目录挂载到容器内的/data目录上。

3、镜像分层细节

在这里插入图片描述

  1. 镜像层(rootfs):提供容器启动的文件系统,属于只读层。镜像层包含操作系统文件、应用程序及其依赖项等。
  2. init层:用于修改容器中一些特定的配置文件,如/etc/hostname、/etc/hosts、/etc/resolv.conf等。init层也是只读的,但在容器启动时会被挂载到容器中,以提供修改后的配置文件。
  3. 容器层:是可读写层,用于存储容器运行时的更改。当容器运行时,容器层与镜像层、init层一起组合成一个单独的文件系统,成为容器运行时环境。容器对文件系统的更改只会影响容器层,而不会影响底层的镜像层。

特点:

  1. 只读性:
    • 镜像的每个层都是只读的,这意味着在构建后,镜像层的内容不会再改变。
    • 这种设计有助于镜像的高效性和可复用性。如果需要修改镜像,Docker将在现有层之上创建新的镜像层,保持原有层的完整性。
  2. 联合文件系统:
    • Docker使用联合文件系统(UnionFS)技术将多个只读分层组合成一个单一的虚拟文件系统。
    • 联合文件系统使得各个分层看起来像是一个整体,使得镜像中的每个分层的内容在文件系统层次结构中可见,但实际上并不复制这些内容。
    • 这样的设计节省了存储空间,并且可以在不同的镜像之间共享公共层,从而加快镜像的构建和下载速度。
  3. 分层继承:
    • Docker镜像支持分层继承,这意味着可以基于现有的镜像构建新的镜像。
    • 当新的镜像构建时,它只需在现有镜像的基础上添加新的分层,而不需要重新复制现有的分层。
    • 这种分层继承的特性使得镜像构建变得高效和快速,并允许镜像的复用。
  4. 可读写容器层:
    • 当基于镜像创建一个容器时,Docker会在镜像的顶部添加一个可读写的容器层。
    • 这个容器层允许容器在运行时对文件系统进行写操作,例如应用程序的日志输出、数据库文件等。
    • 容器层是临时的,只在容器运行时存在,当容器停止时,对容器层的修改也会被丢弃,保持镜像的不可变性。

三、镜像的制作

制作Docker镜像有多种方式,包括直接构建、使用Dockerfile、通过docker export和import以及docker commit等。其中,使用Dockerfile是最常见和推荐的方式,因为它可以保证镜像的一致性和可重复性。Dockerfile是一个文本文件,包含了创建Docker镜像所需要的所有命令,这些命令将在Docker引擎上执行,从而构建出所需的镜像。

1、准备阶段

  1. 安装Docker:
    • 首先,需要在本地计算机上安装Docker软件。这可以通过Docker官方网站下载并安装,或者使用包管理器(如apt、yum等)在Linux系统上安装。
  2. 理解Dockerfile:
    • Dockerfile是制作Docker镜像的核心文件,它是一个文本文件,包含了一系列指令,用于定义如何构建Docker镜像。
    • 每条指令都会在镜像中创建一个新的层,这些层共同构成了最终的Docker镜像。

2、编写Dockerfile

  1. 创建Dockerfile文件:
    • 在项目目录中创建一个名为Dockerfile的文件(无扩展名)。
  2. 编写Dockerfile内容:
    • 使用Docker指令来定义和配置镜像。常见的指令包括:
      • FROM:指定基础镜像。
      • RUN:在镜像构建过程中执行命令,如安装软件包。
      • COPY:将文件或目录从构建上下文复制到镜像中。
      • WORKDIR:设置工作目录。
      • CMD:指定容器启动时默认执行的命令。
      • ENV:设置环境变量。
      • EXPOSE:声明容器运行时监听的端口。
    • 示例Dockerfile内容:
FROM ubuntu:latest  
RUN apt-get update && apt-get install -y python3 python3-pip  
COPY . /app  
WORKDIR /app  
RUN pip3 install -r requirements.txt  
CMD ["python3", "app.py"]

3、构建Docker镜像

  1. 运行构建命令:
    • 在包含Dockerfile的目录中,打开终端或命令提示符。
    • 使用docker build命令来构建镜像。例如:
docker build -t my-app:latest .
-t:指定镜像的名称和标签。
.:表示当前目录为构建上下文。

4、保存和分享Docker镜像

  1. 保存为本地文件:
    • 使用docker save命令将镜像保存为本地文件。例如:
docker save -o my-app.tar my-app:latest
  1. 加载本地镜像:
    • 使用docker load命令从本地文件加载镜像。例如:
docker load -i my-app.tar
  1. 分享到远程仓库:
    • 可以将镜像推送到Docker Hub或其他远程镜像仓库进行分享。
    • 首先,使用docker login命令登录到远程仓库。
    • 然后,使用docker push命令将镜像推送到远程仓库。例如:
docker push my-dockerhub-username/my-app:latest
  1. 等待构建完成:
    • Docker会根据Dockerfile中的指令,逐层构建镜像。
    • 构建过程中,可以在终端中看到每一层构建的输出信息。

四、镜像的存储和分发

Docker镜像可以存储在本地或远程仓库中。本地仓库通常位于Docker主机上,而远程仓库则可以是Docker Hub等公共仓库或私有仓库。通过Docker Hub等公共仓库,用户可以方便地共享和获取Docker镜像。此外,还可以使用docker save和docker load命令将镜像保存为tar归档文件并在不同主机之间进行传输和加载。

1、镜像的存储

  1. 本地存储:
    • Docker镜像可以保存在本地文件系统中。当使用docker build命令构建镜像时,生成的镜像会默认存储在Docker的本地镜像库中。
    • 可以通过docker save命令将镜像保存为.tar文件,然后将其备份或传输到其他机器上。例如,运行docker save -o myimage.tar myimage:latest命令可以将名为myimage、标签为latest的镜像保存为名为myimage.tar的文件。
  2. 远程存储:
    • Docker镜像也可以存储在远程仓库中,如Docker Hub、Tencent Container Registry等公共或私有的Docker镜像仓库。
    • 通过docker push命令可以将本地镜像推送到远程仓库。例如,将名为myimage的镜像上传到Tencent Container Registry,可以运行docker push tcr.tencentcloudcr.com/myimage:latest命令(假设已经登录到Tencent Container Registry)。

2、镜像的分发

  1. 从远程仓库拉取镜像:
    • 使用docker pull命令可以从远程仓库中拉取镜像。例如,运行docker pull my-dockerhub-username/myimage:latest命令可以从Docker Hub上拉取名为myimage、标签为latest的镜像。
  2. 通过文件分发镜像:
    • 除了从远程仓库拉取镜像外,还可以通过将镜像保存为.tar文件,然后将其传输到其他机器上,并使用docker load命令加载镜像。
    • 例如,将myimage.tar文件传输到另一台机器后,可以运行docker load -i myimage.tar命令来加载镜像。
  3. 使用容器注册表:
    • 容器注册表是一个集中存储和分发Docker镜像的服务。除了Docker Hub等公共注册表外,还可以搭建私有的容器注册表来满足特定的需求。
    • 通过容器注册表,可以方便地管理和分发Docker镜像,实现镜像的共享和复用。

五、Docker镜像的使用

要使用Docker镜像,首先需要将其拉取到本地仓库中(如果尚未存在)。然后,可以使用docker run命令创建一个新的容器实例,并指定要使用的镜像。容器创建成功后,可以在其中运行应用程序、进行数据处理等操作。同时,可以使用docker start、docker stop、docker restart等命令来管理容器的生命周期。
Docker镜像的使用主要通过一系列命令行工具来完成。以下是一些常用的Docker镜像相关的命令行操作:

1、查看镜像

  1. 查看本地镜像列表
    使用docker images命令可以查看本地存储的所有Docker镜像。这个命令会列出镜像的仓库名、标签、镜像ID、创建时间和大小等信息。
docker images
  1. 查看镜像详细信息
    使用docker inspect <镜像ID>命令可以查看指定镜像的详细信息,包括镜像的配置、层信息、环境变量等。
docker inspect <镜像ID>

2、搜索镜像

使用docker search <镜像名>命令可以在Docker Hub等镜像仓库中搜索指定的镜像。这个命令会列出与搜索关键词相关的镜像,包括镜像名、描述、星级和官方标志等信息。

docker search <镜像名>

3、拉取和推送镜像

  1. 拉取镜像
    使用docker pull <镜像名>[:<标签>]命令可以从远程镜像仓库中拉取指定的镜像。如果不指定标签,则默认拉取latest标签的镜像。
docker pull <镜像名>[:<标签>]
  1. 推送镜像
    使用docker push <镜像名>[:<标签>]命令可以将本地镜像推送到远程镜像仓库中。这个命令通常用于将构建好的镜像上传到Docker Hub或其他镜像仓库中以便分享和使用。
docker push <镜像名>[:<标签>]

4、删除镜像

使用docker rmi <镜像名>[:<标签>]或docker rmi <镜像ID>命令可以删除指定的镜像。如果镜像被多个容器使用,则无法直接删除,需要先停止并删除依赖该镜像的容器。

docker rmi <镜像名>[:<标签>]  
# 或者  
docker rmi <镜像ID>

如果要删除所有镜像,可以使用以下命令:

docker rmi $(docker images -q)

5、保存和加载镜像

  1. 保存镜像
    使用docker save -o <文件名> <镜像名>[:<标签>]命令可以将指定的镜像保存为本地文件。这个命令通常用于备份镜像或将其传输到其他机器上。
docker save -o <文件名> <镜像名>[:<标签>]
  1. 加载镜像
    使用docker load -i <文件名>命令可以从本地文件中加载镜像。这个命令通常用于恢复备份的镜像或将其导入到其他Docker环境中。
docker load -i <文件名>

6、构建镜像

使用docker build命令可以根据Dockerfile构建新的Docker镜像。Dockerfile是一个文本文件,其中包含了构建镜像所需的一系列指令和参数。

docker build -t <镜像名>[:<标签>] <Dockerfile所在路径>

其中,-t选项用于指定构建出的镜像的名称和标签,<Dockerfile所在路径>可以是包含Dockerfile的目录的路径,也可以是Dockerfile文件的URL。

7、其他常用命令

  1. 查看镜像历史
    使用docker history <镜像ID>命令可以查看指定镜像的历史记录,包括每一层的创建方式、创建时间和大小等信息。
docker history <镜像ID>
  1. 给镜像打标签
    使用docker tag <镜像名>[:<原标签>] <镜像名>[:<新标签>]命令可以给指定的镜像添加新的标签。这个命令通常用于为镜像创建别名或版本标记。
docker tag <镜像名>[:<原标签>] <镜像名>[:<新标签>]

六、Docker镜像的安全性

Docker镜像的安全性是容器化技术中的一个重要方面。Docker利用Linux内核的命名空间、控制组和联合文件系统等技术实现了进程和资源的隔离,从而确保容器之间的资源限制和互不影响。此外,Docker还提供了对镜像签名和验证的支持(如Docker Content Trust),以防止镜像被篡改或注入恶意代码。然而,仍然存在一些潜在的安全风险,如容器逃逸等。因此,在实际运用过程中需要结合安全最佳实践和合适的管理工具来强化安全性。
为了增强Docker镜像的安全性,以下是一些最佳实践:

  1. 使用官方或经过验证的镜像源:
    • 优先从Docker Hub等官方仓库拉取镜像。
    • 避免使用未经验证的第三方镜像源。
  2. 定期更新镜像:
    • 定期检查并更新镜像以修复已知漏洞。
    • 使用自动化的镜像更新机制来确保镜像的时效性。
  3. 启用镜像签名和验证:
    • 使用Docker Content Trust(DCT)等技术对镜像进行签名和验证。
    • 确保从受信任的源拉取并验证镜像的完整性。
  4. 避免在镜像中暴露敏感信息:
    • 不要在Dockerfile或镜像运行时暴露密码、密钥等敏感信息。
    • 使用Docker提供的密钥管理功能(如secrets)来安全地存储和传递敏感信息。
  5. 监控和日志记录:
    • 实施日志记录和审计以帮助发现异常行为和潜在的安全威胁。
    • 定期检查日志以识别可能的攻击或漏洞利用行为。
  6. 使用安全扫描工具:
    • 利用Snyk、JFrog Xray等安全扫描工具对镜像进行扫描以检测漏洞。
    • 在镜像推送到注册表之前进行扫描,并在生产环境中持续监控镜像的安全性。
  7. 遵循最小权限原则:
    • 在构建和运行容器时,遵循最小权限原则。
    • 避免使用privileged模式运行容器,以减少潜在的安全风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

【CSS3】css开篇基础(4)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后&#xff0c;需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下&#xff0c;金融行业的转型升级是热门话题&#xff0c;创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展&#xff0c;它们与金融领域的深度融合&#xff0c;正引领着新型…

uniapp:sqlite最详细教程,小白可直接粘贴复制

新建uniapp项目,需要4个页面, loading 启动页:打开数据库,判断数据表是否存在,表内是否有数据,创建数据表的逻辑。 register 注册页:数据表已存在,但是没有数据,需要进入该页面注册第一条数据 index 首页:展示数据列表内的数据,可修改默认,添加新数据 edit 编辑:编…

linux面试题复习

前言 现在只是初版&#xff0c;很多格式我还没有改好&#xff0c;会慢慢修改订正。 可能用到的网址&#xff1a;在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题&#xff1a; 参考文档&#xff1a; 程序员的50大Linux面试问题及答案 Top 60 Linux …

机床发那科转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用PROFINET IO协议转发数据 5 6 案例总结 7 1 案例说明 设置网关采集发那科机床数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&a…

【安当产品应用案例100集】024-BYOE及BYOK在IaaS场景中的应用

在云计算环境中&#xff0c;尤其是涉及到敏感数据时&#xff0c;企业用户可能会选择自带加密工具或密钥&#xff08;即BYOE或BYOK&#xff09;&#xff0c;以确保数据在传输和存储过程中的安全性。这种方式可以防止云服务提供商访问或泄露加密数据&#xff0c;增强数据保护。 …

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集&#xff0c;以提…

基于Java+Springboot+Vue开发的鲜花商城管理系统

项目简介 该项目是基于JavaSpringbootVue开发的鲜花商城管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜…

网络服务请求流程简单理解

网络流程&#xff1a; DNS负责将域名解析为IP地址&#xff0c;ALB可以在多个服务实例之间分配流量&#xff0c;APISIX作为API网关处理更细粒度的流量管理&#xff0c;Service在Kubernetes中为Pod提供稳定的访问入口&#xff0c;而Kubernetes则负责整个应用的部署、扩展和运维。…

基于STM32F103的LED闪烁仿真-定时器中断方式

基于STM32F103的LED闪烁仿真 仿真软件&#xff1a; Proteus 8.17 编程软件&#xff1a; Keil 5 定时器简介&#xff1a; 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成&#xff0c;它由一个可编程的预分频器驱动。 它适合多种用途&#xff0c;包含测量输入信…

FastGPT学习(2)- 本地开发通过Navicat管理MongoDB、PostgreSQL数据库

1. 背景 前期已经完成FastGPT的本地化部署工作&#xff0c;通过Docker启动FastGPT的相关容器即可运行。&#xff08;共6个容器&#xff09; 2.本地化开发 2.1 前置依赖 2.2 源码拉取 git clone gitgithub.com:labring/FastGPT.git2.3 数据库管理 本地化运行的FastGPT使用…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题&#xff0c;找中间节点和逆置链表&#xff08;翻转链表&#xff09;之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到&#xff0c;想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

‘perl‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘perl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 明明已经根据教程安装了perl环境,但是在cmd中依赖报该错误,本章教程提供解决办法。 一、激活perl环境 state shell ActiveState-Perl-5.36.0此时输入perl -v 是可以直接输出perl版本号的。 二、找到perl的执…

跨域的几种情况和如何解决跨域问题

在网站开发中&#xff0c;经常会遇到跨域问题&#xff0c;下面总结一下集中常见的跨域问题。 1. 不同域名属于跨域&#xff0c;如&#xff1a;www.a.com 和www.b.com&#xff0c;另外www.a.com 和www.a.com.cn也属于不同域名。 2. 主域名和子域名&#xff08;二级域名、三级域…

192×144像素是几寸照片?如何手机拍照制作

在数字摄影时代&#xff0c;像素是衡量照片质量的重要指标之一。那么&#xff0c;192144像素的照片相当于多少英寸呢&#xff1f;又如何使用手机拍摄并制作这样的照片呢&#xff1f;本文将为您解答。 首先&#xff0c;我们需要了解像素和英寸之间的关系。像素是图像的最小单位&…

分布式篇(分布式事务)(持续更新迭代)

一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 持久性&#xff08;Durability&#xff09; 隔离性&#xff08;Isolation&#xff09; 5. MySQL VS Oracle …

14款被严重低估的安全红队测试工具推荐,网络攻防|网络安全必看的工具合集推荐!

大家好&#xff0c;我是小强 工具往往可以决定网络安全渗透测试或红队演练活动的成败。虽然Kali中的许多工具都已经过验证且稳定可靠&#xff0c;但并不能适合所有渗透测试场景。对于安全红队而言&#xff0c;需要在不同测试需求下&#xff0c;确保有足够的装备来实现测试目标…