Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

news2024/11/24 14:03:32

一、前言

记录时间 [2024-4-16]

系列文章简摘:
Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
Docker 学习笔记(七):介绍 Dockerfile 相关知识,使用 Dockerfile 构建自己的 centos 镜像
Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

更多 Docker 相关文章请参考上面专栏哦,入门篇 1~5 已完结6 开始是精髓篇:容器数据卷、Dockerfile、Docker 网络

本文介绍了 Docker 网络原理,介绍了 docker0,Veth-pair 技术,以及 Docker 给容器分配虚拟网卡的方式。同时讲述了两种容器互联的方式,分别是 Link 和 自定义网络。还有容器之间跨网络连通的方式。


二、划重点

当我们在 Linux 宿主机中安装了 Docker:

  • 宿主机中就会配置 docker0 网卡,docker0 使用的是 Linux 桥接模式,使用的技术是 Veth-pair 技术。
  • 每启动一个 Docker 容器,Docker 就会给该容器分配一个 ip,一对虚拟网卡。

关于 Docker0 的结论:

  • Docker 容器 tomcat01 和 tomcat02,二者共用一个路由器,即 docker0;
  • 所有容器在不指定网络的情况下,都使用 docker0 路由,Docker 会给它们默认分配一个可用的 IP 地址;
  • Docker 中所有的网络接口都是虚拟的,因为虚拟网卡转发效率高,传输文件快。
  • 移除容器之后,分配给它的虚拟网卡自动消失,对应的网桥就没了。

关于自定义网络:

  • Docker 中的自定义网络,修复了 docker0 不能使用名字 ping 连接的问题;
  • 给不同的集群使用不同的自定义网络,可以保证集群的安全和健康。

关于跨网络连通:

  • 假设容器之间要跨网络通信,其中一个容器需要拥有多个 IP 地址。

三、清空 Docker 环境

在之前的 Docker 学习中,我们下载 / 提交 / 构建了很多镜像,运行了各种不同的容器,真是不错的收获!现在我们将进入 Docker 网络的学习,为了便于学习和理解 Docker 网络的内部原理,我们先清空一下 Docker 环境,把里面的镜像和容器通通删除。

当然啦,如果有特别想要保留的镜像,就把它们发布到阿里云镜像仓库吧。发布镜像,请参考这篇文章

不清空也没有关系,就是会看着有亿点点乱罢了。

删除镜像 / 容器命令:

# 删除所有 docker 容器
docker rm -f $(docker ps -aq)

# 删除所有 docker 镜像
docker rmi -f $(docker images -aq)

# 查看是否删除成功
docker images		# 查看所有 docker 镜像
docker ps -a		# 查看所有 docker 容器

四、介绍 Docker0

1. 理解网络 Docker0

删除完成后,我们来查看 Linux 宿主机网络

[root@localhost ~]# ip addr
1: lo: 本机回环地址
2: eth0: 阿里云内网地址
3: docker0: docker0 地址
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
# 172.17.0.1 相当于一个路由器 网关

通过查询发现,Linux 宿主机中一共有 3 个网络,除却本机回环地址 127.0.0.1,以及本机内网地址,剩下的 docker0 便与 Docker 网络相关了。

当我们在 Linux 宿主机中安装了 Docker:

  • 宿主机中就会配置 docker0 网卡,docker0 使用的是 Linux 桥接模式,使用的技术是 Veth-pair 技术。
  • 每启动一个 Docker 容器,Docker 就会给该容器分配一个 ip,一对虚拟网卡。

2. 提前解决报错

由于远程仓库中的 tomcat 镜像是精简版的,镜像内部缺少 iproute2 和 iputils-ping 依赖,直接使用此镜像来运行是无法使用 ip 命令的,会报出如下错误:

OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown
OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown

不要慌,解决办法也很简单,就是自己安装一下 iproute2 和 iputils-ping 依赖

因为后面我们要运行好多容器,手动给每个容器都去安装一遍的话就显得累赘,所以我们把这个容器 commit 为本地镜像

安装 iproute2 和 iputils-ping 方法:

# 1. 用基础镜像 tomcat 运行一个容器 tomcat01
docker run -d -P --name tomcat01 tomcat

# 2. 进入容器
docker exec -it tomcat01 /bin/bash

# 3. 更新 apt,安装 iproute2,安装 iputils-ping
apt-get update
apt install -y iproute2
apt install -y iputils-ping

# 4. 安装完以后退出 exit
# 5. 提交 容器 tomcat01 为本地镜像
docker commit -a="yuanyuan" -m="add apt ip and ping" tomcat01 yuanyuan/tomcat

3. 一对虚拟网卡

那么,Docker 如何处理网络访问?或者说,两个 Docker 容器之间如何通信?

我们在 Docker0 网络下运行两个 tomcat 容器,来进行测试。

查看容器 tomcat01 内部的网络地址:

  • 追加命令:ip addr
docker exec -it 容器名 ip addr

# tomcat01 的 ip 172.17.0.2
[root@localhost ~]# docker exec -it tomcat01 ip addr
144: eth0@if145: inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

每启动一个 Docker 容器,Docker 就会给该容器分配一个 ip,一对虚拟网卡。

我们发现,容器 tomcat01 启动时,得到了 Docker 分配的 ip 地址和虚拟网卡。

  • ip 地址:172.17.0.2
  • 一对虚拟网卡:144: eth0@if145

思考:Linux 宿主机可以同 容器 tomcat01 通信吗?

通过宿主机 ping 容器 ip 的方式,我们来测试一下:发现可以 ping 通,因为它们在同一网段。

[root@localhost ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.124 ms

此时,我们再来查看 Linux 宿主机网络

# Linux 多了一对虚拟网卡
[root@localhost ~]# ip addr
3: docker0: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
145: veth57938f5@if144: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc

发现 Linux 多了一对虚拟网卡,这对虚拟网卡和 tomcat01 有很大的联系。


再创启动一个 tomcat02 容器试试:

# 镜像 yuanyuan/tomcat 是我们刚刚提交的那一个
docker run -d -P --name tomcat02 yuanyuan/tomcat

然后查看一下 Linux 的网络:Linux 又多了一对虚拟网卡。

# Linux 又多了一对虚拟网卡
[root@localhost ~]# ip addr
3: docker0: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
145: veth57938f5@if144: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc 
149: veth31fb2d8@if148: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc

查看下 tomcat02 容器的网络配置:

# tomcat02 ip 172.17.0.3; 虚拟网卡 148: eth0@if149
[root@localhost ~]# docker exec -it tomcat02 ip addr
148: eth0@if149: inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0

容器的虚拟网卡和宿主机的虚拟网卡是相对应的!

随着容器带来的虚拟网卡,都是一对一对的,这便是 Veth-pair 技术。

Veth-pair 是一对虚拟设备接口,它们都是成对出现的,一端连接协议,一端彼此相连。正因为有这个特性,Veth-pair 能充当桥梁,来连接各种虚拟网络设备。


4. 使用 Docker0

由于容器 tomcat01 和 tomcat02 都是通过 Docker0 方式桥接的,所以它们之间能够通信,但是,只能通过 ip 地址,不能用名字。

我们测试一下上述容器 tomcat01 和 tomcat02 之间能否 ping 通。

用 tomcat02 ping tomcat01:(反之亦然)

[root@localhost ~]# docker exec -it tomcat02 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.076 ms

不难发现,容器和容器之间是可以互相 ping 通的。

绘制一个网络模型图来加深理解:tomcat01 想要和 tomcat02 通信,得借助 docker0 这个路由器

在这里插入图片描述


现在,我们把 tomcat01 容器删除:

docker rm -f tomcat01

再次查看 Linux 的网络配置:发现 tomcat01 容器对应的网桥被一同移除了。

# 删掉容器,少了一对虚拟网卡,对应的网桥就没了
[root@localhost ~]# ip addr
3: docker0: inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
149: veth31fb2d8@if148: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc

关于局域网的知识补充:

每个 IP 地址由二进制的四段组成:00000000.00000000.00000000.00000000,每一段的范围是 0~255。

比如有这样一个子网掩码 255.255.0.0/16,这里转换成十进制表示,

16 表示 IP 的前 16 位用来固定网段 255.255,后 16 位用来给局域网内设备分配 IP,255.255.0.1 一般是路由器网关。

那么 IP 为 255.255.xxx.xxx 这样的设备都在这个局域网中,可以互相 ping 通。


关于 Docker0 的结论:

  • Docker 容器 tomcat01 和 tomcat02,二者共用一个路由器,即 docker0;
  • 所有容器在不指定网络的情况下,都使用 docker0 路由,Docker 会给它们默认分配一个可用的 IP 地址;
  • Docker 中所有的网络接口都是虚拟的,因为虚拟网卡转发效率高,传输文件快。
  • 移除容器之后,分配给它的虚拟网卡自动消失,对应的网桥就没了。

如图所示,Docker 使用 Veth-pair 技术实现容器间的通信。

在这里插入图片描述


5. 查看网络模式

我们来查看一下 Docker 中的几种网络模式:

  • bridge:桥接模式,默认的 docker0 用的就是这种;
  • host:和宿主机共享网络;
  • none:不配置网络;
  • container:容器网络连通(这种用得少,局限性很大)
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
949536a4c28c   bridge    bridge    local
03fb5b594ce1   host      host      local
1e8dd7dab9b3   none      null      local

然后具体查看一下桥接模式 bridge:

  • Subnet:子网掩码
  • Gateway:网关
  • Containers:给容器分配的默认 IP 信息
[root@localhost ~]# docker network inspect 949536a4c28c
{
	"Subnet": "172.17.0.0/16",
	"Gateway": "172.17.0.1"
}

# 如果容器没有指定 IP,docker0 会随机分配
"Containers": {
	"Name": "tomcat01",        
	"IPv4Address": "172.17.0.2/16",
}

五、容器互联

1. Link 方式

思考一个场景:假如我们编写了一个微服务,需要连接数据库,但数据库每次启动 ip 都会发生变化,为了使得微服务不受数据库 ip 变化的影响,我们希望通过名字来进行数据库访问,实现微服务的高可用。

在默认的 docker0 中,添加 --link 参数,可以达到这个要求。

重新运行一个 tomcat01 容器吧:

docker run -d -P --name tomcat01 yuanyuan/tomcat

默认 docker0 情况下,容器之间只能通过 ip 来 ping,名字是 ping 不通的。

试一下吧,用 tomcat02 ping tomcat01,直接 ping 容器名字。

[root@localhost ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

名字 ping 不通,怎么解决呢?添加 --link 参数。

我们再运行一个新的容器 tomcat03 测试下,把 tomcat03 link 到 tomcat02

docker run -d -P --name tomcat03 --link tomcat02 yuanyuan/tomcat

测试 tomcat02 和 tomcat03 之间用名字 ping 一下:tomcat03 可以 ping tomcat02,但 tomcat02 不可以 ping tomcat03。

# tomcat03 ping tomcat02 可以
[root@localhost ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.202 ms

# tomcat02 ping tomcat03 不可以
[root@localhost ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

为什么呢?inspect 探究一下吧。可以在 tomcat03 容器中找到 Link 配置,而 tomcat02 容器中没有配置。

[root@localhost ~]# docker inspect tomcat03
"Links": ["/tomcat02:/tomcat03/tomcat02"]

也可以通过查看 hosts 配置来发现原理。tomcat03 在本地配置了 tomcat02 的配置,它把 tomcat02 直接写入了 hosts 文件,ping tomcat02 / b71a0a6566a3 就相当于 ping 对应的 ip 172.17.0.3。

tomcat02 的 hosts 文件里就没有写 tomcat03,大家可以查看验证一下。

# --link 就是在 tomcat03 的 hosts 里绑定了 172.17.0.3  tomcat02 b71a0a6566a3

[root@localhost ~]# docker exec -it tomcat03 cat /etc/hosts
172.17.0.3      tomcat02 b71a0a6566a3

这就是为什么 tomcat03 可以 ping tomcat02,但 tomcat02 不可以 ping tomcat03 的原因啦。


2. 自定义网络

创建自定义网络

之前是使用的是默认网络 docker0:

# 我们直接启动命令 --net bridge,就是 docker0
# 以下两条命令是等同的,--net bridge 默认情况下可以省略。
docker run -d -P --name tomcat01 yuanyuan/tomcat
docker run -d -P --name tomcat01 --net bridge yuanyuan/tomcat

先清空一下容器:

docker rm -f $(docker ps -aq)

接下来我们自定义一个桥接网络 mynet,配置两个容器到 mynet 网络中。

创建一个自定义网络:

  • --driver:设置网络模式;
  • --subnet:设置子网掩码;
  • --gateway:设置网关;
  • mynet:自定义网络的名字。
# 创建一个自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

# 查看网络模式
docker network ls

# 查看自定义网络 mynet 的详细信息
docker network inspect mynet

启动两个容器 tomcat-net-01 和 tomcat-net-02,把 tomcat 发布到自定义网络中。

# 运行容器
docker run -d -P --name tomcat-net-01 --net mynet yuanyuan/tomcat
docker run -d -P --name tomcat-net-02 --net mynet yuanyuan/tomcat

# 查看 mynet 给容器们分配的 ip
docker network inspect mynet

测试 ping 连接

接下来,我们测试一下 tomcat-net-01 (192.168.0.2)tomcat-net-02 (192.168.0.3) 之间的 ping 连接。

  • tomcat-net-01 ping 192.168.0.3:成功
  • tomcat-net-01 ping tomcat-net-02:成功
  • tomcat-net-02 ping tomcat-net-01:成功
# 现在不使用 --link 也可以 ping 名字了!

# tomcat-net-01 ping 192.168.0.3
[root@localhost ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.092 ms

# tomcat-net-01 ping tomcat-net-02
[root@localhost ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.135 ms

# tomcat-net-02 ping tomcat-net-01
[root@localhost ~]# docker exec -it tomcat-net-02 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.046 ms

关于自定义网络:

  • Docker 中的自定义网络,修复了 docker0 不能使用名字 ping 连接的问题;
  • 给不同的集群使用不同的自定义网络,可以保证集群的安全和健康。

六、跨网络连通

1. 连通方式

当前,在 Linux 宿主机中,有两个 Docker 网络,分别是 docker0 和 mynet,两个都是桥接模式,网段不同。

如图所示,在 docker0 局域网中,运行了 container01 和 container02 两个容器;在 mynet 局域网中,运行了 container03 和 container04 两个容器。

在不经过多余配置的情况下,container01 和 container03 是无法通信的,就是 ping 不通的。

那如果,container01 就非常想和 container03 通信,有啥办法嘛?

首先,docker0 和 mynet 这两个网段肯定是不能打通的,否则就违背了我们给不同的集群使用不同的自定义网络的初衷。

那么,container01 就只能取得 mynet 的联系了。

container01 先联络上 mynet,再通过 mynet 联络上 container03。

在这里插入图片描述


2. 操作实现

在 docker0 中运行两个容器 tomcat01,tomcat02,之前的被删了。

不死心,tomcat01 先去 ping 一下 mynet 中的 tomcat-net-01:

docker run -d -P --name tomcat01 yuanyuan/tomcat
docker run -d -P --name tomcat02 yuanyuan/tomcat

# tomcat01 ping tomcat-net-01
[root@localhost ~]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

显然,tomcat01 ping tomcat-net-01,失败咯。


那么,tomcat01 要怎么联络上 mynet 呢?我们来研究一下 docker 中 network 的使用方法。

docker network --help

# 发现了 connect 方法,连接一个容器到一个网络
[root@localhost ~]# docker network --help
Usage:  docker network COMMAND
Commands:
  connect     Connect a container to a network

测试连接 tomcat01 容器和 mynet 网络:

# 测试打通 tomcat01--mynet
docker network connect mynet tomcat01

现在再尝试 tomcat01 ping tomcat-net-01,会发现:成功了!

而且, tomcat01 不仅可以通信 tomcat-net-01,也可以通信 tomcat-net-02,tomcat01 可以和 mynet 中任何一个容器通信

但是,和 tomcat01 一起的 tomcat02 就依然不行。

# tomcat01 ping tomcat-net-01 可以
[root@localhost ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.115 ms

# tomcat01 ping tomcat-net-02 可以
[root@localhost ~]# docker exec -it tomcat01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.081 ms

# tomcat02 ping tomcat-net-01 不行哦
[root@localhost ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

3. 一个容器,两个 IP

这是怎么实现的呀?就是给 tomcat01 加了一个 IP,这个容器现在有两个 IP 地址了,一个在原来的 docker0 下,另一个在 mynet 下。

这就好比阿里云服务器,它有一个公网 IP 和一个私网 IP。

可以在 mynet 配置中查看 tomcat01 的配置信息:

docker network inspect mynet

"Name": "tomcat01",
"IPv4Address": "192.168.0.4/16"

七、总结

本文介绍了 Docker 网络原理,介绍了 docker0,Veth-pair 技术,以及 Docker 给容器分配虚拟网卡的方式。同时讲述了两种容器互联的方式,分别是 Link 和 自定义网络。还有容器之间跨网络连通的方式。

一些参考资料

狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html

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

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

相关文章

引领智能互联时代,紫光展锐赋能百业创新发展

随着5G技术的快速发展&#xff0c;各行各业对通信技术的需求也在不断升级。紫光展锐持续深耕5G垂直行业&#xff0c;不断推进5G标准演进&#xff0c;从R15到R16&#xff0c;再到R17&#xff0c;展锐携手生态合作伙伴&#xff0c;不断推出创新性解决方案&#xff0c;在5G RedCap…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天&#xff0c;可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点&#xff0c;深受消费者喜爱。然而&#xff0c;随着可穿戴设备市场的快速扩张&#xff0c;其安全性和可靠性问题也日益凸显。为了确保产品质量&#xff0c;…

【Git】常用命令速查

目录 一、创建版本 二、修改和提交 三、查看提交历史 四、撤销 五、分支与标签 六、合并与衍合 七、远程操作 一、创建版本 命令简要说明注意事项git clone <url>克隆远程版本库 二、修改和提交 命令简要说明注意事项 三、查看提交历史 命令简要说明注意事项 …

Adobe AE(After Effects)2017下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

OpenCV轻松入门(八)——图片卷积

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置&#xff0c;这个操作就叫卷积。 卷积需要4个嵌套循环&#xff0c;所以它并不快&#xff0c;除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…

Map与Set的模拟实现封装

目录 一. 底层原理 二. 红黑树节点的定义 三. 仿函数封装 四. 基本函数的封装 五. 迭代器的封装 5.1 迭代器的基本定义 5.2 *与->操作 5.3 迭代器的操作 5.3.1 右子树不为空 5.3.2 右子树为空 5.4 迭代器的--操作 5.4.1 当前节点的父节点…

CentOS 7开机启动过程,引导和服务,密码的修改

开机启动过程&#xff1a; 引导过程&#xff1a;1.开机自检(BIOS)->2.MBR引导->GRUB菜单->加载内核kernel->systemd进程初始化 程序&#xff1a;执行特定任务的一串代码&#xff0c;静态&#xff0c;存在硬盘中。 进程&#xff1a;运行中的程序叫进程&#xff0…

第十一章数据仓库和商务智能10分

【数据仓库-后端&#xff0c;商务智能-前端】 基本算法&#xff1a;关联关系&#xff08;牵手-谈恋爱&#xff09;&#xff0c;集群关系&#xff08;杭州人爱吃酸甜口&#xff09;&#xff0c;决策树&#xff0c;线性回归&#xff0c;贝叶斯&#xff0c;神经网络&#xff0c;时…

【Linux】磁盘扩容到根目录逻辑卷(LVM)

目录 一、物理卷和逻辑卷 1.物理卷和逻辑卷的区别 2.在Linux系统中查看所有物理卷的信息 3.在Linux系统中查看所有逻辑卷的信息 二、文件系统 三、实操-对root&#xff08;/&#xff09;目录进行扩容 1.使用lsblk命令查看新加入的磁盘信息 2.fdisk -l命令查看系统中磁盘…

景区导览系统平台|智能导览|数字人导游|VR游园

随着人工智能、元宇宙等技术的飞速发展&#xff0c;文旅行业正迎来一场前所未有的变革。道可云文旅元宇宙平台以其独特的智慧景区导览系统、元宇宙空间以及数字人导游等创新应用&#xff0c;为景区和游客带来了全新的旅游体验&#xff0c;也标志着文旅行业正式步入了元宇宙时代…

含多种需求响应及电动汽车的微网/虚拟电厂日前优化调度

1 主要内容 程序主要建立一个微网/虚拟电厂的日前优化调度模型&#xff0c;以燃气轮机运行成本、购售电费用、电动汽车电池损耗成本以及需求响应费用之和为目标&#xff0c;在日前经济调度模型中&#xff0c;加入了电动汽车模型&#xff0c;考虑了电动汽车出行规律以及充放电规…

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…

环境搭建创建项目_使用DevEco开发工具进行开发_创建项目_认识项目结构---HarmonyOS4.0+鸿蒙NEXT工作笔记001

首先去下载DevEco Studio然后再去安装就可以了 安装下一步下一步非常简单 首先去安装nodejs,可以看到,有两个安装方法,左边是自己安装的制定文件夹就可以了,然后 右边是使用鸿蒙自带的,我们选择第二个 然后我们看这个ohpm其实就跟npm是一个意思,用来管理鸿蒙的包的. 这里我们…

JavaEE:JVM

基本介绍 JVM&#xff1a;Java虚拟机&#xff0c;用于解释执行Java字节码 jdk&#xff1a;Java开发工具包 jre&#xff1a;Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言&#xff0c;而java不想重新编译&#xff0c;希望能直接执行。Java先通过javac把.java…

【机器学习】贝叶斯算法在机器学习中的应用与实例分析

贝叶斯算法在机器学习中的应用与实例分析 一、贝叶斯算法原理及重要性二、朴素贝叶斯分类器的实现三、贝叶斯网络在自然语言处理中的应用四、总结与展望 在人工智能的浪潮中&#xff0c;机器学习以其独特的魅力引领着科技领域的创新。其中&#xff0c;贝叶斯算法以其概率推理的…

用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM

Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …

通过腾讯云搭建跨境电商demo的详细操作过程(建站系统 保姆级指导,巨详细)

引言&#xff1a; 有许多做跨境电商的朋友&#xff0c;或者为跨境电商服务的小企业&#xff0c;都会面临搭建电商平台V1.0的问题 因此&#xff0c;花了点时间&#xff0c;找了一个开源的项目&#xff0c;让大家可以跑起来&#xff0c;一方面了解平台都有哪些模块&#xff0c;另…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏&#xff0c;可以结合遮罩&#xff0c;通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现&#xff1a; 1、新建一个Image组件&#xff0c;并添加精灵&#xff0c;调整大小后&#xff0c;复制一份作为该UI的父物体&#xf…

1、MYSQL系列-深入理解Mysql索引底层数据结构与算法

索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构 二叉树红黑树Hash表BTree B-Tree B-Tree 叶节点具有相同的深度&#xff0c;叶节点的指针为空&#xff0c;所有索引元素不重复&#xff0c;节点中的数据索引从左到右递增排列 BTree(B-Tree变种) 非叶…

Pytorch搭建GoogleNet神经网络

一、创建卷积模板文件 因为每次使用卷积层都需要调用Con2d和relu激活函数&#xff0c;每次都调用非常麻烦&#xff0c;就将他们打包在一起写成一个类。 in_channels&#xff1a;输入矩阵深度作为参数输入 out_channels: 输出矩阵深度作为参数输入 经过卷积层和relu激活函数…