docker-学习-5

news2024/11/18 13:48:50

docker-学习第五天

  • docker-学习第五天
    • 1. 昨天的练习回顾
      • 1.1. 练习1
      • 1.2. 练习2
    • 2. 命令
      • 2.1. 看镜像的详细信息
    • 3. Dockerfile指令
      • 3.1. 常见的指令
      • 3.2. ENTRYPOINT和CMD的区别
      • 3.3. RUN中的set指令
    • 4. 镜像的原理
      • 4.1. 为什么 Docker 镜像要采用这种分层结构呢?
      • 4.2. docker镜像分层的结构
      • 4.3. base镜像
      • 4.4. 容器的启动
      • 4.5. 镜像分层的好处
    • 5. 小知识点
      • 5.1. 如何让你制作的镜像比较小
      • 5.2. 镜像为什么要制作的小一点

docker-学习第五天

1. 昨天的练习回顾

1.1. 练习1

1、以nginx为基础镜像编写dockerfile。并构建为一个名为nginxtest的镜像,要求镜像内安装一个tcpdump工具,下载或从本地拉取一个tar包并解压。构建镜像后运行容器,并暴露端口访问。(要求熟悉dockerfile常用指令,容器运行常见参数,以及如何进入容器内部)

[root@docker-1 Dockerfile]# mkdir yuan
[root@docker-1 Dockerfile]# cd yuan/
[root@docker-1 yuan]# vim Dockerfile
[root@docker-1 yuan]# cat Dockerfile 
FROM nginx:latest
WORKDIR /
RUN apt-get update && apt-get install tcpdump -y
RUN curl -O https://nginx.org/download/nginx-1.25.1.tar.gz && tar xf nginx-1.25.1.tar.gz
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]
[root@docker-1 yuan]# 

[root@docker-1 yuan]# docker build -t scnginx:1.0 .
[+] Building 187.4s (7/7) FINISHED                                                                             
 => [internal] load build definition from Dockerfile                                                           
 => => transferring dockerfile: 308B                                                                           
 => [internal] load metadata for docker.io/library/nginx:latest                                                
 => [internal] load .dockerignore                                                                              
 => => transferring context: 2B                                                                                
 => CACHED [1/4] FROM docker.io/library/nginx:latest                                                           
 => [2/4] RUN apt-get update && apt-get install tcpdump -y                                                     
 => [3/4] RUN curl -O https://nginx.org/download/nginx-1.25.1.tar.gz && tar xf nginx-1.25.1.tar.gz             
 => exporting to image                                                                                         
 => => exporting layers                                                                                        
 => => writing image sha256:c2f927b6b99793f3012e5065e75ddd83c663cf0923c33d6f0a4f713fb760da60                   
 => => naming to docker.io/library/scnginx:1.0                                                                 
[root@docker-1 yuan]# docker images|grep scnginx
scnginx      1.0       c2f927b6b997   5 minutes ago   172MB
[root@docker-1 yuan]# 

[root@docker-1 yuan]# docker run -d -p 4433:80 --name li-5 scnginx:1.0
9669cf417c8e3cf30bb641b3592924def5c64b15904324e203d467e53c6c29af
[root@docker-1 yuan]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS                                   NAMES
9669cf417c8e   scnginx:1.0   "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds   0.0.0.0:4433->80/tcp, :::4433->80/tcp   li-5
[root@docker-1 yuan]# 

image-20240205154936840

1.2. 练习2

1.以centos7作为基础镜像
2.在里面安装好ip,vim,ping命令
3.安装好nginx
4.启动容器的时候,就启动nginx

[root@docker-1 Dockerfile]# mkdir renlei/
cd /renlei
[root@docker-1 renlei]# vim onekey_install-nginx.sh
[root@docker-1 renlei]# cat onekey_install-nginx.sh 
#!/bin/bash

#解决软件的依赖关系,需要安装的软件包
yum install epel-release -y
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc lsof vim wget -y

#新建luogan用户和组
id  lilin || useradd lilin -s /sbin/nologin

#下载nginx软件
mkdir  /lilin99 -p
cd /lilin99
wget  https://nginx.org/download/nginx-1.21.4.tar.gz

#解压软件
tar xf nginx-1.21.4.tar.gz 
#进入解压后的文件夹
cd nginx-1.21.4

#编译前的配置
./configure --prefix=/usr/local/sclilin99  --user=lilin --group=lilin   

#如果上面的编译前的配置失败,直接退出脚本
if (( $? != 0));then
    exit
fi
#编译,启动2个进程去编译,这样速度快
make -j 2
#编译安装
make  install

#修改PATH变量
echo  "PATH=$PATH:/usr/local/sclilin99/sbin" >>/root/.bashrc

[root@docker-1 renlei]# 

[root@docker-1 renlei]# vim Dockerfile 
FROM centos:7
RUN yum install iproute vim net-tools -y
WORKDIR /sc
COPY onekey_install-nginx.sh /sc
RUN bash onekey_install-nginx.sh
EXPOSE 80
CMD ["/usr/local/sclilin99/sbin/nginx", "-g", "daemon off;"]
[root@docker-1 renlei]# 

[root@docker-1 renlei]# docker build -t renweb:1.0 .
[+] Building 342.1s (10/10) FINISHED                                                           docker:default
 => [internal] load build definition from Dockerfile                                                     0.0s
 => => transferring dockerfile: 243B                                                                     0.0s
 => [internal] load metadata for docker.io/library/centos:7                                              0.0s
 => [internal] load .dockerignore                                                                        0.0s
 => => transferring context: 2B                                                                          0.0s
 => CACHED [1/5] FROM docker.io/library/centos:7                                                         0.0s
 => [internal] load build context                                                                        0.0s
 => => transferring context: 881B                                                                        0.0s
 => [2/5] RUN yum install iproute vim net-tools -y                                                     127.7s
 => [3/5] WORKDIR /sc                                                                                    0.0s 
 => [4/5] COPY onekey_install-nginx.sh /sc                                                               0.0s 
 => [5/5] RUN bash onekey_install-nginx.sh                                                             213.7s 
 => exporting to image                                                                                   0.6s 
 => => exporting layers                                                                                  0.6s 
 => => writing image sha256:77d49c8ba1e0f0514fac7833e031ef4fd3b85048e3c546d24659fb88a693937c             0.0s 
 => => naming to docker.io/library/renweb:1.0                                                            0.0s 
[root@docker-1 renlei]#                               

[root@docker-1 renlei]# docker run -d -p 4422:80  --name renweb-1  renweb:1.0                                 
730b13da5358627bb843d82f73d840305ba274ca8efbccb44a54b740b1ecf073                                              
[root@docker-1 renlei]# docker ps|grep renweb-1
730b13da5358   renweb:1.0    "/usr/local/sclilin9…"   14 seconds ago   Up 13 seconds   0.0.0.0:4422->80/tcp, :::4422->80/tcp   renweb-1
[root@docker-1 renlei]# 

image-20240205160101670

2. 命令

2.1. 看镜像的详细信息

[root@docker-1 ~] docker inspect hnweb:1.0

要加名字和版本号

3. Dockerfile指令

3.1. 常见的指令

Dockerfile 是一个用来构建 Docker 镜像的文本文件,它包含了一系列的指令,每一条指令都会创建一个新的镜像层。Dockerfile 的指令有以下几种:

  • FROM:这是 Dockerfile 的第一条指令,它指定了镜像的基础层,也就是从哪个镜像开始构建。例如,FROM ubuntu:18.04 表示从 Ubuntu 18.04 的镜像开始构建。

  • RUN:这是 Dockerfile 的最常用的指令,它用来在镜像中执行一些命令,通常是安装一些软件包或库。例如,RUN apt-get update && apt-get install -y python3 表示在镜像中更新软件源并安装 Python 3。

  • COPY:这是 Dockerfile 的另一个常用的指令,它用来将本地文件或目录复制到镜像中的指定位置。例如,COPY app.py /app/ 表示将本地的 app.py 文件复制到镜像中的 /app/ 目录下。

  • ADD:这是 Dockerfile 的一个类似于 COPY 的指令,它也用来将本地文件或目录复制到镜像中的指定位置,但是它还有一些额外的功能,如可以解压压缩文件,或者从 URL 下载文件。例如,ADD https://example.com/file.tar.gz /app/ 表示从网址下载 file.tar.gz 文件并解压到镜像中的 /app/ 目录下。

  • CMD:这是 Dockerfile 的一个用来指定容器启动时默认执行的命令的指令,它只能有一条,如果有多条,只有最后一条会生效。例如,CMD ["python3", "app.py"] 表示容器启动时默认执行 python3 app.py 命令。

  • ENTRYPOINT:这是 Dockerfile 的一个用来指定容器启动时的入口点的指令,它和 CMD 类似,但是它可以接受容器运行时传入的参数,而 CMD 不可以。例如,ENTRYPOINT ["ping"] 表示容器启动时的入口点是 ping 命令,如果运行时传入了 google.com 参数,那么容器就会执行 ping google.com 命令。

  • EXPOSE:这是 Dockerfile 的一个用来声明容器内部的端口号的指令,它不会真正地将端口暴露出来,而是只是一个文档化的作用,表示容器提供了哪些服务。例如,EXPOSE 80 表示容器提供了 80 端口的服务,如 HTTP。

  • ENV:这是 Dockerfile 的一个用来设置环境变量的指令,它可以在镜像中或者容器运行时使用。例如,ENV PORT 8080 表示设置环境变量 PORT 的值为 8080。

  • WORKDIR:这是 Dockerfile 的一个用来设置工作目录的指令,它会影响后续的 RUN,COPY,ADD,CMD,ENTRYPOINT 等指令的执行路径。例如,WORKDIR /app 表示设置工作目录为 /app,那么后续的指令都会在 /app 下执行。

  • VOLUME:这是 Dockerfile 的一个用来创建数据卷的指令,它可以将容器中的某个目录挂载到宿主机上,从而实现数据的持久化和共享。例如,VOLUME /data 表示创建一个数据卷,将容器中的 /data 目录挂载到宿主机上。

  • USER:这是 Dockerfile 的一个用来指定容器运行时的用户的指令,它可以提高容器的安全性,避免以 root 用户运行。例如,USER www-data 表示指定容器运行时的用户为 www-data。

  • LABEL:这是 Dockerfile 的一个用来添加元数据的指令,它可以给镜像添加一些标签,如作者,版本,描述等。例如,LABEL maintainer="John Doe" version="1.0" description="A simple web app" 表示给镜像添加了维护者,版本,描述等标签。

  • ARG:这是 Dockerfile 的一个用来定义构建参数的指令,它可以在构建镜像时传入一些变量,从而实现动态的配置。例如,ARG PORT=80 表示定义了一个构建参数 PORT,它的默认值为 80,但是可以在构建时修改,如 docker build --build-arg PORT=8080 .

  • ONBUILD:这是 Dockerfile 的一个用来定义触发器的指令,它可以在当前镜像被用作其他镜像的基础层时执行一些命令。例如,ONBUILD RUN pip install -r requirements.txt 表示当当前镜像被用作其他镜像的基础层时,会自动执行 pip install -r requirements.txt 命令。

  • STOPSIGNAL:这是 Dockerfile 的一个用来指定容器停止时的信号的指令,它可以覆盖默认的 SIGTERM 信号,使用其他的信号来优雅地停止容器。例如,STOPSIGNAL SIGKILL 表示指定容器停止时的信号为 SIGKILL,强制杀死容器。

  • HEALTHCHECK:这是 Dockerfile 的一个用来检查容器健康状态的指令,它可以定期执行一些命令,来判断容器是否正常运行。例如,HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 表示每隔 5 分钟执行一次 curl -f http://localhost/ 命令,如果返回非 0 值,就表示容器不健康。

3.2. ENTRYPOINT和CMD的区别

ENTRYPOINT是比较新的用法,当ENTRYPOINT和CMD都存在的时候,以ENTRYPOINT为准,这个时候,cmd就成了ENTRYPOINT里的参数(参数位置):

ENTRYPOINT ["docker-entrypoint.sh"] 

EXPOSE 3306 33060 

CMD ["mysqld"]

这是 Dockerfile 的三条指令,它们的含义如下:

  • ENTRYPOINT [“docker-entrypoint.sh”]:这是用来指定容器启动时的入口点的指令,它表示容器启动时会执行 docker-entrypoint.sh 这个脚本,这个脚本通常是用来初始化一些配置或环境变量,或者执行一些前置操作,如创建数据库,设置密码等。
  • EXPOSE 3306 33060:这是用来声明容器内部的端口号的指令,它表示容器提供了 3306 和 33060 这两个端口的服务,这两个端口分别是 MySQL 的默认端口和 X Protocol 的端口,用来提供数据库的连接和访问。
  • CMD [“mysqld”]:这是用来指定容器启动时默认执行的命令的指令,它表示容器启动时默认执行 mysqld 这个命令,这个命令是用来启动 MySQL 服务器的,它会接受容器运行时传入的参数,如 --user=root--password=123456 等。

相当于docker-entrypoint.sh mysqld —》mysqld就相当于位置参数传递过去了

3.3. RUN中的set指令

set指令能设置所使用shell的执行方式,可依照不同的需求来做设置.

语法 set [±abCdefhHklmnpPtuvx]

参数说明:

-e  若指令传回值不等于0,则立即退出shell。

-u  当执行时使用到未定义过的变量,则显示错误信息。

-x  执行指令后,会先显示该指令的执行过程及所下的参数。

例子:

RUN set -eux; \
	savedAptMark="$(apt-mark showmanual)"; \
	apt-get update; \
	apt-get install -y --no-install-recommends ca-certificates wget; \
	rm -rf /var/lib/apt/lists/*; \

这是 Dockerfile 的一条 RUN 指令,它用来在镜像中执行一些命令,通常是安装一些软件包或库。这条指令的作用如下:

  • set -eux
    

    :这是一个 shell 命令,它用来设置一些选项,如:

    • -e 表示如果命令执行失败,就退出脚本,避免继续执行错误的命令。
    • -u 表示如果使用未定义的变量,就报错,避免使用错误的变量。
    • -x 表示打印出执行的命令,方便调试和查看。
  • savedAptMark="$(apt-mark showmanual)":这是一个赋值语句,它用来将 apt-mark showmanual 这个命令的输出赋值给 savedAptMark 这个变量。apt-mark showmanual 这个命令是用来显示手动安装的软件包的,这样可以在后面恢复这些软件包的状态。

  • apt-get update:这是一个更新软件源的命令,它用来获取最新的软件包信息,以便安装最新的软件包。

  • apt-get install -y --no-install-recommends ca-certificates wget
    

    :这是一个安装软件包的命令,它用来安装

    ca-certificates
    

    wget
    

    这两个软件包,以及它们的依赖。其中:

    • -y 表示自动回答 yes,不需要用户交互。
    • --no-install-recommends 表示不安装推荐的软件包,只安装必要的软件包,以减少镜像的大小。
  • rm -rf /var/lib/apt/lists/*:这是一个删除文件的命令,它用来删除 /var/lib/apt/lists/ 这个目录下的所有文件,这个目录是用来存储软件源的信息的,删除它可以减少镜像的大小,因为这些信息在构建镜像后就不需要了。

这就是这条 RUN 指令的解释,它的目的是在镜像中安装 ca-certificateswget 这两个软件包,并且尽量减少镜像的大小。

RUN set -x \
# create nginx user/group first, to be consistent throughout docker variants
    && addgroup --system --gid 101 nginx \
    && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \
    && apt-get update \

这是 Dockerfile 的一条 RUN 指令,它用来在镜像中执行一些命令,通常是安装一些软件包或库。这条指令的作用如下:

  • set -x:这是一个 shell 命令,它用来打印出执行的命令,方便调试和查看。
  • addgroup --system --gid 101 nginx:这是一个创建用户组的命令,它用来创建一个名为 nginx 的系统用户组,它的组 ID 为 101。
  • adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx:这是一个创建用户的命令,它用来创建一个名为 nginx 的系统用户,它的用户 ID 为 101,它属于 nginx 用户组,它不能登录,它没有创建家目录,它的家目录为 /nonexistent,它的注释为 “nginx user”,它的 shell 为 /bin/false。
  • apt-get update:这是一个更新软件源的命令,它用来获取最新的软件包信息,以便安装最新的软件包。

这就是这条 RUN 指令的解释,它的目的是在镜像中创建一个 nginx 用户和用户组,并且更新软件源。

4. 镜像的原理

4.1. 为什么 Docker 镜像要采用这种分层结构呢?

Docker 镜像是由多个只读层组成的,每一层都是基于上一层的修改。这种分层结构有以下几个优点:

  • 节省空间:每一层都可以被多个镜像共享,只需要存储一份即可。例如,如果有多个镜像都基于同一个操作系统,那么操作系统层就只需要存储一次。
  • 提高效率:每一层都可以被缓存,从而加快镜像的构建和拉取。例如,如果一个镜像只修改了最上层的文件,那么只需要拉取最上层即可,而不需要拉取整个镜像。
  • 增加灵活性:每一层都可以被单独修改,从而实现不同的功能。例如,可以在同一个基础镜像上添加不同的应用程序,或者在同一个应用程序镜像上修改不同的配置文件。

4.2. docker镜像分层的结构

82fe7807c2fef6ca0cff4f50a23a300

bootfs –》容器启动的时候需要的内容

rootfs –》容器内部的操作系统

这张图片是一个 Docker 容器的内部结构的示意图,它展示了一个容器是如何由不同的软件和配置层叠在一起的。下面我会逐层解释一下:

  • 内核层:这是容器的最底层,它是操作系统的核心部分,负责和计算机硬件进行交互。容器共享宿主机的内核,因此不需要在容器中安装内核。
  • bootfs 层:这是容器的第二层,它是启动文件系统,负责容器的启动过程。当容器启动完成后,这一层就会被卸载,因此不会占用空间。
  • 基础层:这是容器的第三层,它是一个基础操作系统,提供了最基本的环境和工具。这个示例中使用的是 Debian,但也可以使用其他的操作系统,如 Ubuntu,Alpine 等。
  • 依赖层:这是容器的第四层,它是在基础层之上添加的一些必要的软件包或库,为应用程序提供了依赖支持。这个示例中没有显示具体的依赖层,但可以想象,如果要运行一个 Python 应用程序,可能需要安装 Python,pip,numpy 等。
  • 应用层:这是容器的第五层,它是在依赖层之上添加的一个或多个应用程序或服务,是容器的主要功能部分。这个示例中添加了 Apache 和 emacs 两个应用程序,分别是一个网页服务器和一个文本编辑器。
  • 数据层:这是容器的最上层,它是可写的,负责存储容器运行时产生的数据或配置文件。这一层是容器的临时部分,当容器停止时,这一层的修改会被丢弃,除非使用 docker commit 命令将其保存为新的镜像。

这就是 Docker 容器的分层结构,每一层都是只读的,除了最上层的数据层,它是可写的。每一层都可以被缓存,共享,复用,从而实现了容器的高效,轻量,灵活的特点。

镜像的内核使用的是宿主机的内核

所有的容器都是共享宿主机的内核kernel

4e6bb1b4586cfc7048b79b235789195

上图 Debian 和 BusyBox上层提供各自的 rootfs,底层共用 Docker Host 的 kernel。

容器只能使用 Host 的 kernel,并且不能修改。所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。

这张图片是一个 Linux 操作系统的组件和层次的示意图,它展示了一个操作系统是如何由不同的部分组合在一起的。下面我会逐个解释一下:

  • 内核层:这是操作系统的最底层,它是一段负责管理硬件资源,提供系统服务,执行程序的代码。内核是操作系统的核心,决定了操作系统的性能和稳定性。这个示例中使用的是 Linux 内核,它是一个开源的,跨平台的,可定制的内核。
  • BusyBox 层:这是操作系统的第二层,它是一个集成了许多常用命令和工具的软件包,如 ls,cp,cat,ping 等。BusyBox 是一个轻量级的,适合嵌入式系统的软件包,它可以提供基本的系统功能,如文件操作,网络通信,进程管理等。
  • Debian 层:这是操作系统的第三层,它是一个基于 Linux 内核的发行版,提供了一个完整的,易用的,多样化的操作系统环境。Debian 是一个广泛使用的,有着严格的质量标准和社区支持的发行版,它包含了数以万计的软件包,可以满足各种用户的需求。
  • rootfs 层:这是操作系统的最上层,它是一个可写的,负责存储用户数据和配置文件的文件系统。rootfs 是操作系统的根目录,它包含了所有的文件和目录,如 /bin,/etc,/home 等。rootfs 可以使用不同的文件系统类型,如 ext4,btrfs,zfs 等。

这就是 Linux 操作系统的组件和层次,每一层都是由不同的软件或配置构成的,从而实现了操作系统的功能和特性。我希望这个回答能够帮助你理解 Linux 操作系统的原理。

每装个软件,或者说用一次RUN 镜像就会增加一层,镜像就会越大

img

4.3. base镜像

base 镜像提供的是最小安装的 Linux 发行版

FROM scratch 官方说明:该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像

4.4. 容器的启动

容器启动的时候是自下而上的

3e395e0917ab9797653db4feda75dee

这个时候涉及到容器的写实拷贝

如果在第三层找到了文件1 那就不用继续往下找了

  1. 添加文件 在容器中创建文件时,新文件被添加到容器层中。

  2. 读取文件 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。

  3. 修改文件 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

  4. 删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

4.5. 镜像分层的好处

分层的好处在于共享资源,比如说有很多的镜像,可以从base镜像构建而来,那么docker host当中只需要在硬盘上保存一份base镜像即可,同时内存当中也只需要加载一份base镜像即可,也就是说我开多少的相同的镜像,内存在上涨值并不明显,就可以给所有的使用该base镜像的容器提供服务,而且镜像的每一层可以被单独的共享,也就是这一层如果跟其他的镜像重复的话,这一层就可以单独拿出来进行共享。

5. 小知识点

5.1. 如何让你制作的镜像比较小

  • 使用基础镜像要小
  • 少使用RUN和COPY,ADD、WORKDIR
  • 使用镜像启动容器后,再在里面安装软件,使用卷挂载数据

5.2. 镜像为什么要制作的小一点

  • 下载快
  • 存贮,占用磁盘空间小
  • 运行容器的时候占用的内容小
  • 资源消耗小

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机集群协同导航构型自适应选择算法

无人机集群协同导航构型自适应选择算法 Evandworld E-mail:evandworldfoxmail.com 摘要 针对卫星定位系统用于无人机集群时成本高、精度低等问题,本文提出一种基于卡尔曼滤波和概率的无人机集群构型自适应选择算法。在自适应扩展卡尔曼滤波的基础上&a…

忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG(检索增强生成)设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而,重点主要是改进检索工具的效率,如嵌入式搜索、混合搜索和微调嵌入,而不是智能搜索。 这篇文章介绍了一种新的方法,灵感…

Windows11安装运行Linux(Ubuntu)

一、安装windows支持 输入windows打开界面 选择虚拟机监控程序平台、适用于linux的子系统、虚拟机平台 在 Windows 系统中,"虚拟机平台"和"虚拟机监控程序平台"是两个与虚拟化相关的功能,但它们各自有着不同的作用和用途。 虚拟机…

如何使用VSCode上运行Jupyter,详细案例过程出可视化图

Python作为最受AI喜欢的语言之一,我们与大家共同学习下如何在VS Code上运行Jupyter,并且用简单案例实现出图。 环境 VS Code version: 1.80.1 Python: 3.12.0 小白安装过程: 在准备好基础环境,小白心想,AI可是霸占科…

42、WEB攻防——通用漏洞文件包含LFIRFI伪协议编码算法代码审计

文章目录 文件包含文件包含原理攻击思路文件包含分类 sessionPHP伪协议进行文件包含 文件包含 文件包含原理 文件包含其实就是引用&#xff0c;相当于C语言中的include <stdio.h>。文件包含漏洞常出现于php脚本中&#xff0c;当include($file)中的$file变量用户可控&am…

University Program VWF仿真步骤__全加器

本教程将以全加器为例&#xff0c;选择DE2-115开发板的Cyclone IV EP4CE115F29C7 FPGA&#xff0c;使用Quartus Lite v18.1&#xff0c;循序渐进的介绍如何创建Quartus工程&#xff0c;并使用Quartus Prime软件的University Program VWF工具创建波形文件&#xff0c;对全加器的…

【MATLAB源码-第134期】基于matlab的SAR合成孔径雷达成像仿真,对比CS,RD,RMA三种算法成像效果。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 合成孔径雷达&#xff08;SAR&#xff09;是一种高分辨率的雷达成像技术&#xff0c;它通过在不同的时间和位置收集目标的雷达回波数据&#xff0c;来模拟一个远大于实际物理孔径大小的雷达系统。这种技术可以在任何天气条件…

spring boot学习第九篇:操作mongo的集合和集合中的数据

1、安装好了Mongodb 参考&#xff1a;ubuntu安装mongod、配置用户访问、添删改查-CSDN博客 2、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns…

记录下ibus-libpinyin输入法的重新安装

目前的版本为&#xff1a; 首先把现在的ibus-libpinyin卸了 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 安装教程请参考 Installation libpinyin/ibus-libpinyin Wiki GitHub yilai sudo apt install pkg-config sudo apt-get install lib…

Micro micro controller一览

https://www.microchip.com.cn/&#xff0c; Microchip中文网站 https://www.microchip.com.cn/newcommunity/index.php?mSearch&adosearch&moduleDownload&keyworddsPIC33&p3 Microcontrollers and microProcessors dsPIC33 Digital Signal Controllers (D…

客户端会话技术-Cookie

一、会话技术 1.1 概述 会话&#xff1a;一次会话中包含多次**请求和响应** 一次会话&#xff1a;浏览器第一次给服务器资源发送请求&#xff0c;此时会话建立&#xff0c;直到有一方断开为止 会话的功能&#xff1a;在一次会话的范围内的多次请求间&#xff0c;共享数据 …

升级Oracle 单实例数据库19.3到19.22

需求 我的Oracle Database Vagrant Box初始版本为19.3&#xff0c;需要升级到最新的RU&#xff0c;当前为19.22。 以下操作时间为为2024年2月5日。 补丁下载 补丁下载文档参见MOS文档&#xff1a;Primary Note for Database Proactive Patch Program (Doc ID 888.1)。 补丁…

超越sd的绘图开源软件fooocus

Fooocus 是一款图像生成软件&#xff08;基于Gradio&#xff09;。 Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考&#xff1a; 学习自Stable Diffusion&#xff0c;该软件是离线、开源、免费的。 从Midjourney了解到&#xff0c;不需要手动调整&#xff0c;用户…

【【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏(附项目源码)

最终效果 文章目录 最终效果前言导入AI导航系统导航烘培添加羊添加捕食者动画控制随着地面法线旋转在地形上随机生成动物不同部位颜色不同最终效果源码完结前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中,…

新增同步管理、操作日志模块,支持公共链接分享,DataEase开源数据可视化分析平台v2.3.0发布

2024年2月5日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.3.0版本。 这一版本的功能升级包括&#xff1a;新增“同步管理”功能模块&#xff0c;用户可通过此模块&#xff0c;将传统数据库中的数据定时同步到Apache Doris中&#xff0c;让数据分析更快速&#xff1…

第5节、S曲线加减速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍步进电机S曲线相关内容&#xff0c;总共分四个小节讨论步进电机S曲线相关内容 5-1、S曲线加减速简介   根据上节内容&#xff0c;步进电机每一段的速度可以任意设置&#xff0c;但是每一段的…

【Oracle云】基于 OKE 的 Cluster AutoScaler 扩/缩容

Oracle Kubernetes Engine&#xff08;OKE&#xff09;为用户提供了便捷而强大的Kubernetes服务&#xff0c;而集群自动伸缩&#xff08;Cluster AutoScaler&#xff09;则是OKE中的一项重要功能。该功能允许根据工作负载的需要自动调整集群的大小&#xff0c;确保资源的最佳利…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Rating组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Rating组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Rating组件 提供在给定范围内选择评分的组件。 子组件 无。 接口 Rating(opt…

如何在HA智能家居系统中添加HACS集成并实现异地控制家中苹果与小米设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

NLP_Bag-Of-Words(词袋模型)

文章目录 词袋模型用词袋模型计算文本相似度1.构建实验语料库2.给句子分词3.创建词汇表4.生成词袋表示5.计算余弦相似度6.可视化余弦相似度 词袋模型小结 词袋模型 词袋模型是一种简单的文本表示方法&#xff0c;也是自然语言处理的一个经典模型。它将文本中的词看作一个个独立…