Docker 镜像的详解及创建(Dockerfile详解)
目录
镜像加载的原理
联合文件系统(UnionFS)
镜像结构的分层
Dockerfile
Dockerfile结构
dockerfile常用命令
Dockerfile 编写规范
docker创建镜像的方法
基于现有镜像创建
示例:
基于本地模版创建
示例
基于Dockerfile 创建
示例
可能出现的问题
镜像加载的原理
Docker镜像加载的原理涉及到镜像结构和文件系统的层叠使用。Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
Bootfs(Boot File System):
- Docker镜像的最底层是bootfs,它包含了bootloader和kernel(Linux内核)。在系统启动时,bootloader引导加载kernel。这个过程需要一定时间,通常是从黑屏到开机的过程。
Rootfs(Root File System):
- 在bootfs之上是rootfs,包含了典型Linux系统中的标准目录和文件,如/dev、/proc、/bin、/etc等。不同的操作系统发行版(如Ubuntu、CentOS等)对应不同的rootfs。
UnionFS(联合文件系统):
- Docker使用UnionFS作为存储驱动来实现镜像的分层和叠加。UnionFS是一种分层、轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交,一层层地叠加。
镜像层的加载和缓存:
- 每个Docker镜像都由多个层组成,每一层都包含文件系统的一部分。这些层在加载时会被缓存,以提高性能。如果之前加载过的镜像层没有发生变化,Docker将会使用缓存而不是重新加载。
镜像层的不可变性:
- 镜像层是不可变的,一旦创建就不能被修改。这意味着在构建过程中的每个步骤都会创建一个新的镜像层,而不是修改已有的层。
容器的读写层:
- 在容器运行时,Docker会在镜像的顶部添加一层读写层。这个层用于记录容器内部的文件改动。当容器被删除时,这个读写层也会被删除,导致文件改动丢失。
镜像的共享和推送:
- Docker镜像的分层结构使得镜像可以被高效地共享和推送。因为只有发生变化的层需要传输,而其他层可以通过缓存或已存在的层来共享。
总体而言,Docker镜像加载原理通过分层、缓存和叠加的方式实现了高效的镜像构建、共享和运行机制。 UnionFS作为存储驱动在这个过程中起到了关键作用。
联合文件系统(UnionFS)
联合文件系统(UnionFS)确实在Docker中扮演了重要的角色,特别是在镜像的分层和容器的文件系统叠加方面。
分层继承:
- UnionFS支持将文件系统的修改作为一次提交来一层层地叠加。这意味着Docker镜像可以通过分层的方式进行继承,每一层包含了文件系统的不同部分。这种分层的特性使得镜像的构建、共享和存储变得更加高效。
轻量级和高性能:
- UnionFS是一种轻量级且高性能的文件系统,适用于在Docker中管理多个层的文件系统。它通过联合加载将多个文件系统叠加起来,但从外部看起来,只能看到一个文件系统。这使得镜像和容器可以更有效地使用存储空间和提高性能。
支持多文件系统:
- 联合文件系统可以同时加载多个文件系统,将它们叠加在一起,使得最终的文件系统包含了所有底层文件和目录。这种特性有助于创建具有多个层次的镜像,并且在容器运行时,容器的文件系统也可以由多个层次组成。
支持的实现:
- Docker支持多种UnionFS的实现,其中包括AUFS、OverlayFS以及Devicemapper等。这些实现在不同的操作系统和发行版上提供了对UnionFS的支持,并在不同的环境中实现了文件系统的联合加载。
一次加载多个文件系统:
-
联合文件系统的核心特性之一是一次加载多个文件系统,但对外表现为只有一个文件系统。这使得Docker镜像的层次结构和构建变得更加灵活和高效。
-
总体而言,UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。
-
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
-
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 我们下载的时候看到的一层层的就是联合文件系统。
镜像结构的分层
Docker镜像的结构是分层的,每一层都包含了文件系统的不同部分。容器是在镜像的最上面加了一层读写层,这个读写层用于记录容器内部的文件改动。
多层构成:
- Docker镜像不是一个单一的文件,而是由多个层(layers)构成的。每个层都包含了文件系统的一部分,以及与之相关的配置信息。
容器读写层:
- 容器是在镜像的顶部加上一层读写层的方式运行的。在容器内进行的任何文件改动都会被记录在这个读写层中。
容器层的删除:
- 当删除一个容器时,实际上是删除了容器顶部的读写层,导致容器内的文件改动也被丢失。
存储驱动管理:
- Docker使用存储驱动来管理镜像的每个层内容以及容器层的读写层。这使得Docker能够高效地管理和共享镜像的层。
Dockerfile指令和镜像层:
- 每个Dockerfile指令都会创建一个新的镜像层。这些指令可以包括安装软件、复制文件等操作。
镜像层的缓存和复用:
- 镜像层会被缓存和复用,以提高构建效率。如果一个指令没有发生变化,Docker将会使用缓存的镜像层而不是重新构建。
缓存失效的情况:
- 当Dockerfile中的指令修改了,复制的文件发生了变化,或者构建镜像时指定的变量不同,对应的镜像层缓存就会失效。
失效层影响:
- 如果某一层的镜像缓存失效,它之后的所有镜像层缓存都会失效,因为每一层都依赖于它之前的层。
不可变性:
- 镜像层是不可变的,即一旦创建就不能被修改。如果在某一层添加了一个文件,然后在下一层中删除它,镜像中依然会包含该文件,尽管在Docker容器中是不可见的。
总体而言,Docker镜像的分层结构使得镜像可以被高效地构建、共享和管理,并且通过容器的读写层实现了对文件系统的动态改动。
Dockerfile
Dockerfile是一个文本文件,用于描述如何构建一个Docker镜像。
-
层级构建: Dockerfile中的每一条指令都会创建一个新的层级,这使得镜像的构建过程变得透明和可追溯。层级之间是只读的,这样可以有效地共享和重用镜像层,减小镜像的体积。
-
不可变性: 镜像是不可变的,一旦构建完成,就不会再改变。这意味着镜像中的文件和配置在容器运行时不会被修改,确保了一致性和可重复性。
-
Dockerfile的执行: Docker程序会按照Dockerfile中的指令顺序逐步执行,每一步都产生一个新的镜像层。这种逐步构建的方式允许在每个步骤中缓存中间结果,提高了构建的效率。
-
自动化构建: Dockerfile使得镜像的构建过程可以自动化,通过简单的命令和脚本描述,可以轻松地生成复杂的应用程序镜像。
总体来说,Dockerfile是一个强大的工具,使得Docker镜像的构建和定制变得简单、可重复、可自动化。通过使用Dockerfile,开发者可以轻松地构建、分享和管理Docker容器。
Dockerfile结构
Dockerfile的结构通常可以分为以下四个主要部分:
基础镜像信息(FROM):
Dockerfile以 FROM
指令开始,用于指定基础镜像。基础镜像是构建新镜像的起点,所有后续的操作都基于这个基础镜像。例如:
FROM ubuntu:latest
维护者信息(MAINTAINER):
可选的 MAINTAINER
指令用于指定镜像的维护者信息,即作者和联系方式。这是一个可选的元数据信息,例如:
MAINTAINER Your Name <your.email@example.com>
镜像操作指令:
Dockerfile中的大部分指令用于描述如何构建镜像,包括 RUN
、ADD
、COPY
、ENV
、WORKDIR
、EXPOSE
等。这些指令按顺序执行,每个指令都会创建一个新的镜像层。例如:
RUN apt-get update && apt-get install -y nginx
容器启动时执行指令(CMD、ENTRYPOINT):
CMD
和 ENTRYPOINT
用于指定容器启动时执行的命令。CMD
定义的命令可以被容器启动时的命令行参数替代,而 ENTRYPOINT
则定义了容器启动时不可替代的命令。例如:
CMD ["nginx", "-g", "daemon off;"]
注释可以通过以 #
开头来添加,用于提供Dockerfile中的说明和注解。
这个结构确保了Dockerfile的清晰性和可读性,使得镜像构建过程更容易理解和维护。
dockerfile常用命令
Dockerfile 是用于定义 Docker 镜像构建过程的脚本文件,
FROM 镜像:
-
用途: 指定新镜像所基于的基础镜像,每个镜像构建都必须以此指令开始。
-
示例:
FROM ubuntu:latest
MAINTAINER 名字:
-
用途: 说明新镜像的维护人信息。
-
示例:
MAINTAINER John Doe <john.doe@example.com>
RUN 命令:
-
用途: 在基础镜像上执行命令,并将结果提交到新的镜像中。
-
示例:
RUN apt-get update && apt-get install -y some-package
ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]:
-
用途: 设定容器启动时第一个运行的命令及其参数。
-
示例:
ENTRYPOINT ["rm", "-rf", "/*"]
-
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
CMD ["要运行的程序", "参数1", "参数2"]:
-
用途: 指定容器启动时默认执行的命令或脚本。
-
exec形式示例:
CMD ["java", "-jar", "xxxxxxx.jar", "8090"]
-
shell形式示例:
CMD 命令 参数1 参数2
-
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
-
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。 CMD 可以为 ENTRYPOINT 指令提供默认参数。
EXPOSE 端口号:
-
用途: 指定新镜像加载到 Docker 时要开启的端口。
-
示例:
EXPOSE 8090
ENV 环境变量 变量值:
-
用途: 设置一个环境变量的值,会被后面的 RUN 使用。
-
示例:
ENV PATH $PATH:/opt
ADD 源文件/目录 目标文件/目录:
-
用途: 将源文件复制到镜像中。源文件要与 Dockerfile 位于相同目录中,或者是一个 URL。
-
示例:
ADD app.jar /opt/
ADD需要注意的
源路径是文件,目标路径以 / 结尾:
-
行为:Docker 会将源文件拷贝到目标路径下,将目标路径视为目录。
-
注意:如果目标路径不存在,Docker 会自动创建目标路径。
ADD /home/ky26/zhaichen.txt /home/ky26/
源路径是文件,目标路径不以 / 结尾:
-
行为:Docker 会将源文件拷贝到目标路径下,将目标路径视为文件。
-
注意:如果目标路径不存在,Docker 会以目标路径为名创建一个文件,内容同源文件;如果目标文件已存在,会用源文件覆盖它。
ADD /home/ky26/A /home/ky26/B
源路径是目录,目标路径不存在:
- 行为:Docker 会自动以目标路径创建一个目录,将源路径目录下的文件拷贝进来。
ADD /path/to/source_directory /path/to/target_directory
源文件是归档文件(压缩文件):
-
行为:Docker 会自动解压缩源文件。
-
注意:URL 下载和解压缩特性不能一起使用,即通过 URL 拷贝的压缩文件不会自动解压。
COPY 源文件/目录 目标文件/目录
-
功能:将本地主机上的文件或目录复制到指定的目标位置。
-
注意:源文件/目录应与 Dockerfile 在相同的目录中。
VOLUME ["目录"]
- 功能:在容器中创建一个挂载点,用于持久化存储数据。
USER 用户名/UID
- 功能:指定在运行容器时使用的用户身份。
WORKDIR 路径 /home
- 功能:为后续的 RUN、CMD、ENTRYPOINT 指定工作目录。
ONBUILD 命令
-
功能:指定当构建的镜像作为基础镜像时要运行的命令。
-
注意:在构建当前 Dockerfile 文件的镜像时,ONBUILD 指令不会起作用。只有在使用当前镜像构建其他镜像时才会执行指定的命令。
ONBUILD rm -rf /*
-
注:这个例子中使用了 ONBUILD 指令来指定一个危险的命令,即在构建基础镜像时执行
rm -rf /*
。这可能导致严重的数据丢失和系统损坏。
HEALTHCHECK
- 功能:用于定义容器的健康检查,以确保容器正常运行。
请注意,对于 ONBUILD 中的 rm -rf /*
,这是一个非常危险的命令,它会递归地删除根目录下的所有文件和子目录。在生产环境中,绝对不应该使用这样的命令,以免导致灾难性的后果。
Dockerfile 编写规范
第一行必须使用 FROM 指令指明所基于的镜像名称:
FROM
指令用于指定基础镜像。它应该是 Dockerfile 的第一行,用于构建你的镜像的起点。
FROM ubuntu:latest
之后使用 MAINTAINER 指令说明维护该镜像的用户信息:
MAINTAINER
指令已经被标记为过时(deprecated),推荐使用LABEL
指令来提供维护者信息。
LABEL maintainer="your_name@example.com"
然后是镜像操作相关指令,如 RUN 指令:
RUN
指令用于在镜像构建过程中执行命令,例如安装软件包、更新系统等。
RUN apt-get update && apt-get install -y some-package
每运行一条指令,都会给基础镜像添加新的一层:
- Docker 使用分层的文件系统,每个指令都会在现有的镜像层上添加一个新层。
最后使用 CMD 指令指定启动容器时要运行的命令操作:
CMD
指令用于指定容器启动时要运行的默认命令。
CMD ["executable","param1","param2"]
请注意,以上是一些常见的规范,而实际上 Dockerfile 的编写可以根据需求和个人偏好进行调整。使用最佳实践有助于确保镜像的可维护性和可理解性。
docker创建镜像的方法
基于现有镜像创建
基于现有镜像创建新的镜像是一种常见的 Docker 镜像定制方法。这种方法允许你在已有的基础上进行修改和扩展,适用于定制化应用或添加特定功能的需求。
示例:
启动容器:
docker create -it centos:7 /bin/bash
-
docker create
: 创建一个新的容器,但不立即启动。 -
-it
: 分配一个伪终端并保持标准输入打开,以便与容器进行交互。 -
centos:7
: 使用CentOS 7镜像。 -
/bin/bash
: 在容器中运行Bash shell。
docker ps -a
-
列出所有容器,包括已停止的容器。
结果应该类似于:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
000550eb36da centos:7 "/bin/bash" 3 seconds ago Created gracious_bassi
-
000550eb36da
: 容器的唯一标识符。 -
centos:7
: 使用的镜像。 -
/bin/bash
: 在容器中运行的命令。 -
Created
: 容器的状态是已创建。
提交新镜像:
docker commit -m "new" -a "centos" 000550eb36da centos:test
-
docker commit
: 提交容器的更改并创建新的镜像。 -
-m "new"
: 提交时的说明信息。 -
-a "centos"
: 提交时的作者信息。 -
000550eb36da
: 要提交的容器的ID。 -
centos:test
: 新的镜像的名称和标签。常用选项:
-
-m
: 提交时的说明信息。 -
-a
: 提交时的作者信息。 -
-p
: 生成过程中停止容器的运行。
查看镜像列表:
docker images
-
列出所有本地镜像。
结果中应该包含新创建的
centos:test
镜像。
基于本地模版创建
基于本地模板创建Docker镜像是一种常见的方式,允许使用已有的文件系统快速构建自定义的Docker镜像。
示例
下载操作系统模板文件: 使用 wget
命令从 OPENVZ 开源项目的指定地址下载 Debian 7.0 x86 最小化版本的模板文件。
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
这个命令将从给定的 URL 下载 debian-7.0-x86-minimal.tar.gz
文件。
导入为Docker镜像: 使用 docker import
命令将下载的模板文件导入为Docker镜像。
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test
-
cat debian-7.0-x86-minimal.tar.gz
通过cat
命令将文件内容输出到标准输出。 -
docker import - debian:test
利用docker import
命令将标准输出的内容导入为名为debian
,标签为test
的Docker镜像。
验证导入的镜像: 可以运行以下命令验证成功导入的镜像。
docker images
确保 debian
镜像以及对应的 test
标签出现在列表中。
- 这样,就成功地通过下载操作系统模板文件并导入为Docker镜像。请注意,这个例子是使用 OPENVZ 模板,实际上,你可以使用不同操作系统的模板文件进行相似的导入操作。
基于Dockerfile 创建
基于 Dockerfile 创建 Docker 镜像是 Docker 中常见的操作之一。Dockerfile 是一个包含一条条指令的文件,每条指令对应 Linux 下的一条命令。通过编写 Dockerfile,可以定义如何构建一个 Docker 镜像,包括基础镜像、软件安装、配置等。
示例
创建和运行 Apache 服务的 Docker 镜像的示例 Dockerfile,以及相关的执行脚本和测试步骤。
创建工作目录并编辑 Dockerfile:
mkdir /opt/apache
cd /opt/apache
vim Dockerfile
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
在 Dockerfile 中的主要指令解析如下:
-
使用
FROM centos:7
指定基础镜像为 CentOS 7。 -
使用
MAINTAINER
标签指定维护者信息。 -
使用两个
RUN
指令更新系统并安装 Apache。 -
使用
EXPOSE 80
指令暴露容器的80端口。 -
使用
ADD
指令将本地的index.html
复制到容器中。
//方法一:
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]
- 提供两种启动容器的方式:一种是通过
CMD
指定执行脚本/run.sh
,另一种是通过ENTRYPOINT
和CMD
指定直接启动 Apache。
创建执行脚本 run.sh:
vim run.sh#!/bin/bash
rm -rf /run/httpd/* #清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND #指定为前台运行
#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
run.sh
脚本用于在容器启动时执行一些操作,如清理缓存并启动 Apache。
创建网站页面 index.html:
echo "this is test web" > index.html
用于作为 Apache 服务的默认网页。
构建 Docker 镜像:
docker build -t httpd:centos .
使用 docker build
命令基于 Dockerfile 构建名为 httpd:centos
的镜像。
运行容器:
docker run -d -p 1216:80 httpd:centos
使用 docker run
命令在后台运行基于 httpd:centos
镜像的容器,并将容器的80端口映射到主机的1216端口。
测试: 访问 http://192.168.41.31:1216/
,你应该能够看到 Apache 默认页面或者测试网页 "this is test web"。
总体上,这个例子演示了如何使用 Dockerfile 构建包含 Apache 服务的镜像,并通过执行脚本和端口映射在容器中运行该服务。
可能出现的问题
Dockerfile 和脚本中,有一些地方可能会导致潜在的问题或报错。以下是一些可能的注意事项:
权限问题:
- 在执行
chmod 755 /run.sh
时,确保容器内存在/run.sh
文件,并且具有可执行权限。否则可能导致脚本无法执行。
文件路径和复制问题:
- 确保
index.html
文件在执行ADD index.html /var/www/html/index.html
时存在,否则可能导致文件复制失败。
Apache 配置问题:
- 使用
ENTRYPOINT ["/usr/sbin/apachectl"]
和CMD ["-D", "FOREGROUND"]
启动 Apache。确保 Apache 在启动时不会由于配置问题或依赖项缺失而崩溃。
端口冲突:
- 确保主机上的端口
1216
没有被其他进程占用,否则可能导致容器启动失败。
Docker 镜像构建问题:
- 在构建 Docker 镜像时,确保网络连接正常,能够成功拉取基础镜像,并且 Dockerfile 和相关文件的语法正确。
SELinux 问题:
- 如果你的主机启用了 SELinux,可能需要考虑 SELinux 导致的权限问题。可以通过在构建时使用
--security-opt label:disable
来禁用 SELinux 标签。
Docker Daemon 问题:
- 确保 Docker Daemon 正常运行,并且用户有足够的权限执行 Docker 相关操作。
如果有网络报错提示
[Warning] IPv4 forwarding is disabled. Networking will not work.
关于 IPv4 转发被禁用,这可能会影响 Docker 容器的网络功能。解决方法中包含了启用 IPv4 转发的步骤,下面对每一步进行详细解释:
编辑 /etc/sysctl.conf 文件:
vim /etc/sysctl.conf
在文件中添加或修改以下行,启用 IPv4 转发:
net.ipv4.ip_forward=1
保存并关闭文件。
应用 sysctl 配置:
sysctl -p
这会重新加载 sysctl 配置,确保更改立即生效。
重启网络服务:
systemctl restart network
这将重新启动网络服务,以便应用对 sysctl 的更改。
重启 Docker 服务:
systemctl restart docker
这会重新启动 Docker 服务,确保 Docker 正确应用了新的网络配置。
以上步骤的目的是确保 IPv4 转发被启用,从而解决 Docker 容器网络无法正常工作的问题。请注意,修改系统配置可能需要管理员权限。确保在执行这些操作时了解其影响,并谨慎操作。
相关文章:
Docker 镜像的详解及创建(Dockerfile详解)
目录 镜像加载的原理 联合文件系统(UnionFS) 镜像结构的分层 Dockerfile Dockerfile结构 dockerfile常用命令 Dockerfile 编写规范 docker创建镜像的方法 基于现有镜像创建 示例: 基于本地模版创建 示例 基于Dockerfile 创建 示…...
JDBC事务
1.事务 数据库事务是一组数据库操作,它们被视为一个单一的逻辑工作单元,要么全部成功执行,要么全部回滚(撤销)到事务开始前的状态。事务是确保数据库数据一致性、完整性和可靠性的关键机制之一。 简单来说࿰…...

协方差矩阵自适应调整的进化策略(CMA-ES)
关于CMA-ES,其中 CMA 为协方差矩阵自适应(Covariance Matrix Adaptation),而进化策略(Evolution strategies, ES)是一种无梯度随机优化算法。CMA-ES 是一种随机或随机化方法,用于非线性、非凸函数的实参数(…...

gitee完整使用教程,创建项目并上传
目录 一 什么是gitee 二 安装Git 三 登录gitee,生成密钥 四 配置SSH密钥 五 创建项目 六 克隆仓库到本地 七 关联本地工程到远程仓库 八 添加文件 九 异常处理 十 删除仓储 十一 git常用命令 一 什么是gitee gitee是开源中国推出的基于git的代码托管服务…...
如何使用ActiveMQ详细讲解
ActiveMQ 是一款流行的消息中间件,支持多种通信协议和消息模式,包括点对点、发布/订阅、事务处理等。下面是使用 ActiveMQ 的基本步骤: 1. 下载和安装 ActiveMQ: • 前往 ActiveMQ 的官方网站(http://activemq.apach…...

【python入门】day28:记录用户登录日志
演示 代码 #-*- coding:utf-8 -*- print(记录用户登录日志----------------------------) import time def show_info():print(输入提示数字,执行相应操作:0退出,1查看登录日志) def write_logininfo(username):#----------记录日志with open(log.txt,a,encodingutf-8)as file…...
sqlserver2012 跨服务器查询
在 SQL Server 2012 中,跨服务器查询可以通过链接服务器来实现。以下是执行跨服务器查询的步骤: 创建链接服务器: 首先,你需要在 SQL Server 2012 上创建一个链接服务器对象。可以使用系统存储过程 sp_addlinkedserver 来完成这一…...

无人机视角、多模态、模型剪枝、国产AI芯片部署
无人机视角、多模态、模型剪枝、国产AI芯片部署是当前无人机技术领域的重要研究方向,其原理和应用价值在以下几个方面进行详细讲述。 一、无人机视角:无人机视角是指在无人机上搭载摄像头等设备,通过航拍图像获取环境信息,并进行…...

DaisyDisk for mac 中文激活版 可视化磁盘清理工具
DaisyDisk 是一款专为 Mac 设计的磁盘空间分析工具。它以直观、图形化的方式展示硬盘使用情况,帮助用户迅速找到占用空间大的文件和文件夹。通过扫描磁盘,DaisyDisk 生成彩色的扇形图表,每个扇区代表一个文件或文件夹,大小直观反映…...
Linux debain12 安装phpredis和mysql扩展
在php和mysql安装好之后,直接执行以下命令,就可以安装php的mysql相关扩展 apt-get install php-mysql //安装php与mysql的组件 安装phpredis扩展 首页安装redis sudo apt install redis-server 检查Redis服务是否在您的Debian 12上成功安装&#x…...

七、Qt 信号和槽
在QT4以上的版本,在窗体上用可以通过选中控件,然后点击鼠标右键单击按钮,选择“转到槽”。可以自动创建信号和槽。 选择clicked(),并点击 ok Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件(信号和槽)。 …...

C盘满了,我用什么思路清理?
20240115 上周六同事传了一个很大的虚拟机给我,C盘就红了 虽然是飞秋选错了存储文件的路径,但后来忘了,就开始毫无目的删除文件,过程中会有没有权限删除的,这样还是没有改善。 咨询了公司IT技术人员, 告…...

Simulink简介
Simulink 是一个模块图环境,用于多域仿真以及基于模型的设计。它支持系统级设计、仿真、自动代码生成以及嵌入式系统的连续测试和验证。Simulink 提供图形编辑器、可自定义的模块库以及求解器,能够进行动态系统建模和仿真。Simulink 与 MATLAB 相集成&am…...

学习Vue封装的过渡与动画总结
今天学习了Vue封装的过渡与动画,接下来说一下Vue是如何实现的,首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画,但Vue就不需要直接获取到需要过渡或动画的元素,而是使用一个<transition>的标签来包裹住想要过…...

vue2 pdfjs-2.8.335-dist pdf文件在线预览功能
1、首先先将 pdfjs-2.8.335-dist 文件夹从网上搜索下载,复制到public文件夹下. 2、在components下新建组件PdfViewer.vue文件 3、在el-upload 中调用 pdf-viewer 组件 4、在el-upload 中的 on-preview方法中加上对应的src路径 internalPreview(file) { //判断需要…...
messages,CentOS 7不收集日志或不存在 /var/log/messages
/var/log/message, /var/log/secure等都不记录了,并且都是空文件。 重启机器:reboot 无效 重启日志: systemctl start rsyslog 无效 怀疑空间不足,删除/var/log/messages,重新运行rsyslog 无效 重装下rsyslog,于是…...

Express安装与基础使用
一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架, 官方网站: Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 中文文档: 路由 - Express 中文文档 简单来说&am…...

vue2使用electron以及打包配置
1.创建项目 vue create vue-project 2.安装electron vue add electron-builder会自动安装相关依赖 安装成功后会在src下自动生成一个background.js文件就是相应的electron的配置信息 use strictimport { app, protocol, BrowserWindow } from electron import { createProto…...

科研绘图(五)玫瑰图
柱状图的高级平替可视化 “玫瑰图”,通常也被称为“科克斯图”。它类似于饼图,但不同之处在于每个部分(或“花瓣”)的角度相同,半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用,比…...

SQL Server 数据类型
文章目录 一、文本类型(字母、符号或数字字符的组合)二、整数类型三、精确数字类型四、近似数字(浮点)类型五、日期类型六、货币类型七、位类型八、二进制类型 一、文本类型(字母、符号或数字字符的组合) 在…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...