云原生之docker网络详解

news2024/11/24 6:57:21

云原生之docker网络详解

  • 一、相关概念
    • 1.2、CNM
    • 1.3、libnetwork
  • 二、实操
    • 2.1、docker network常用命令
    • 2.2、运行一个docker容器,查看CNM三个概念
    • 2.3、查看docker0在内核路由表上的记录
    • 2.4、查看网络列表
    • 2.5、网络隔离效果展示
    • 2.6、host驱动网络

一、相关概念

1.1、网桥
在一台未经特殊网络配置的Ubuntu机器上安装完Docker之后,在宿主机上通过ifconfig命令可以看到多了一块名为docker0的网卡。该网卡即是docker0网桥,网桥在这里的作用相当于交换机,为连接在其上的设备转发数据帧。

网桥上的veth网卡设备相当于交换机上的端口,可以将多个容器或虚拟机连接其上,这些端口工作在二层(链路层),所以是不需要配置IP信息的。

$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:40ff:fe65:67d8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:40:65:67:d8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 526 (526.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.72  netmask 255.255.240.0  broadcast 192.168.15.255
        inet6 fe80::20c:29ff:fe70:53ec  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:70:53:ec  txqueuelen 1000  (Ethernet)
        RX packets 124134  bytes 8441977 (8.4 MB)
        RX errors 0  dropped 257  overruns 0  frame 0
        TX packets 271  bytes 49957 (49.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 104  bytes 8112 (8.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 8112 (8.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth0fdda42: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::c4fe:c7ff:feb0:8678  prefixlen 64  scopeid 0x20<link>
        ether c6:fe:c7:b0:86:78  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1462 (1.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker的所有容器,都是通过网桥进行通信。
在这里插入图片描述

$ docker inspect registry
[
    {
        "Id": "22634e72e7a3f6fb38991d9e380e514e3ff4b89f418256a54c9f0a0cd5746f1f",
        "Created": "2022-12-13T03:42:35.725091364Z",
        "Path": "/entrypoint.sh",
        "Args": [
            "/etc/docker/registry/config.yml"
        ],
        ......
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "e7822213c3aa7566f3ca1b410f57aeceb01a4666c177640d1574fab0024a00fb",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5000/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "5000"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "5000"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/e7822213c3aa",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "51543b28d5845fc74095634960f21fd2a5ffed373695ace323ef6a0cd9080955",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f06e508f708d688af9608cf4310b086b09a546aa28cd9ed6a80446b077e0888e",
                    "EndpointID": "51543b28d5845fc74095634960f21fd2a5ffed373695ace323ef6a0cd9080955",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

在"NetworkSettings"可以看到一个SandboxID和SandboxKey。使用lsns查看网络命名空间,可以看到SandboxKey(/var/run/docker/netns/e7822213c3aa)。

$ sudo lsns --output-all 
        NS TYPE   PATH              NPROCS   PID  PPID COMMAND                                        UID USER                NETNSID NSFS
4026531835 cgroup /proc/1/ns/cgroup    211     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531836 pid    /proc/1/ns/pid       210     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531837 user   /proc/1/ns/user      211     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531838 uts    /proc/1/ns/uts       207     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531839 ipc    /proc/1/ns/ipc       210     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531840 mnt    /proc/1/ns/mnt       202     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root                        
4026531860 mnt    /proc/21/ns/mnt        1    21     2 kdevtmpfs                                        0 root                        
4026531992 net    /proc/1/ns/net       210     1     0 /sbin/init auto automatic-ubiquity noprompt      0 root             unassigned 
4026532548 mnt    /proc/534/ns/mnt       1   534     1 /lib/systemd/systemd-udevd                       0 root                        
4026532549 uts    /proc/534/ns/uts       1   534     1 /lib/systemd/systemd-udevd                       0 root                        
4026532622 mnt    /proc/773/ns/mnt       1   773     1 /lib/systemd/systemd-timesyncd                 102 systemd-timesync            
4026532623 uts    /proc/773/ns/uts       1   773     1 /lib/systemd/systemd-timesyncd                 102 systemd-timesync            
4026532624 mnt    /proc/854/ns/mnt       1   854     1 /lib/systemd/systemd-networkd                  100 systemd-network             
4026532625 mnt    /proc/856/ns/mnt       1   856     1 /lib/systemd/systemd-resolved                  101 systemd-resolve             
4026532635 mnt    /proc/1083/ns/mnt      1  1083     1 /usr/sbin/ModemManager                           0 root                        
4026532644 mnt    /proc/1494/ns/mnt      1  1494  1466 registry serve /etc/docker/registry/config.yml   0 root                        
4026532645 uts    /proc/1494/ns/uts      1  1494  1466 registry serve /etc/docker/registry/config.yml   0 root                        
4026532646 ipc    /proc/1494/ns/ipc      1  1494  1466 registry serve /etc/docker/registry/config.yml   0 root                        
4026532647 pid    /proc/1494/ns/pid      1  1494  1466 registry serve /etc/docker/registry/config.yml   0 root                        
4026532649 net    /proc/1494/ns/net      1  1494  1466 registry serve /etc/docker/registry/config.yml   0 root                      0 /run/docker/netns/e7822213c3aa
4026532690 mnt    /proc/909/ns/mnt       1   909     1 /lib/systemd/systemd-logind                      0 root                        
4026532691 mnt    /proc/888/ns/mnt       1   888     1 /usr/sbin/irqbalance --foreground                0 root                        
4026532747 uts    /proc/909/ns/uts       1   909     1 /lib/systemd/systemd-logind                      0 root           

1.2、CNM

CNM(Container Network Model)译为容器网络模型,定义了构建容器虚拟化网络的模型。该模型主要包含三个核心组件 沙盒、端点、网络。

  • 沙盒:一个沙盒包含了一个容器网络栈的信息。沙盒可以对容器的接口、路由和DNS设置进行管理。一个沙盒可以有多个端点和网络。
  • 端点:一个端点可以加入一个沙盒和一个网络。一个端点只可以属于一个网络并且只属于一个沙盒。
  • 网络:一个网络是一组可以直接互相联通的端点。一个网络可以包含多个端点。

1.3、libnetwork

libnetwork 实现了CNM 的Docker网络组件库。libnetwork内置了几种网络驱动:

  • bridge驱动。此驱动为Docker的默认设置,使用这个驱动的时候,libnetwork将创建出来的docker容器连接到Docker网桥上。作为最常规的模式,bridge模式已经可以满足docker容器最基本的使用需求了。
  • host驱动。使用这种驱动的时候,libnetwork将不为docker容器创建网络协议栈,即不会创建独立的network namespace。Docker容器中的进程处于宿主机的网络环境中,相当于docker容器与宿主机共同使用一个network namespace,使用宿主机的网卡、IP和端口等信息。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 集群的时候使用。
  • overlay驱动。通过网络虚拟化技术,在同一个物理网络上构建出一张或多张虚拟的逻辑网络。适合大规模的云计算虚拟化环境。
  • remote 驱动。这个驱动实际上并没有做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化,更好的满足了用户的多种需求。用户只要根据libnetwork提供的协议标准,实现其所要求的各个接口并向Docker daemon进行注册。
  • null 驱动。使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace 自带的loopback网卡外,没有其他任何网卡、ip、路由等信息,需要用户为Docker容器添加网卡、配置IP等。这种模式如果不进行特定的配置是无法正常使用的,但有点也非常明显,它给了用户最大的自由度来定义容器的网络环境。

二、实操

2.1、docker network常用命令

# 连接一个容器到一个网络 
docker network connect #Connect a container to a network 
# 创建一个网络 
docker network create #Create a network 
# 将容器从一个网络中断开 
docker network disconnect #Disconnect a container from a network 
# 查看网络的详细信息 
docker network inspect #Display detailed information on one or more networks 
# 查看网络列表 
docker network ls #List networks 
# 移除所有为使用的网络 
docker network prune #Remove all unused networks 
# 移除一个或多个网络 
docker network rm #Remove one or more networks 

(1)创建网络时,可以指定子网IP地址、网关、IP范围等信息,IP地址斜杆后面的数字表示固定了前面IP的多少位不能改变。(一个IP地址是32bit的)

docker network create --subnet=172.11.0.1/16 --gateway=172.11.11.11 --ip-range=172.11.1.2/24 mynet

(2)启动容器时绑定网络,注意–network要在容器名的前面。

docker run -d --network brigh nginx

2.2、运行一个docker容器,查看CNM三个概念

# 运行一个容器 
docker run -d -it --name myubuntu ubuntu /bin/bash 
# 查看容器详信息 
docker inspect myubuntu

2.3、查看docker0在内核路由表上的记录

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.8.1     0.0.0.0         UG    100    0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.0     0.0.0.0         255.255.240.0   U     0      0        0 ens33
192.168.8.1     0.0.0.0         255.255.255.255 UH    100    0        0 ens33

通过以上命令可以找到一条静态路由,该路由表示所有目的IP地址为172.17.0.0/16的数据包都从docker0网卡发出。

2.4、查看网络列表

(1)查看宿主机已有网络列表:

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f06e508f708d   bridge    bridge    local
75f3915547ea   host      host      local
a1b056f00f28   none      null      local

docker 安装后默认创建了以上的三个驱动的网络。

查看bridge网络详细信息:

$ docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "f06e508f708d688af9608cf4310b086b09a546aa28cd9ed6a80446b077e0888e",
        "Created": "2023-02-22T06:10:47.57011656Z",
        "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": {
            "22634e72e7a3f6fb38991d9e380e514e3ff4b89f418256a54c9f0a0cd5746f1f": {
                "Name": "registry",
                "EndpointID": "51543b28d5845fc74095634960f21fd2a5ffed373695ace323ef6a0cd9080955",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "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": {}
    }
]

默认情况下,我们启动的容器都接入到了默认的bridge 网络中,该网络以docker0为网关同外界交互。

(2)运行两个容器,它们会加入默认网络,同时网桥上会多出两个无IP地址的网卡,作为端口让容器接入网桥。

docker run -d -p 80:80 nginx 
docker run -d -p 81:80 nginx  
fly@fly:~$ docker run -d -p 80:80 nginx
da0d48e1d26db4b9ec644274cee230370397b153bfeaa6b4a97573d846dfbf6a
fly@fly:~$ docker run -d -p 81:80 nginx
7a1160ba5ce9bbdb6108d3c2f08a7e250b66e928baa469417138f9ace405bc9e

查看bridge 网络有哪些容器被接入了(Containers部分):

$ docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "f06e508f708d688af9608cf4310b086b09a546aa28cd9ed6a80446b077e0888e",
        "Created": "2023-02-22T06:10:47.57011656Z",
        "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": {
            "22634e72e7a3f6fb38991d9e380e514e3ff4b89f418256a54c9f0a0cd5746f1f": {
                "Name": "registry",
                "EndpointID": "51543b28d5845fc74095634960f21fd2a5ffed373695ace323ef6a0cd9080955",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "7a1160ba5ce9bbdb6108d3c2f08a7e250b66e928baa469417138f9ace405bc9e": {
                "Name": "elastic_hypatia",
                "EndpointID": "a06678d6825243103c923488c7c239c9d2ad8b96aee6f191e68eee0c58cb1405",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "da0d48e1d26db4b9ec644274cee230370397b153bfeaa6b4a97573d846dfbf6a": {
                "Name": "interesting_mestorf",
                "EndpointID": "1431bedade9c20d82ca78a147ace08b0e9c5fcf9bc43bcc541db4cee0380dfe3",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "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)通过brctl show 查看宿主机上网桥信息(需要安装bridge-utils软件包):

$ brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242406567d8	no		veth0fdda42
							veth6a2fa56
							vethdc1f5f2

可以看到网桥下面接入了很多虚拟网卡,这些网卡都没有ip地址,因为网桥是在链路层工作,是网络第二层,通讯方式不是通过ip,所以这些虚拟网卡无需ip,而这些网卡充当了网桥上端口的角色,为容器的接入提供支持。

通过ifconfig可以查看宿主机上的网卡信息 :

$ ifconfig 
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:40ff:fe65:67d8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:40:65:67:d8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 526 (526.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.72  netmask 255.255.240.0  broadcast 192.168.15.255
        inet6 fe80::20c:29ff:fe70:53ec  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:70:53:ec  txqueuelen 1000  (Ethernet)
        RX packets 1112461  bytes 75138488 (75.1 MB)
        RX errors 0  dropped 2915  overruns 0  frame 0
        TX packets 1015  bytes 139048 (139.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 104  bytes 8112 (8.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 8112 (8.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth0fdda42: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::c4fe:c7ff:feb0:8678  prefixlen 64  scopeid 0x20<link>
        ether c6:fe:c7:b0:86:78  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21  bytes 1742 (1.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth6a2fa56: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::8cab:c2ff:fe6c:4291  prefixlen 64  scopeid 0x20<link>
        ether 8e:ab:c2:6c:42:91  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 866 (866.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethdc1f5f2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::48f1:13ff:feed:4d31  prefixlen 64  scopeid 0x20<link>
        ether 4a:f1:13:ed:4d:31  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 866 (866.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(4)分别进入两个nginx容器尝试相互访问:

  1. 通过docker exec 进入容器 。
  2. 通过docker inspect 查看容器IP 。
  3. 容器内部相互curl访问http://IP:80端口。

2.5、网络隔离效果展示

我们都知道,不同网络的机器是不能通信的。

(1)创建两个bridge网络。

docker network create backend 
docker network create frontend

(2)通过一些命令展示创建后的网络的一些属性,以及计算机上的变化。

# 查看宿主机网卡变化 
ifconfig 
# 查看网络属性 
docker network ls 
docker network inspect backend 
docker network inspect frontend 
# 查看路由规则 
route -n

(3)运行两个nginx 容器,分别指定到两个网络。

docker run -d -p 83:80 --name mynginx1 --net backend nginx 
docker run -d -p 84:80 --name mynginx2 --net frontend nginx 

通过docker exec 进入容器 。
通过docker inspect 查看容器IP 。
容器内部相互curl访问http://IP:80端口 。

上述操作,表明两个不再一个网络的两个容器间是无法相互访问的。那么我们增加一个网络,将两个容器接入到新增的网络中。查看容器详细信息,关注网络部分。

docker network create middle 
docker network connect middle mynginx1 
docker network connect middle mynginx2

从容器详情可以看出,容器多了一个网卡。容器每接入一个网络,就会生成一个对应的网卡。那么我们不难想象到,我们每新建一个容器,会产生两个网卡,第一个是容器内部的网卡用来与网桥通讯的;第二个是网桥上的无IP网卡,用来充当网桥端口的,供容器接入的。

(4)通过共同网络去实现容器间相互访问。

通过docker exec 进入容器 。
通过docker inspect 查看容器IP 。
容器内部相互curl访问http://IP:80端口 。

2.6、host驱动网络

创建host驱动网络,向网络添加容器,演示网卡数,容器网络等情况。

(1)创建host驱动的网络实例,注意:一个宿主机只允许有一个host驱动的网络实例。

docker network create --driver host host1 

(2)运行一个基于host的网络实例的nginx容器。

# 运行容器 
docker run -d --net host nginx 
# 访问本机80端口 
curl http://localhost 

(3)查看各种信息。

# ifconfig 查看宿主机网卡,并没有应为创建了host网络上的容器而增加网卡信息 
ifconfig 
# 查看host 网络实例信息 
docker network inspect host 
# 查看容器网络信息 
docker inspect <容器ID> 

容器在接入host网络后,已经不具备独立的IP地址了。甚至于运行容器 -p 参数都被禁用了。我们可以尝试运行一个nginx 指定-p参数,并查看容器运行日志。

在这里插入图片描述

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

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

相关文章

链表经典刷题--快慢指针与双指针

本篇总结链表解题思路----快慢指针&#xff0c;其实也就是双指针&#xff0c;这个快慢并不单纯指“快慢”&#xff0c;它更多的可以表示&#xff0c;速度快慢&#xff0c;距离长度&#xff0c;时间大小等等&#xff0c;用法很有趣也很独特&#xff0c;理解它的思想&#xff0c;…

「并发编程实战」常见的限流方案

「并发编程实战」常见的限流方案 文章目录「并发编程实战」常见的限流方案一、概述二、计数器限流方案三、时间窗口限流方案四、令牌桶限流方案五、漏桶限流方案六、高并发限流算法小结文章参考&#xff1a; 追忆四年前&#xff1a;一段关于我被外企CTO用登录注册吊打的不堪往事…

01 | n2n虚拟局域网

1 n2n简介 为了满足两个不同局域网的机器进行通信&#xff0c;让不同网段的机器能够进行P2P( 点对点 peer-to-peer ) 通信。2 n2n源码 https://github.com/ntop/n2n.git3 n2n名词 3.1 SuperNode 超级节点 SuperNode 相当与注册中心, 它会记录边缘节点的连接信息&#xff0c;…

案例09-数据类型不一致导致equals判断为false

一&#xff1a;背景介绍 在判断课程id和班级id的时候如果一致就像课程信息进行更新&#xff0c;如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了&#xff0c;在判断的时候结果为false&#xff0c;就有插入…

【这一篇就够】mysql创建JSON数据的索引

一. 创建索引 由于json有两类不同的数据形式&#xff0c;即&#xff1a;json对象&#xff08;如&#xff1a;{"id": 1, "name":"he"}&#xff09;&#xff0c;json数组&#xff08;如&#xff1a;["1","2","3"]&…

nexus安装与入门

安装 nexus-3.31.1-01-unix.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1YrJMwpGxmu8N2d7XMl6fSg 提取码&#xff1a;kfeh 上传到服务器&#xff0c;解压 tar -zvxf nexus-3.31.1-01-unix.tar.gz进入bin目录&#xff0c;启动 ./nexus start查看状态 ./nexus status默…

初始Linux操作系统

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

Linux常用命令等

目录 1.Linux常用命令 (1)系统命令 (2)文件操作命令 2.vim编辑器 3.linux系统中,软件安装 (1) rpm 安装,RedHat Package Manager (2)yum 安装 (3)源代码编译安装 1.Linux常用命令 Linux命令是非常多的,对于像嵌入式开发工程师,运维工程师需要掌握的命令是非常多的.对于…

旋转矩形框标注--roLabelImg的使用

1. 旋转目标标注roLabelImg roLabelImg是一款开源的,可标注带旋转角度的矩形区域的标注软件。roLabelImg源码github地址: https://github.com/cgvict/roLabelImg labelme和labelimg只能标矩形框,但不能标注旋转角度。roLabelImg既能标矩形框也能标注矩形框的选择角度,因此…

复旦发布中国版 ChatGPT :MOSS

不知道这个人工智能&#xff0c;有没有获得完整的一生。ChatGPT 是最先进的 AI&#xff0c;也是最热门的应用 —— 自去年 11 月底发布以来&#xff0c;它的月活跃用户两个月超过一亿&#xff0c;轻松拿到了全球互联网史上用户增长速度的第一。它也是一种门槛很高的技术。由于 …

服务预热配置化在泛型化方法上的实践

背景 由于开发过程中&#xff0c;个别dubbo接口的调用会在服务发布过程中&#xff0c;出现P99耗时报警问题。因此我们计划通过预热服务接口&#xff0c;通过预热来触发JIT&#xff0c;构建DB资源长链接。实现服务接口上线后&#xff0c;耗时过长&#xff0c;资源等待等问题&am…

基于RWEQ模型的土壤风蚀模数估算及其变化归因分析

查看原文>>>基于RWEQ模型的土壤风蚀模数估算及其变化归因分析 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff…

python re模块匹配字符串

python 正则模块re 要使用python3中的RE则必须引入 re模块 import re re模块的match函数 result re.match(^[A-Z]{1}[a-z], s) match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 匹配到了&#xff0c;则…

AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

AI for Science被广泛认为是下一代科研范式&#xff0c;可以有效处理多维度、多模态、多场景下的模拟和真实数据&#xff0c;解决复杂推演计算问题&#xff0c;加速新科学问题发现[1] 。百度飞桨科学计算工具组件赛桨PaddleScience是国内首个公开且可应用于CFD&#xff08;Comp…

通过工厂模式实现SpringBoot+MQTT-订阅与消费

引言 Spring Boot 是一款用于构建基于 Spring 框架的快速应用程序的开源框架。它的目标是简化 Spring 应用程序的开发和部署过程&#xff0c;Spring Boot 通过提供一些默认配置和自动配置&#xff0c;可以让开发者更快的创建一个独立的、产品级别的 Spring 应用程序。 MQTT 是…

pathon Django的关系映射

一对一 【创建】 一对一是表示现实事物间存在的一对一的对应关系。特殊字段选项 【必须】 on_delete - 级联删除 更多参考模型字段参考 | Django 文档 | Django使用oto示例&#xff1a; 1、先创建oto应用&#xff0c;然后到setting.py文件注册应用2、创建oto模型类3、创建…

【人工智能 AI】机器学习快速入门教程(Google)

目录 机器学习术语 标签 特性 示例 模型 回归与分类 深入了解机器学习&#xff1a;线性回归 深入了解机器学习&#xff1a;训练和损失 平方损失函数&#xff1a;一种常用的损失函数 机器学习术语 预计用时&#xff1a;8 分钟 什么是&#xff08;监督式&#xff…

蚁群算法再优化:combine aco algorithm with Sarsa in RL

蚁群算法再优化&#xff1a;combine aco algorithm with Sarsa in RL蚁群算法、Sarsa介绍和TSP问题介绍TSP和Sarsaaco algorithm具体的改进和代码改进说明部分代码数值实验结论分析参考文献蚁群算法、Sarsa介绍和TSP问题介绍 在进行蚁群算法优化介绍之前&#xff0c;笔者先将涉…

Apache Pulsar 云原生消息中间件之王

一、简介 pulsar&#xff0c;消息中间件&#xff0c;是一个用于服务器到服务器的消息系统&#xff0c;具有多租户、高性能等优势。 pulsar采用发布-订阅的设计模式&#xff0c;producer发布消息到topic&#xff0c;consumer订阅这些topic处理流入的消息&#xff0c;并当处理完…

OIDC OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接入 Authing

在上一篇文章OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式&#xff08;Authorization Code&#xff09;接入 Authing中&#xff0c;我们整体介绍 OIDC / OAuth2.0 协议&#xff0c;本次我们将重点围绕授权码模式&#xff08;Authorization Code&#xff09;以及接…