【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路:(九)Docker网络

  • Docker网络模式简介
  • bridge网络模式
  • host网络模式
  • none网络模式
  • container网络模式
  • user-defined网络模式
    • 1.创建自定义的bridge网络
    • 2.使用自定义网络
  • 高级网络配置
    • docker network命令

为什么要了解容器的网络模式?

首先,容器之间虽然不是物理隔离,但是它们彼此之间默认是不互联互通的,这有助于保持每个容器的纯粹性,相互之间互不影响。其次,既然使用了容器,那么通常情况下,容器需要与宿主机通信,或者A容器与B容器通信而B容器不需要知道A容器的存在,或者A、B两容器相互通信。

容器与宿主机之间相互通信,就需要容器的网络模式。

Docker有5种网络模式,分别为bridge、host、none、container和user-defined,本章主要介绍这5种网络模式。

Docker网络模式简介

基于对Network Namespace的控制,Docker可以为容器创建隔离的网络环境。在隔离的网络环境下,容器具有完全独立的、与宿主机隔离的网络栈,也可以使容器共享主机或者其他容器的网络命名空间,基本满足开发者在各种场景下的需要。按Docker官方的说法,Docker容器的网络有以下几种模式:

  • bridge(默认模式):此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主机通信。
  • host:容器将不会虚拟出自己的网卡、配置自己的IP,而是直接使用宿主机的IP和端口container:创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容裂共享IP、端口范围。
  • none:该模式关闭了容器的网络功能,与宿主机、其他容器都不连通。
    安装Docker时,会自动创建三个网络(bridge、host、none)。
[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
06e024579653   bridge    bridge    local
e3950422af9c   host      host      local
dfda5ed1a176   none      null      local
[root@docker ~]# 

在使用docker run命令创建Docker容器时,可以用–net选项指定容器的网络模式,几种网络模式的指定方式如下:

  • bridge网络模式:使用-net=bridge指定,默认设置。
  • host网络模式:使用–net=host指定。
  • none网络模式:使用–net=none指定。
  • container网络模式:使用–net=container:NAME or ID指定。

bridge网络模式

bridge网络模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上,虚拟网桥会自动处理系统防火墙。bridge网络模式下容器没有公有IP,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。
在这里插入图片描述
bridge网络模式的实现步骤如下:

  • Docker守护进程利用veth pair技术,在宿主机上创建两个虚拟网络接口设备,假设为vetho和veth1,而veth pair技术的特性可以保证无论哪一个veth接收到网络报文,都会将报文传输给另一方。
  • Docker守护进程将veth0附加到Docker守护进程创建的docker0网桥上,保证宿主机的网络报文可以发往veth0。
  • Docker守护进程将veth1添加到Docker容器所属的命名空间下,并被改名为eth0.如此一来,保证了宿主机的网络报文若发往veth0,则立即会被ethO接收,实现宿主机到Docker容器网络的连通性;同时,也保证了Docker容器能单独使用eth0,实现容器网络环境的隔离性。

当Docker Server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就诵过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未被占用的IP使用。比如,一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ip addr命令可以看到docker0,可以认为它是网桥的管理端口,在宿主机上作为一块虚拟网卡使用)。

启动容器(由于是默认设置,因此这里没指定网络-net=bridge)就可以看到在容器内创建了eth0:

[root@docker ~]# docker run -it -P tomcat /bin/bash
root@aacb5bb995f4:/usr/local/tomcat# ipaddr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@aacb5bb995f4:/usr/local/tomcat# 

使用ping命令连接宿主机网络发现,容器与宿主机网络是连通的:

PING 192.168.40.21 (192.168.40.21) 56(84) bytes of data.
64 bytes from 192.168.40.21: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 192.168.40.21: icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from 192.168.40.21: icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 192.168.40.21: icmp_seq=4 ttl=64 time=0.076 ms
64 bytes from 192.168.40.21: icmp_seq=5 ttl=64 time=0.238 ms
--- 192.168.40.21 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.071/0.107/0.238/0.065 ms
root@aacb5bb995f4:/usr/local/tomcat# 

eth0是veth pair的一端,另一端(veth5032adf)连接在docker0网桥上

[root@docker ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:08:a2:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.21/24 brd 192.168.40.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe08:a240/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:07:ab:1e:06 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:7ff:feab:1e06/64 scope link 
       valid_lft forever preferred_lft forever
7: veth5032adf@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 76:06:de:e1:7e:e3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::7406:deff:fee1:7ee3/64 scope link 
       valid_lft forever preferred_lft forever
[root@docker ~]# 

bridge模式的缺陷是在该模式下Docker容器不具有一个公有IP,即和宿主机的eth0不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信的。

虽然NAT模式经过中间处理实现了这一点,但是NAT模式仍然存在问题与不便,比如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现来获取服务的外部端口,等等。另外,NAT模式由于是三层网络上的实现手段,因此肯定会影响网络的传输效率。

host网络模式

如果启动容器的时候使用host网络模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口,也没有虚拟网桥,需要关闭防火墙外网才能被访问到。

在这里插入图片描述

使用host网络模式启动容器:

[root@docker ~]# docker run -it -P --net=host tomcat /bin/bash
root@docker:/usr/local/tomcat# 

查看网络:

root@docker:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:08:a2:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.21/24 brd 192.168.40.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe08:a240/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:07:ab:1e:06 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:7ff:feab:1e06/64 scope link 
       valid_lft forever preferred_lft forever
root@docker:/usr/local/tomcat# 

none网络模式

网络环境为none,即不为Docker容器配置任何网络环境。一旦Docker容器采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。可以说none模式为Docker容器做了最少的网络设定。但是俗话说得好,“少即是多”,在没有网络配置的情况下.作为Docker开发者才能在这个基础上做其他无限多可能的网络定制开发。这也恰巧体现了Docker设计理念的开放。

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

使用–net=none模式启动容器:

[root@docker ~]# docker run -it -P --net=none tomcat /bin/bash
root@docker:/usr/local/tomcat# 

查看网络:

root@docker:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
root@docker:/usr/local/tomcat# 

container网络模式

container网络模式是bridge和host网络模式的合体,优先以bridge模式启动第一个容器,后面的所有容器启动时,均指定网络模式为container,它们均共享第一个容器的网络资源,除了网络资源外,其他资源在容器之间依然是相互隔离的。
处于container模式下的Docker容器会共享一个网络栈,使得两个容器之间可以使用localhost高效快速通信。

在这里插入图片描述
container网络模式的实现步骤如下:

  1. 查找其他容器(即需要被共享网络环境的容器)的网络命名空间。
  2. 将新创建的Docker容器(即需要共享其他网络的容器)的命名空间,使用其他容器的命名空间。

Docker容器的container网络模式可以用来更好地服务于容器间的通信。
在这种模式下,Docker容器可以通过localhost来访问命名空间下的其他容器,传输效率较高。品然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。
container网络模式的缺陷是,它并没有改善容器与宿主机以外世界通信的情况,与bridge模式一样,不能连接宿主机以外的其他设备。

user-defined网络模式

除了可以直接使用none、host、bridge、container这四种模式自动创建网络外,Docker还有一种非常重要的网络,即user-defined网络,用户可以根据业务需要创建user-defined网络。
Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。其中overlay和macvlan用于创建跨主机的网络。本节主要介绍如何创建和使用自定义的bridge网络。

1.创建自定义的bridge网络

执行如下命令通过bridge驱动创建一个类似Docker自带的bridge网络,网络名称为my_net

[root@docker ~]# docker network create --driver bridge my_net
fadc61adc807f72f61755c2d06e99ad1e8c36a7a398d690b9338cd7c2d39f163
[root@docker ~]# 

执行docker network ls命令可以看到,my_net这个自定义网络已经创建成功了:

[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
06e024579653   bridge    bridge    local
e3950422af9c   host      host      local
fadc61adc807   my_net    bridge    local
dfda5ed1a176   none      null      local
[root@docker ~]# 

使用docker network inspect命令可以查看这个网络的配置信息,下面例子中的172.22.0.0/16是Docker自动分配的IP网段:

[root@docker ~]# docker network inspect my_net
[
    {
        "Name": "my_net",
        "Id": "fadc61adc807f72f61755c2d06e99ad1e8c36a7a398d690b9338cd7c2d39f163",
        "Created": "2023-12-08T16:01:04.189552638+08: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@docker ~]# 

还可以在创建网络时通过–subnet和–gateway参数来指定IP网段:

[root@docker ~]# docker network create --driver bridge --subnet 172.22.18.0/24 --gateway 172.22.18.1 my_net2
77a453e666369f12d6cd76ae649c171be4538445c296b3ed2950e06b00659158
[root@docker ~]# 

可以看到这个新的bridge网络使用的便是我们指定的IP网段:

[root@docker ~]# docker network inspect my_net2
[
    {
        "Name": "my_net2",
        "Id": "77a453e666369f12d6cd76ae649c171be4538445c296b3ed2950e06b00659158",
        "Created": "2023-12-08T16:04:58.935626813+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.22.18.0/24",
                    "Gateway": "172.22.18.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@docker ~]# 

2.使用自定义网络

自定义网络已经创建完成,可以在容器内使用自定义网络了,在启动时通过–network指定即可:

[root@docker ~]# docker run -it --network=my_net2 centos:7 /bin/bash
[root@03895d769537 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:12:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.22.18.2/24 brd 172.22.18.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@03895d769537 /]# 

由于my_net2网络IP网段为172.22.18.0/24,因此这里可以看到容器分配到的IP为172.22.18.2

数指定一个静态IP,而不是从subnet中自动分配:

docker run -it --network=my_net2 --ip 172.22.18.7 centos:7 /bin/bash

注意:只有使用-subnet参数创建的网络才能指定静态IP。如果自定义网络创建时没有指
定–subnet,那么容器启动时指定静态IP就会报错。
可以看到容器已经使用我们指定的172.22.16.7这个IP了:

[root@docker ~]# docker run -it --network=my_net2 --ip 172.22.18.7 centos:7 /bin/bash
[root@fadd2aa8e079 /]#ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:12:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.22.18.7/24 brd 172.22.18.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@fadd2aa8e079 /]# 

高级网络配置

在自定义网络模式中,Docker提供了三种自定义网络驱动:bridge、overlay和macvlan。bridge驱动类似默认的bridge网络模式,但增加了一些新的功能;overlay和macvlan用于创建跨主机网络。建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动使用DNS解析容器名称到IP地址。下面介绍如何添加Docker的自定义网络。
使用自动分配的IP地址和网关地址,添加bridge自定义网络:

[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
06e024579653   bridge    bridge    local
e3950422af9c   host      host      local
dfda5ed1a176   none      null      local
[root@docker ~]# 

创建自定义网络模式:

[root@docker ~]# docker network create my_net1
438b3f575ef1b697053df6fb0828f8142f624584ff8637536ecfe8fb52c16864
[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
06e024579653   bridge    bridge    local
e3950422af9c   host      host      local
438b3f575ef1   my_net1   bridge    local
dfda5ed1a176   none      null      local
[root@docker ~]# 

使用docker network inspect my_net1查看bridge自定义网络(自动分配的IP地址和网关地址)的信息:

[root@docker ~]# docker network inspect my_net1
[
    {
        "Name": "my_net1",
        "Id": "438b3f575ef1b697053df6fb0828f8142f624584ff8637536ecfe8fb52c16864",
        "Created": "2023-12-08T16:38:22.648544023+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@docker ~]# 

使用自定义网络模式创建容器:

[root@docker ~]# docker run -it --name vm1 --network=my_net1 centos:7 /bin/bash
[root@76346a72fe31 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
17: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@76346a72fe31 /]# 

在自定义网桥上使用自定义的IP地址和网关地址,同一网桥上的容器是可以通信的,但必须是在自定义网桥上,默认的bridge模式不支持。使用–ip参数可以指定容器IP地址:

[root@docker ~]# [root@docker ~]# docker network create --subnet 172.22.18.0/24 --gateway 172.22.18.1 my_net2
[root@docker ~]# docker run -it --name vm2 --network=my_net2 --ip=172.22.18.6 centos:7 
[root@280a32d6a877 /]

值得注意的是:

  • Docker的bridge自定义网络之间默认是有域名解析的。
  • Docker的bridge自定义网络与系统自带的网桥之间默认是有解析的。
  • Docker的系统自带的网桥之间默认是没有解析的。
    使用自定义网桥创建容器,自定义IP地址:
[root@docker ~]# docker run -it --name vm3 --network=my_net2 --ip=172.22.18.10 centos:7 
[root@b50c5aff69b1 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:12:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.22.18.10/24 brd 172.22.18.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@b50c5aff69b1 /]# 

默认使用不同网桥的容器是不可以通信的。

[root@b50c5aff69b1 /]# ping vm3
PING vm3 (172.22.18.10) 56(84) bytes of data.
64 bytes from b50c5aff69b1 (172.22.18.10): icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from b50c5aff69b1 (172.22.18.10): icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from b50c5aff69b1 (172.22.18.10): icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from b50c5aff69b1 (172.22.18.10): icmp_seq=4 ttl=64 time=0.045 ms
^C
--- vm3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.036/0.047/0.062/0.010 ms
[root@b50c5aff69b1 /]# ping vm1 -c 3
ping: vm1: Name or service not known
[root@b50c5aff69b1 /]# 

vml使用的是my_net1网桥,vm3使用的是my_net2网桥,默认是不能通信的。要使vm1和vm3通信,可以使用docker network connect命令为vml添加一块mynet2的网卡:

[root@docker ~]# docker network connect my_net2 vm1
[root@docker ~]# docker attach vm1
[root@76346a72fe31 /]# ping vm3
PING vm3 (172.22.18.10) 56(84) bytes of data.
64 bytes from vm3.my_net2 (172.22.18.10): icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from vm3.my_net2 (172.22.18.10): icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from vm3.my_net2 (172.22.18.10): icmp_seq=3 ttl=64 time=0.100 ms
^C
--- vm3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.083/0.093/0.100/0.007 ms
[root@76346a72fe31 /]# 

重新测试发现vm1和vm3成功通信。值得注意的是:Docker的bridge自定义网络之间,双方可以随便添加对方的网卡。

  • Docker的bridge自定义网络与系统自带的网桥之间,只能是系统自带的网桥对应的容器添加bridge自定义网络对应的容器的网卡。反之则会报错。
  • Docker的系统自带的网桥之间是可以通信的,因为是在一个网络桥接上的。

docker network命令

参数说明
connect让容器连接到某个网络
create创建一个新的网络让容器使用
inspect显示一个或者多个网络的信息
ls列出所有网络
prune清除所有网络缓存
rm删除一个或者多个网络

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion AI绘画系列【21】:写实女孩--圣诞主题风

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

关于使用EB tresos出现无法激活的情况解决

EB安装完成时需要激活才能使用的&#xff0c;不然都打开或者建立不了工程&#xff0c; 我在安装eb studio时就是在激活方面有问题导致无法使用&#xff0c;下面讲解出现了什么问题以及我如何去解除的。 1.出现的错误提示&#xff1f; ERROR&#xff1a;flexActAPPActivationSe…

一套rk3588 rtsp服务器推流的 github 方案及记录 -01

我不生产代码&#xff0c;我只是代码的搬运工&#xff0c;相信我&#xff0c;看完这个文章你的图片一定能变成流媒体推出去。 诉求&#xff1a;使用opencv拉流&#xff0c;转成bgr数据&#xff0c;需要把处理后的数据&#xff08;BGR&#xff09;编码成264&#xff0c;然后推流…

xml文本转Java对象

Java对象转String public static String toData(Object object) throws Exception {JAXBContext jc JAXBContext.newInstance(object.getClass());Marshaller m jc.createMarshaller();StringWriter output new StringWriter(2048);m.marshal(object, output);String data …

算法Day23 简单吃饭(0-1背包)

简单吃饭&#xff08;0-1背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int total scanner.nextInt(…

每日一练2023.12.9—— 矩阵A乘以B【PTA】

题目链接&#xff1a;L1-048 矩阵A乘以B 题目要求&#xff1a; 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列&#xff0c;B有Rb​行、Cb​列&#xff0c;则只有Ca​与Rb​相等时&a…

AI 赋能 | 智能制造的 AI 算法开发和工程实现

谈到智能制造、智慧工厂&#xff0c;愿景是美好的&#xff0c;借助计算机视觉技术和 AI 算法&#xff0c;为自动化生产线赋予环境感知的能力&#xff0c;从而改善工艺流程&#xff0c;提高生产效率。但是&#xff0c;随着柔性化生产的需求增长&#xff0c;产线的布局调整和功能…

centos7 docker Mysql8 搭建主从

Mysql8 搭建主从 docker的安装docker-compose的安装安装mysql配置主从在master配置在slave中配置在master中创建同步用户在slave中连接 测试连接测试配置测试数据同步遇到的问题id重复错误执行事务出错&#xff0c;跳过错误my.cnf 不删除多余配置的错误可能用到的命令 docker的…

每天五分钟计算机视觉:稠密连接网络(DenseNet)

本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…

五月天“假唱”争议持续升温,歌迷期待真实音符背后的真实交代

在12月3日的夜晚&#xff0c;“五迷”们心中的星辰仿佛黯淡了几分。在社交媒体上&#xff0c;关于五月天演唱会假唱的争论愈演愈烈&#xff0c;歌迷们的心情变得异常复杂。他们愤怒&#xff0c;是因为自己的偶像受到了质疑&#xff1b;他们伤心&#xff0c;是因为可能的假唱让他…

Java基础-开发流程以及HelloWorld程序

目录 1. Java的开发流程2. HelloWorld 1. Java的开发流程 开发Java程序&#xff0c;需要三个步骤&#xff1a;编写代码&#xff0c;编译代码&#xff0c;运行代码 2. HelloWorld 编写代码 public class HelloWorld {public static void main(String[] args) {System.out.pri…

Numpy自定义功能函数 np.apply_along_axis()(第14讲)

Numpy自定义功能函数 np.apply_along_axis()(第14讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

生日备忘录(自定义排序)

题目&#xff1a; 实现简易的生日备忘录。温暖的亲情是前进的动力&#xff0c;别忘记在家人生日时送 去祝福。定义类 Member 描述家庭成员&#xff0c;每位家人有自己的姓名 name 和出生日期 birthday&#xff0c;出生日期应描 述为由 year、month、day 组成的 Date 类。在 ma…

应用商店ASO优化提升APP排名的6大策略

ASO优化基操你了解多少&#xff1f; ASO优化对于APP推广运营来说是必不可少的一个方法。在当今竞争激烈的应用程序市场中&#xff0c;ASO&#xff08;App Store Optimization&#xff09;优化已成为提升APP排名和曝光度的关键因素。 一、ASO优化的重要性 ASO优化有助于提高AP…

【每周一测】Java阶段四第三周学习

目录 1、关于分布式锁的说法&#xff0c;错误的是&#xff08; &#xff09; 2、JDK动态代理产生的代理类和委托类的关系是 3、下列关于ElasticSearch中基本概念描述错误的是 4、Spring Cloud 中&#xff0c;Feign 是什么&#xff1f; 5、在JavaScript中&#xff0c;可以使…

Esxi7Esxi8设置VMFSL虚拟闪存的大小

Esxi7Esxi8设置VMFSL虚拟闪存的大小 ESXi7,8 默认安装会分配一个 VMFSL(VMFS-L)(Local VMFS)很大空间(120G), 感觉很浪费, 实际给 8G 就可以了, 最少 6G , 经实验,给2G没法安装 . Esxi7是虚拟闪存的 修改的方法是: 在安装时修改 设置 autoPartitionOSDataSize8192 在cdromBoo…

UI自动化测试框架:PO 模式+数据驱动

1、PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 PO 模式的设计思想与…

leetcode 1466

leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线&#xff0c;都需要修改&#xff0c;反之&#xff0c;如果是通向0的节点&#xff0c;例如节点4&#xff0c;则把节点4当作父节点的节点&…

【优选算法系列】【专题二滑动窗口】第四节.30. 串联所有单词的子串和76. 最小覆盖子串

文章目录 前言一、串联所有单词的子串 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、最小覆盖子串 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

【外观模式】SpringBoot集成mail发送邮件

前言 发送邮件功能&#xff0c;借鉴 刚果商城&#xff0c;根据文档及项目代码实现。整理总结便有了此文&#xff0c;文章有不对的点&#xff0c;请联系博主指出&#xff0c;请多多点赞收藏&#xff0c;您的支持是我最大的动力~ 发送邮件功能主要借助 mail、freemarker以及rocke…