Docker高级管理--容器通信技术与数据持久化

第一节:容器通信技术

一:Docker 容器的网络模式

      当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 的网络模式非常丰富,可以满足不同容器的通信要求,下表列出了这些网络模式的主要信息。

网络模式创建此种网络模式的关键选项简单说明
host 模式--network host容器直接使用宿主主机的网络栈,没有独立的网络命名空间,网络性能高,但容器与宿主主机共享网络资源,易出现端口冲突。
container 模式--network container:<已存容器名或 ID>新容器共享指定已有容器的网络命名空间,两个容器网络配置相同,适用于需要紧密耦合通信的容器组合。
none 模式--network none容器仅有一个 lo 回环接口,无任何外部网络连接,适用于对网络安全性要求极高或需手动配置网络的场景。
bridge 模式默认模式,可通过 -d bridge 手动指定(一般省略)Docker 默认网络模式,创建 docker0 虚拟网桥,容器通过 veth 设备连到该网桥;容器有独立 IP,借助宿主主机 NAT 访问外部网络。
Overlay 模式-d overlay用于 Docker Swarm 集群,基于 VXLAN 技术创建跨主机的虚拟覆盖网络,实现不同宿主主机上容器间的通信。
macvlan 模式-d macvlan,还需指定 --subnet、--gateway 和 -o parent=<宿主机构物理网卡>为容器分配唯一 MAC 地址,使其像独立物理设备,直接连接宿主机构物理网络接口,绕过 docker0 网桥,提高网络性能。
自定义网络模式docker network create 结合如 --subnet、--gateway、--ip-range 等参数

1: Bridge 模式

      当 Docker 安装完成后,会自动创建一个名为 docker0 的虚拟网桥。在 Bridge 模式下,新创建的容器会通过一个虚拟以太网设备对(veth pair)连接到 docker0 网桥上。

      Docker 守护进程会从预定义的子网中为每个容器分配一个唯一的 IP 地址。容器可以通过 docker0 网桥与宿主主机以及其他连接到该网桥的容器进行通信。

      当容器需要访问外部网络时,宿主主机的内核会通过网络地址转换(NAT)将容器的私有 IP 地址转换为宿主主机的公共 IP 地址,从而实现容器与外部网络的通信。

      bridge 模式是 docker 的默认网络模式,不写 -net 参数,就是 bridge 模式。使用 docker run -p 时,docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。

      如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。

      随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。

(1)创建一个叫 my - net 的 bridge 类型的网络
docker network create -d bridge my - net
(2)查看都有哪些网络
docker network ls
(3)运行一个容器并连接到新建的 my - net 网络
docker run -dit --name busybox1 --rm --network my-net busybox sh -c "while true;do echo nihao;done"
(4)运行一个容器并加入到 my - net 网络
docker run -it --name busybox2 --rm --network my-net busybox sh

2: Host 模式

      使用 Host 模式的容器会直接使用宿主主机的网络栈,容器没有独立的网络命名空间,而是与宿主主机共享相同的 IP 地址、端口等网络资源。

      由于容器和宿主主机共享网络栈,因此容器可以直接使用宿主主机的网络接口,不存在网络地址转换和网桥转发的开销,网络性能较高。但同时也意味着容器之间以及容器与宿主主机之间的网络隔离性较差,可能会出现端口冲突等问题。

      如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主主机隔离的。Host

docker run -dit --net=host --name docker_nost1 busybox

      由于使用了 Host 模式,容器会直接使用宿主主机的网络端口,因此可以直接在宿主主机上通过 localhost 访问容器内的服务,使用 ifconfig 命令可以看到容器的网络和宿主的是一致的。

docker exec -it docker_host1 sh

3: Container 模式

      Container 模式允许一个容器共享另一个容器的网络命名空间,即两个容器使用相同的网络配置,包括 IP 地址、端口等,利用这种模式使得容器共享统一的网络命名空间。

      这种模式适用于那些需要紧密耦合的容器,例如一个应用程序和它的日志收集器容器,它们可以共享同一个网络,方便进行通信和数据传输。

      这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

docker run -tid --name host1 busybox
(1)创建 host2 容器共享 host1 容器的网络
 docker run -itd --net = container:host1 --name host2 busybox
(2)查询 host1 容器的网络
docker exec -it host1 ifconfig
(3)查询 host2 容器的网络,确认和 host1 容器的网络一致
docker exec -it host2 ifconfig

4: None 模式

      在 None 模式下,容器只有一个 lo 回环接口,没有任何外部网络连接。这种模式适用于那些不需要网络通信或者需要手动配置网络的场景,例如某些安全敏感的应用程序。

     如果需要为 None 模式的容器添加网络功能,需要手动创建网络接口并进行配置。

      使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

docker run -itd --net = none --name none01 busybox sh
docker exec -it none01 sh
5: Overlay 模式

      Overlay 模式主要用于 Docker Swarm 集群,它允许容器在不同的 Docker 宿主主机之间进行通信。它基于 VXLAN(Virtual eXtensible Local Area Network)技术,在物理网络之上创建一个虚拟的覆盖网络。

      当容器之间进行通信时,数据包会被封装在 VXLAN 报头中,通过物理网络进行传输。在接收端,VXLAN 报头会被解封装,还原出原始的数据包。

      Overlay 网络是分布式的,每个 Docker 宿主主机上都有一个网络代理(如 Docker 的docker_gwbridge)负责管理和转发数据包。

示例

# 在 Docker Swarm 集群中创建一个 Overlay 网络
docker network create -d overlay my_overlay_network# 在不同的宿主主机上创建服务并连接到 Overlay 网络
docker service create --name my_service --network my_overlay_network nginx

6: Macvlan 模式

     在 Macvlan 模式下,Docker 为每个容器分配一个唯一的 MAC 地址,使得容器在网络中看起来像一个独立的物理设备。

      容器直接连接到宿主主机的物理网络接口,绕过了 docker0 网桥,从而提高了网络性能。容器可以直接与外部网络进行通信,就像一个独立的主机一样。

每个容器都有自己独立的网络配置,与宿主主机和其他容器之间相互隔离。

示例:使容器获得一个与宿主主机在同一子网内的 IP 地址,可以直接与外部网络进行通信。

# 创建一个 Macvlan 网络
docker network create -d macvlan \
--subnet = 192.168.1.0/24 \
--gateway = 192.168.1.1 \
-o parent = eth0 \
my_macvlan_network# 创建一个使用 Macvlan 网络的容器
docker run -d --name my_macvlan_container --network my_macvlan_network nginx
7: 自定义网络模式

      除了上述内置的网络模式,你还可以使用 docker network create 命令创建自定义的 bridge 网络,以满足特定的网络需求,例如指定子网、网关、IP 范围等。

示例 1:使用如下命令创建一个自定义网络

docker network create \
--subnet = 172.21.0.0/16 \
--gateway = 172.21.0.1 \
my_custom_network

此命令的主要目的是创建一个新的 Docker 网络,这个网络可以用于容器之间的通信。默认情况下,创建的是一个基于 bridge 驱动的网络。

  • docker network create:这是 Docker 提供的用于创建网络的基础命令。
  • --subnet = 172.21.0.0/16:指定了该网络使用的子网范围。172.21.0.0/16 是一个 CIDR(无类别域间路由)表示法,意味着该子网的网络地址是 172.21.0.0,子网掩码为 255.255.0.0,可以容纳 65534 个可用的 IP 地址(2^16 - 2,减去网络地址和广播地址)。当容器连接到这个网络时,它们将从这个子网范围内分配 IP 地址。
  • --gateway = 172.21.0.1:设置了该网络的网关地址。网关是容器访问外部网络(超出该子网范围)的出口点。当容器需要与子网外的网络进行通信时,数据包会被发送到这个网关地址进行转发。
  • my_custom_network:为新创建的网络指定了一个名称,后续在创建容器时,可以通过这个名称将容器连接到该网络。

示例 2:创建一个新的容器并加入这个自定义网络

docker run -d --name my_container --network my_custom_network nginx

二:端口映射

      Docker 是一个开源的容器化平台,用于构建、运行和管理应用程序。它使用容器来打包应用程序及其依赖项,使得应用程序可以在不同的环境中快速、可靠地运行。在 Docker 中,端口映射是一个重要的特性,它允许容器内部的应用程序与宿主主机进行通信。

      Docker 的端口映射使用 -p 或 --publish 选项来实现。通过该选项,可以将容器内部的端口映射到宿主主机上的某个端口。这样,容器内部的应用程序可以通过宿主主机的端口来访问外部的网络或服务。宿主主机上的端口号,表示容器内部的端口号。通过指定这两个端口号,Docker 会将容器内部的端口映射到宿主主机的端口上。

1:端口映射

(1)-P(大写):指的是容器应用 PORT 随机映射到宿主主机上的 PORT
  • 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号 +1。
  • 生产场景一般不使用随机映射,好处是由 docker 分配,宿主主机端口不会冲突。
(2)-p(小写):(宿主主机 PORT: 容器 PORT)
  • 宿主主机 IP 不写表示 0.0.0.0,宿主主机 PORT 不写表示随机端口,容器 PORT 必须指定,可以同时对多个端口进行映射绑定。
  • 指定端口映射,在标准化场景下使用频率高。
  • 端口的取值范围 32768~61000 之间

2:随机映射的端口

      在使用 docker run 命令创建并启动容器时,可以使用 -P(大写的 P)参数来实现随机端口映射。它会将容器中 EXPOSE 指令声明的所有端口随机映射到宿主主机的可用端口上。

假设你要运行一个 Nginx 容器,Nginx 默认监听 80 端口。使用以下命令启动容器:

docker run --rm -d -P nginx
docker ps -a
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
bc9831ca1c0cnginx"/docker-entrypoint…"3 seconds agoUp 2 seconds0.0.0.0:32768->80/tcp, :: :32768->80/tcpnaughty_haslett

      在 docker run --rm 命令中,--rm 是一个组合的选项,并不是 r 和 m 分别代表不同含义,它是一个整体参数,用于控制容器在停止运行后自动删除。

     当你在运行容器时添加 --rm 选项,Docker 会在容器退出时自动删除该容器的文件系统和所有相关资源,这样可以避免产生大量不再使用的容器,节省磁盘空间。

3:指定映射端口

   docker run 命令用于创建并启动一个新的容器,通过 -p(小写的 p)参数可以指定容器端口到宿主主机端口的映射。

(1)固定端口

假设你要运行一个 Nginx 容器,并将容器的 80 端口映射到宿主主机的 8080 端口,可使用以下命令:

docker run --rm -d -p 8080:80 nginx

需要注意的是,在映射端口时,所使用的 docker 主机上的端口不能与其他容器或程序的端口冲突。否则,容器无法正常创建。

(2)宿主主机随机端口

当使用小写的 -p 参数时,你可以不指定宿主主机的具体端口,只给出容器端口,Docker 会自动将容器端口映射到宿主主机的一个随机可用端口上。

 docker run --rm -d -p 80 nginxdocker ps

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
89b94e02ea1nginx"/docker-entrypoint…"2 minutes agoUp 2 minutes0.0.0.0:32769->80/tcpamazing_banach
873340e689nginx"/docker-entrypoint…"2 minutes agoUp 2 minutes0.0.0.0:32768->80/tcpsleepy_merkle
6dbc5dbd8ef4nginx"/docker-entrypoint…"2 minutes ag

三:容器互联

      在 Docker 环境中,每个容器默认情况下是相互隔离的,它们有自己独立的网络栈。容器互联就是打破这种隔离,让不同容器能够识别彼此并进行网络通信,就像它们处于同一个本地网络中一样。通过容器互联,一个容器可以像访问本地网络中的其他设备一样访问另一个容器提供的服务,比如访问另一个容器运行的数据库、web 服务等。

1:使用 --link 选项(已逐渐被弃用)

     在早期的 Docker 版本中,--link 选项用于实现容器互联。它允许一个容器通过别名来访问另一个容器。接下来介绍其实现步骤。

(1)创建源容器
docker run -dit --name web01 centos:7

(2)创建接收容器
 docker run -dit --name web02 --link web01:myweb01 centos:7

      该命令的主要功能是基于 centos:7 镜像创建并启动一个名为 web02 的容器,同时使用 --link 选项将这个新容器与名为 web01 的容器进行连接,使 web02 容器可以通过 web01 这个别名访问 web01 容器的服务。

  --link web01:myweb01 字段是一个用于容器互联的选项,但需要注意的是,该选项在较新的 Docker 版本中已逐渐被弃用。它的作用是将 web02 容器与名为 web01 的容器进行连接,并为 web01 容器设置一个别名 myweb01。在 web02 容器内部,可以通过这个别名来访问 web01 容器提供的服务。

(3)测试容器互联
docker exec -it web02 /bin/bash
cat /etc/hostsping myweb01

四:容器间通信实现案例

      由于 --link 选项已逐渐被弃用,建议使用 Docker 网络来实现容器互联。docker network create 是 Docker 提供的一个用于创建自定义网络的命令。在 Docker 中,网络用于容器之间的通信以及容器与外部世界的通信。

1:常用选项及解释

(1)--driver, -d

该选项用于指定网络使用的驱动程序,默认值是 bridge。常见的驱动类型有:

  • bridge:默认的网络驱动,适用于在单个 Docker 宿主主机上创建的容器之间的通信。
  • host:使用宿主主机的网络栈,容器直接使用宿主主机的网络接口,不进行网络隔离。
  • overlay:用于在多个 Docker 宿主主机之间创建跨主机的网络,通常用于 Docker Swarm 集群。
  • macvlan:允许为容器分配一个 MAC 地址,使其在网络中看起来像一个独立的物理设备。

示例:创建一个使用 bridge 驱动的网络

docker network create -d bridge my_bridge_network
(2)--subnet

该选项用于指定网络的子网,格式为 CIDR 表示法(如 192.168.0.0/16)。

示例:创建一个指定子网的网络:

docker network create --subnet=172.18.0.0/16 my_subnet_network
(3)--gateway

该选项用于指定网络的网关 IP 地址。

示例:创建一个指定子网和网关的网络

docker network create \
--subnet=172.19.0.0/16 \
--gateway=172.19.0.1 \
my_gateway_network
(4)--ip-range

该选项用于指定容器可以使用的 IP 地址范围。

示例:创建一个指定子网、网关和 IP 范围的网络

docker network create \
--subnet=172.20.0.0/16 \
--gateway=172.20.0.1 \
--ip-range=172.20.1.0/24 \
my_ip_range_network
(5)--internal

该选项用于将网络设置为内部网络,即容器无法访问外部网络。

示例:创建一个内部网络:

docker network create --internal my_internal_network
(6)--attachable

该选项可以允许独立的容器(非服务容器)连接到这个网络。

示例:创建一个可连接的网络:

docker network create --attachable my_attachable_network

2:容器间通信步骤

(1)创建自定义网络
docker network create my_net
(2)创建一个不在此自定义网络的容器
docker run -dit --name web03 centos:7
(3)创建两个容器,并加入自定义网络
docker run -dit --name pc01 --net=my_net centos:7
docker run -dit --name pc02 --net=my_net centos:7

(4)登录到容器,测试通信结果
docker exec -it pc01 /bin/bash
ping pc02  # 能通
ping web03  # 不能通

第二节:数据持久化技术

一:Docker 的数据管理

Docker 数据卷(Data Volumes)是 Docker 中用于持久化存储数据的一种机制,它在容器和宿主主机之间建立了一种数据共享的方式,下面从多个方面详细解释 Docker 数据卷。

1:什么是数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过了容器的文件系统,直接将宿主主机上的目录或文件挂载到容器内部。这意味着即使容器被删除,数据卷中的数据也不会丢失,从而实现了数据的持久化存储。

2:数据卷的作用

(1)数据持久化

容器的生命周期可能是短暂的,当容器被删除时,其内部文件系统中的数据也会随之消失。而数据卷可以将数据存储在宿主主机上,确保数据不会因为容器的删除而丢失。

(2)数据共享

多个容器可以同时挂载同一个数据卷,从而实现容器之间的数据共享。这对于需要共享配置文件、日志文件或其他数据的应用场景非常有用。

(3)数据备份和恢复

由于数据卷中的数据存储在宿主主机上,因此可以方便地进行备份和恢复操作。

(4)分离数据和应用

将数据存储在数据卷中,可以使容器的镜像更加轻量化,只包含应用程序本身,而将数据分离出来,提高了容器的可移植性和可维护性。

2:创建匿名数据卷

在创建容器时,可以使用 -v 或 --volume 参数来创建和挂载匿名数据卷。

docker run -dit -v /data1 -v /data2 --name web04 centos:7

上述命令创建了一个名为 web04 的容器,并在容器内部创建了一个 /data1 目录和 /data2 目录作为数据卷。Docker 会自动在宿主主机上的 /var/lib/docker/volumes 目录下分配一个该容器的目录来存储这个数据卷的数据。当把此容器删除掉以后,宿主主机上的目录以及里面的数据仍然存在。可登录到此容器验证这一效果。

[root@localhost ~]# docker exec -it web04 /bin/bash
[root@9a398d3ec1f3 /]# cd /data1
[root@9a398d3ec1f3 data1]# cd /data2

3:创建具名数据卷

具名数据卷是一种有名称的数据卷,可以更方便地管理和使用。创建方法如下。

(1)创建具名数据卷
docker volume create my_volume
(2)在创建容器时挂载具名数据卷
docker run -d -v my_volume:/data --name my_container nginx

上述命令首先创建了一个名为 my_volume 的具名数据卷,然后在创建容器时将该数据卷挂载到容器内部的 /data 目录。

4:共享容器数据卷

如果希望在容器之间共享数据,可以使用下面的命令来实现。

[root@localhost ~]# docker run -dit --volumes-from web04 --name web05 centos:7 /bin/bash

这个命令的主要功能是基于 centos:7 镜像创建并启动一个名为 web05 的新容器,该容器会以交互模式、守护进程模式运行,并且会从 web04 容器中挂载所有的数据卷。

--volumes-from web04:这是一个关键参数,它的作用是让新创建的 web05 容器挂载 web04 容器中所有已经挂载的数据卷。这意味着 web05 容器可以访问和使用 web04 容器所使用的数据卷中的数据,实现数据的共享。

注意事项

  • 如果 web04 容器被删除,只要数据卷本身没有被删除,web05 容器仍然可以正常访问数据卷中的数据。
  • 当多个容器共享同一个数据卷时,对数据卷中数据的修改会影响到所有挂载该数据卷的容器。

5:挂载主机目录作为数据卷

可以将宿主主机上的指定目录挂载到容器内部,实现数据的共享。

案例 1:
(1)将宿主主机上的 /data1 目录挂载到容器内的 /usr/local/apache2/htdocs 目录。
docker run -dit -p 8080:80 -v /data1:/usr/local/apache2/htdocs --name web06 httpd
(2)创建测试文件
echo "hi" > /data1/index.html
(3)访问服务
curl 192.168.10.101:8080
案例 2:

利用数据卷挂载的方式,也可以实现文件挂载,以及多目录同时挂载。需要注意的是,在对文件进行挂载的时候,宿主主机一定要提前准备好这个文件,否则,会在宿主主机上创建出一个以该文件名来命名的目录。这样,在容器中就无法使用这个文件了。

(1)在宿主主机创建挂载目录
mkdir -p /www/{conf,html}
(2)准备数据

将编辑好的 nginx 配置文件拷贝到 /www/conf
将网站代码拷贝到 /www/html

(3)创建容器

docker run -d -p 9090:80 \
-v /www/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /www/html:/www/html \
-v /www/nginx/log:/var/log/nginx \
--name web08 nginx "nginx"

二:Docker 数据管理注意事项

      在 Docker 中进行数据管理时,需要考虑数据的持久化、共享、备份、恢复以及安全性等多个方面。

1:明确使用场景选择类型

  • 匿名数据卷:创建简单,但管理不便,适合临时存储中间数据。例如在构建过程中存储临时编译文件。
  • 具名数据卷:便于管理和共享,适用于需要持久化存储且后续会频繁使用的数据,如数据库数据。
  • 挂载主机目录:方便与主机进行数据交互,适合需要与主机共享配置文件或数据的场景。

2:使用正确的路径

挂载主机目录作为数据卷时,必须使用绝对路径,否则会导致挂载失败。

3:数据卷清理

定期清理无用数据卷:使用 docker volume ls 查看所有数据卷。对于不再使用的匿名或具名数据卷,使用 docker volume rm 命令进行清理,避免占用过多磁盘空间。

4:容器内数据持久化

      容器的文件系统是基于镜像层和容器层构建的,容器层的数据在容器删除时会丢失。因此,对于需要持久化的数据,应使用数据卷进行存储

      多个容器可以挂载同一个数据卷来实现数据共享。但要注意并发访问问题,可能需要在应用层面实现数据同步机制,如使用锁机制或事务处理。

      对于数据库、日志文件等关键数据,应将其存储在数据卷中,确保数据的持久化和可恢复性。例如,对于 MySQL 容器,将数据目录 /var/lib/mysql 挂载到数据卷上。

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

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

相关文章

jsons.top工具之数组交集、去重

作为一名程序员&#xff0c;一款高效的 在线转换工具 &#xff08;在线时间戳转换 计算器 字节单位转换 json格式化&#xff09;必不可少&#xff01;https://jsons.top 用js实现一个轻量级的集合运算工具&#xff0c;可以对数组、集合去重、求交并差集&#xff0c;找出两个集…

Vue3 + Tailwind CSS 后台管理系统教程

Vue3 搭配 Tailwind CSS 是构建现代后台管理系统的绝佳组合。Vue3 提供了高效的响应式框架&#xff0c;而 Tailwind CSS 则让样式编写变得快速且灵活。下面我将分步骤教你如何创建一个功能完整的后台管理系统。 第 1 步&#xff1a;创建项目 首先&#xff0c;我们需要使用 Vit…

ComfyUI遭“Pickai“C++后门攻击,全球700余台AI图像生成服务器沦陷

大规模AI基础设施遭遇定向攻击 网络安全研究机构XLab近日发现针对ComfyUI框架的活跃攻击活动。ComfyUI是当前广泛用于部署大型AI图像生成模型的开源框架。攻击者通过该框架漏洞植入名为Pickai的C后门程序&#xff0c;已导致全球近700台服务器失陷。中国国家网络安全通报中心于…

Unity_VR_如何用键鼠模拟VR输入_PICO项目配置

文章目录 [TOC] 一、创建项目1.直接创建VR核心模板&#xff08;简单&#xff09;2.创建3D核心模板导入XR包&#xff08;并配置pico&#xff09;&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;导入PICO的SDK&#xff08;3&#xff09;启用 PICO XR 插件&#xff0…

站点天下--网站在线和SSL过期监控的可靠助手

简介 网站突然访问不了、HTTPS证书到期&#xff0c;如果不能及时发现&#xff0c;将蒙受损失~ 站点天下提供应用在线状态监控和SSL证书到期监控&#xff1a; 若访问不了或SSL证书即将到期&#xff0c;则立即发邮件通知&#xff01;可以在线查看应用的在线状态和SSL证书到期时…

React setState原理

异步更新 原因 1设置为异步提升性能 如果setState每次调用直接执行&#xff0c;会造成 render 函数被频繁执行 &#xff0c;页面重新被渲染 解决&#xff1a;异步批处理 2如果render函数未执行时&#xff0c;保证props和state一致性 拿到最新state的方法 法一:setState&…

汉代大模型:历史镜像与智能重构的深度对话

引言&#xff1a;当历史遇见人工智能 一件汉代陶俑的三维模型正通过增强现实技术向观众演绎农耕场景。这个看似寻常的文物活化案例&#xff0c;实则蕴含着人工智能与历史学交叉领域的前沿探索——汉代大模型。作为连接过去与未来的智能载体&#xff0c;汉代大模型不仅重构了我…

es向量检索里的efSearchc参数是干嘛用的

在Elasticsearch的向量检索中&#xff0c;ef_search&#xff08;或efSearch&#xff09;是控制HNSW近似最近邻&#xff08;ANN&#xff09;搜索精度与性能平衡的关键参数&#xff0c;其作用机制和影响如下&#xff1a; &#x1f6e0;️ 一、核心作用 ef_search 限制底层图遍历…

Mac SSH终端操作工具 SecureCRT

SecureCRT Mac 是一款SSH终端工具&#xff0c;为计算专业人士提供高级会话管理工具。 也是一个功能强大且值得信赖的基于GUI的SHH和Telnet客户端&#xff0c;以及旨在提高工作效率并简化重复任务的终端仿真器。 借助SecureCRT mac版的帮助&#xff0c;您可以通过对ANSI&#…

UE5关卡快照

关卡快照&#xff08;Level Snapshots&#xff09; 使你能够在关卡的 世界大纲视图&#xff08;World Outliner&#xff09; 中保存 Actors 的特定配置&#xff0c;并立即将场景恢复到该状态。这样可以大幅简化复杂的设置&#xff0c;并避免对不同场景同一关卡的多个变体进行复…

Maven 或 Gradle 下载和添加 jar 文件的步骤

使用 Maven 或 Gradle 来自动下载和添加 jar 文件是管理 Java 项目依赖的最佳方式。 以下是如何使用 Maven 和 Gradle 来自动下载和添加 jar 文件的步骤&#xff1a; 使用 Maven # 创建一个 Maven 项目&#xff1a; mvn archetype:generate -DgroupIdcom.example -Dartifact…

JVM对象创建全流程解析

一、JVM对象创建流程 Ⅰ、类加载检查——JVM创建对象时先检查类是否加载 在虚拟机遇到new指令时&#xff0c;比如new关键字、对象克隆、对象序列化时&#xff0c;如下字节码 0: new #2 // class com/example/demo/Calculate检查指令的参数&#x…

深度学习从入门到精通:PyTorch实战与核心原理详解

掌握深度学习核心概念&#xff0c;玩转PyTorch框架&#xff0c;从理论到实战一站式学习指南 &#x1f680; 一、深度学习全景图 &#x1f31f; 人工智能金字塔 &#x1f50d; 深度学习核心优势 ​​优势​​​​劣势​​​​适用场景​​自动特征提取依赖大数据图像识别&…

计算机网络期末 物理层

目录 数据通信基础(理解) 传输介质(熟悉) 基带传输(熟悉) 数字编码(熟悉) 频带传输与调制解调(理解) 多路复用技术(了解) 物理层设备与极限速率(掌握) 数据通信基础(理解) 一堆概念 通信的类型 同步技术 传输介质(熟悉) 有线介质 同轴电缆 双绞线 光纤 无线介质 无线电…

力扣-139.单词拆分

题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 class Solution {public boolean wordBrea…

LeetCode-1679. K 和数对的最大数目

给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 地址&#xff1a;https://leetcode.cn/problems/max-number-of-k-sum-pairs/description/?envTyp…

相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、背景 二、:Camera动态参数差异 2.1:动态参数差异核查项 2.2 :动态参数差异核查关键字 2.3 :前置普通拍照动态参数 2.4 :后置普通拍照动态参数 2.5 :后置人像模式…

ModbusTCP转Profibus网关在配料系统中的配置实践

在现代饲料企业的生产过程中&#xff0c;自动化技术的应用日益广泛。其中&#xff0c;ModbusTCP和Profibus是两种常见的工业通信协议&#xff0c;它们在数据采集和设备控制方面发挥着重要作用。然而&#xff0c;由于这两种协议在技术上的差异&#xff0c;直接互通往往存在困难。…

双馈风机分段控制策略的一次调频模型深度解析

双馈风机分段控制策略的一次调频模型深度解析 摘要 随着风电渗透率的急剧攀升,电力系统惯性降低与一次调频能力弱化问题日益凸显。双馈感应发电机(DFIG)凭借其优越的性能已成为主流机型,但其常规控制策略使其自然不具备响应系统频率变化的能力。本文深入探讨基于分段控制策…

JMeter 高阶玩法:分布式压测的技术核心技术要点

在2025年的数字化浪潮中&#xff0c;网站和应用的性能直接决定用户体验和业务成败&#xff01;想象一下&#xff0c;双十一促销期间&#xff0c;你的电商平台因无法承受高并发而崩溃&#xff0c;或者金融系统在高峰期响应迟缓——这不仅是技术问题&#xff0c;更是商业灾难&…