当前位置: 首页 > news >正文

9.Docker网络

文章目录

  • 1、Docker网络简介
  • 2、常用基本命令
  • 3、网络模式对比
    • 举例
    • 3.1、bridge模式
    • 3.2、host模式
    • 3.3、none模式
    • 3.4、container模式
    • 3.5、自定义网络

1、Docker网络简介

作用:

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接进行网络通信而不受到影响(下面例子证明)

Docker启动后宿主机网络情况如下:

[root@localhost ~]# ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 fe80::42:f1ff:fee7:6e82  prefixlen 64  scopeid 0x20<link>ether 02:42:f1:e7:6e:82  txqueuelen 0  (Ethernet)RX packets 283  bytes 18529 (18.0 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 249  bytes 26762 (26.1 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.10.101  netmask 255.255.255.0  broadcast 192.168.10.255inet6 fe80::7d22:7ddb:c5c0:943e  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:06:ba:14  txqueuelen 1000  (Ethernet)RX packets 417482  bytes 390510898 (372.4 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 316220  bytes 80580892 (76.8 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1  (Local Loopback)RX packets 24  bytes 1554 (1.5 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 24  bytes 1554 (1.5 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255ether 52:54:00:4b:82:8e  txqueuelen 1000  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址192.168.122.1),是做虚拟机网桥的使用的,其作用是为连接其上的虚机网卡提供 NAT访问外网的功能

docker0:bridge模式对应的名称默认为docker0.

默认创建3大网络模式:

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
44119cc9ea23   bridge    bridge    local
d91b1b0c56a6   host      host      local
b99fab7bcddb   none      null      local

2、常用基本命令

docker network基本命令如下:

[root@localhost ~]# docker network --helpUsage:  docker network COMMANDManage networksCommands:connect     Connect a container to a networkcreate      Create a networkdisconnect  Disconnect a container from a networkinspect     Display detailed information on one or more networksls          List networksprune       Remove all unused networksrm          Remove one or more networks
  1. 查看网络

    [root@localhost ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    44119cc9ea23   bridge    bridge    local
    d91b1b0c56a6   host      host      local
    b99fab7bcddb   none      null      local
    
  2. 查看网络源数据

    [root@localhost ~]# docker network inspect bridge
    [{"Name": "bridge","Id": "44119cc9ea23b265d7a358c044b6347a07eda61e1b950194b1268d80a6a1130f","Created": "2024-05-21T08:10:03.116073617-04:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0","com.docker.network.bridge.name": "docker0","com.docker.network.driver.mtu": "1500"},"Labels": {}}
    ]
    
  3. 创建和删除网络

    [root@localhost ~]# docker network create aa
    a74705857db0820cb65a4f2bc478dc3076759b5a7227d9c43191a36810c5a8be
    [root@localhost ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    a74705857db0   aa        bridge    local
    44119cc9ea23   bridge    bridge    local
    d91b1b0c56a6   host      host      local
    b99fab7bcddb   none      null      local
    [root@localhost ~]# docker network inspect aa
    [{"Name": "aa","Id": "a74705857db0820cb65a4f2bc478dc3076759b5a7227d9c43191a36810c5a8be","Created": "2024-05-21T08:19:34.484538348-04:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
    ]
    [root@localhost ~]# docker network rm aa
    aa
    [root@localhost ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    44119cc9ea23   bridge    bridge    local
    d91b1b0c56a6   host      host      local
    b99fab7bcddb   none      null      local
    

3、网络模式对比

举例

通过实验验证容器实例内默认网络IP生产规则。

  1. 启动两个ubuntu容器实例

    [root@localhost ~]# docker run -it --name u1 ubuntu bash
    root@08193b3d0329:/# [root@localhost ~]# [root@localhost ~]# docker run -it --name u2 ubuntu bash
    root@4ab9fe4de68c:/#
    root@4ab9fe4de68c:/# [root@localhost ~]# [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
    4ab9fe4de68c   ubuntu    "bash"    16 seconds ago   Up 15 seconds             u2
    08193b3d0329   ubuntu    "bash"    34 seconds ago   Up 33 seconds             u1
    
  2. docker inspect 容器ID/容器名称

    [root@localhost ~]# docker inspect u1 | tail -n 20"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:02","NetworkID": "44119cc9ea23b265d7a358c044b6347a07eda61e1b950194b1268d80a6a1130f","EndpointID": "fb78c785caa067f9e1be3f7db8a8f4aa8c5e4fb90c7d036f82397801df5bedf4","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DriverOpts": null,"DNSNames": null}}}}
    ]
    [root@localhost ~]# docker inspect u2 | tail -n 20"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:03","NetworkID": "44119cc9ea23b265d7a358c044b6347a07eda61e1b950194b1268d80a6a1130f","EndpointID": "230a54ffdc3efea8bde3989bdee6d4238ec1d3f8eb387c1d1ee099bd3809d0d2","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DriverOpts": null,"DNSNames": null}}}}
    ]
    

    发现u1的IP为172.17.0.2,u2的IP为172.17.0.3

  3. 关闭u2实例,新建u3实例,查看IP变化

    [root@localhost ~]# docker stop u2
    u2
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
    08193b3d0329   ubuntu    "bash"    5 minutes ago   Up 5 minutes             u1
    [root@localhost ~]# docker run -it --name u3 ubuntu bash
    root@f68bf70d8921:/# [root@localhost ~]# 
    [root@localhost ~]# docker inspect u3 | tail -n 20"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:03","NetworkID": "44119cc9ea23b265d7a358c044b6347a07eda61e1b950194b1268d80a6a1130f","EndpointID": "66087aa062483842ac5e1028e03cbacfde64c6b0a0ee49c586b42f0650db858f","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DriverOpts": null,"DNSNames": null}}}}
    ]
    

    此时u3的IP为172.17.0.3

结论:

docker容器内部的ip是可能会发生变化的。

3.1、bridge模式

使用--network bridge指定,默认使用docker0。

Docker 服务默认会创建一个docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0。它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

查看 bridge 网络的详细信息,并通过 grep 获取名称项如下:

[root@localhost ~]# docker network inspect bridge | grep name"com.docker.network.bridge.name": "docker0",
[root@localhost ~]# ifconfig | grep docker
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

详细原理:

  1. Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
  2. docker run的时候,没有指定network默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……。lo代表127.0.0.1,即localhost。inet addr用来表示网卡的IP地址。
  3. 网桥docker0创建一对对等虚拟设备接口,网桥端叫veth,容器端叫eth0,成对匹配。
    • 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);即docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
    • 每个容器实例内部也有一块网卡,每个接口叫eth0。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

在这里插入图片描述

实验验证:

[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
3f29cf92d37828ddb82b2d6f14e98a876f007505cee9732a0cc39269bf9e2812
[root@localhost ~]# docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
d11c5d7e24f4c749db8fdecec62ba81ba25bc9f565bfb1b8e6267dfdc3181179
[root@localhost ~]# docker exec -it tomcat81 bash
root@3f29cf92d378:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::42:acff:fe11:4/64 scope link valid_lft forever preferred_lft forever
root@3f29cf92d378:/usr/local/tomcat# read escape sequence
[root@localhost ~]# docker exec -it tomcat82 bash
root@d11c5d7e24f4:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
45: eth0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::42:acff:fe11:5/64 scope link valid_lft forever preferred_lft forever
root@d11c5d7e24f4:/usr/local/tomcat# read escape sequence
[root@localhost ~]# ip addr | tail -n 8
44: veth73a16b8@if43: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether a2:fb:75:9a:05:56 brd ff:ff:ff:ff:ff:ff link-netnsid 2inet6 fe80::a0fb:75ff:fe9a:556/64 scope link valid_lft forever preferred_lft forever
46: vethefa7573@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 26:50:1f:5e:9d:7e brd ff:ff:ff:ff:ff:ff link-netnsid 3inet6 fe80::2450:1fff:fe5e:9d7e/64 scope link valid_lft forever preferred_lft forever

从宿主机及两个容器的IP信息可验证,在bridge模式下veth和eth0两两匹配。

3.2、host模式

使用--network host指定,该容器与主机IP一致,共用主机端口。

host模式容器直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT转换。

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

在这里插入图片描述

实验验证:

命令1:docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

在这里插入图片描述

问题:

docke启动时总是遇见标题中的警告

原因:

docker启动时指定–network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

解决:

解决的办法就是使用docker的其他网络模式,例如–network=bridge,这样就可以解决问题,或者直接无视。

命令2:docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

容器详情如下图所示

在这里插入图片描述

​ 通过访问http://宿主机IP:8080/,进行测试。在CentOS里面用默认的火狐浏览器访问容器内的tomcat83看到访问成功,因为此时容器的IP借用主机的,所以容器共享宿主机网络IP,这样的好处是外部主机与容器可以直接通信。

3.3、none模式

使用--network none指定。

在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(127.0.0.1)需要我们自己为Docker容器添加网卡、配置IP等。

验证实验:

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

进入容器内部查看

在这里插入图片描述

在容器外部查看

在这里插入图片描述

3.4、container模式

使用--network container:Name或者--network container:容器ID指定,该容器和指定容器共用IP和端口

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

在这里插入图片描述

错误案例:

docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

报错,相当于tomcat86和tomcat85公用同一个ip同一个端口,导致端口冲突。

本案例使用该镜像演示不适合。

实验验证:

docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine1 alpine /bin/sh

运行结果,验证共用搭桥

在这里插入图片描述

假如此时关闭alpine1,再看看alpine2

在这里插入图片描述

结论:依赖容器(alpine2)的网络需要保证该容器(alpine1)的稳定运行,否则依赖容器(alpine2)网络将会瘫痪。

3.5、自定义网络

自己创建一个network并使用。

before实验验证:

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

上述成功启动并用docker exec进入各自容器实例内部。

按照IP地址ping是OK的

在这里插入图片描述

按照服务名ping是失败的
在这里插入图片描述

after实验验证:

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

  1. 新建自定义网络
[root@zyn01 ~]# docker network create zzyy_network
7bf416ce963c26e39682b1259694ae7c05bebbb0d97b30b46c9169cf952a9dd8
[root@zyn01 ~]# docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
52da5ad0d3c8   bridge         bridge    local
5068ece9f839   host           host      local
0b3a4f577ba6   none           null      local
7bf416ce963c   zzyy_network   bridge    local
  1. 新建容器加入上一步新建的自定义网络
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8
  1. 互相ping测试

在这里插入图片描述

结论:自定义网络本身就维护了主机名和ip的对应关系(ip和域名都能ping通)

相关文章:

9.Docker网络

文章目录 1、Docker网络简介2、常用基本命令3、网络模式对比举例3.1、bridge模式3.2、host模式3.3、none模式3.4、container模式3.5、自定义网络 1、Docker网络简介 作用&#xff1a; 容器间的互联和通信以及端口映射容器IP变动时候可以通过服务名直接进行网络通信而不受到影…...

Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库

今天接到一个学生C语言访问SQLite数据库的的需求: 第一步,SQLite Download Page下载 sqlite3.dll 库 下载解压,发现只有两个文件: 于是使用x64 Native Tools Command Prompt 终端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…...

java库和包的概念

在Java中&#xff0c;"库"和"包"是两个不同的概念&#xff0c;但它们之间存在着密切的关联。 库&#xff08;Library&#xff09; 定义&#xff1a;库是一组已经编写好的代码和资源&#xff0c;用于解决特定的问题或提供特定的功能。它可以包含一个或多个…...

mysql内存结构

一&#xff1a;逻辑存储结构&#xff1a;表空间->段->区->页->行、 表空间&#xff1a;一个mysql实例对应多个表空间&#xff0c;用于存储记录&#xff0c;索引等数据。 段&#xff1a;分为数据段&#xff0c;索引段&#xff0c;回滚段。innoDB是索引组织表&…...

Python | Leetcode Python题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…...

c++二进制输出

输入一个数&#xff0c;输出n个数&#xff0c;数可以是0或1&#xff1b;输入&#xff1a;4输出&#xff1a;0010&#xff1b;提示&#xff1a;本题要用到rand(),srand(time(0));代码如下&#xff1a;#include<bits/stdc.h> #include<windows.h> using namespace s…...

5. C++网络编程-UDP协议的实现

UDP是无连接的。 UDP Server网络编程基本步骤 创建socket&#xff0c;指定使用UDP协议将socket与地址和端口绑定使用recv/send接收/发送数据 由于UDP是无连接的&#xff0c;直接侦听就行使用close关闭连接 这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto 客户端 …...

Altium Designer 中键拖动,滚轮缩放,并修改缩放速度

我的版本是AD19&#xff0c;其他版本应该都一样。 滚轮缩放 首先&#xff0c;要用滚轮缩放&#xff0c;先要调整一下AD 设置&#xff0c;打开Preferences&#xff0c;在Mouse Wheel Configuration 里&#xff0c;把Zoom Main Window 后面Ctrl 上的对勾取消掉&#xff0c;再把…...

python从入门到精通04

一、编写英文月份词典 month_num int(input("请输入您想要查询的月份&#xff1a;")) month_list [January,February,March,April,May,June,July,August,September,October,November,December] print("您查询的月份单词是&#xff1a;", month_list[mon…...

tomcat三级指导

版本 ./catalina.sh linux version.bat win 1.确认是否使用了tomcat管理后台 我们先找到配置文件&#xff1a;tomcat主目录下/conf/server.xml 可以查看到连接端口&#xff0c;默认为8080 然后查看manager-gui管理页面配置文件&#xff0c;是否设置了用户登录 配置文件…...

不知道是该怎么引用多个函数片段?具体示例如代码

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)

前言&#xff1a; 题目链接&#xff1a;P3128 [USACO15DEC] Max Flow P - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 讲解&#xff1a; 这一题含金量真算高的&#xff0c;包含了建树&#xff08;用了图论的知识&#xff09;&#xff0c;求最近公共祖先&#xff08;倍增法…...

在Linux上面部署ELK

注明&#xff1a;一下的软件需要自己准备 一、准备环境&#xff1a; 1.两台elasticsearch主机4G内存 2.两台elasticsearch配置主机名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 两台elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…...

Langchain-Chatchat的markdownHeaderTextSplitter使用

文章目录 背景排查步骤官方issue排查测试正常对话测试官方默认知识库Debug排查vscode配置launch.json命令行自动启动condadebug知识库搜索测试更换ChineseRecursiveTextSplitter分词器 结论 关于markdownHeaderTextSplitter的探索标准的markdown测试集Langchain区分head1和head…...

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明&#xff0c;教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发&#xff0c;我们提出了掩码生成蒸馏&#xff08…...

【C#实战】Newtonsoft.Json基类子类解析

情景再现 假设你有如下类&#xff1a; public class Item {public int Id;public string Name; }public class Weapon: Item {public int CurrentAmmo; }public class Inventory {public List<Item> Items; } 其中你序列化的是Inventory类&#xff0c;Items列表里混杂着…...

表达式求值的相关语法知识(C语言)

目录 整型提升 整型提升的意义 整型提升规则 整型提升实例 算术转换 赋值转换 操作符的属性 C语言的语法并不能保证表达式的执行路径唯一&#xff01;&#xff01;&#xff01; 问题表达式 整型提升 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这…...

开发中遇到Electron自定义窗口的问题

开发中遇到Electron自定义窗口的问题 使用VUE3 Electron 开发一个音乐软件&#xff0c;自定义导航栏的放大、缩小和关闭。 其中使用ipcRenderer进行联系Electron&#xff0c;进行放大、缩小和关闭操作。 遇到问题 遇到__dirname is not defined in ES module scope //在V…...

c# sqlite使用

安装包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…...

39、Flink 的窗口剔除器(Evictors)详解

Evictors Flink 的窗口模型允许在 WindowAssigner 和 Trigger 之外指定可选的 Evictor&#xff0c;通过 evictor(...) 方法传入 Evictor。 Evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素&#xff0c; Evictor 接口提供了两个方法实现此功能&#x…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

SDU棋界精灵——硬件程序ESP32实现opus编码

一、 ​​音频处理框架​ 该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节: 1.核心组件 (1) 音频前端处理 (AFE - Audio Front-End) ​​main/components/audio_pipeline/afe_processor.c​​功能​​: 声学回声…...

如何使用CodeRider插件在IDEA中生成代码

一、环境搭建与插件安装 1.1 环境准备 名称要求说明操作系统Windows 11JetBrains IDEIntelliJ IDEA 2025.1.1.1 (Community Edition)硬件配置推荐16GB内存50GB磁盘空间 1.2 插件安装流程 步骤1&#xff1a;市场安装 打开IDEA&#xff0c;进入File → Settings → Plugins搜…...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...

.Net Framework 4/C# 面向对象编程进阶

一、继承 (一)使用继承 子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。 C# 中使用“:”来表示两个类的继承。子类不能访问父类的私有成员,但是可以访问其公有成员,即只要使用 public 声明类成员,就既可以让一…...