文章目录
Docker安装时会自动在host上创建三个网络,我们可用docker network ls
命令查看:
powershell
docker network ls
那么这几种网络分别有什么含义呢?在回答这个问题之前我们先来看一下操作系统的网络,我以centos为例。
〇、关于linux系统网络
试着在命令行执行ifconfig命令,将会得到以下内容:
powershell
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:21ff:fefb:4431 prefixlen 64 scopeid 0x20<link>
ether 02:42:21:fb:44:31 txqueuelen 0 (Ethernet)
RX packets 53849 bytes 3534921 (3.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 63701 bytes 184086739 (175.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.49.247 netmask 255.255.252.0 broadcast 172.16.51.255
inet6 fe80::aa51:27e1:5169:a261 prefixlen 64 scopeid 0x20<link>
ether 64:4e:d7:6c:24:96 txqueuelen 1000 (Ethernet)
RX packets 1044081 bytes 409992381 (390.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1037423 bytes 347334338 (331.2 MiB)
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 166076 bytes 120668074 (115.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 166076 bytes 120668074 (115.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth3b12615: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::4c73:e7ff:fea1:c72b prefixlen 64 scopeid 0x20<link>
ether 4e:73:e7:a1:c7:2b txqueuelen 0 (Ethernet)
RX packets 3610 bytes 252701 (246.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6240 bytes 87300874 (83.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:19:28:58 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这些信息描述了各个网络接口的配置和统计信息,包括接口类型、标志、IP地址、子网掩码、广播地址、物理地址以及数据包的接收和发送情况。
powershell
1. docker0:
- flags=4163<UP,BROADCAST,RUNNING,MULTICAST>:这些是网络接口的标志,表明该接口是启用的(UP)、支持广播(BROADCAST)、正在运行(RUNNING)和支持多播(MULTICAST)。
- inet 172.17.0.1:这是接口的IPv4地址。
- netmask 255.255.0.0:这是接口的子网掩码。
- broadcast 172.17.255.255:这是接口的广播地址。
- ether 02:42:21:fb:44:31:这是接口的物理地址(MAC地址)。
- RX packets 53849 / bytes 3534921:这是接收数据包的统计信息。
- TX packets 63701 / bytes 184086739:这是发送数据包的统计信息。
2. enp1s0:
- flags=4163<UP,BROADCAST,RUNNING,MULTICAST>:同样是网络接口的标志。
- inet 172.16.49.247:IPv4地址。
- netmask 255.255.252.0:子网掩码。
- broadcast 172.16.51.255:广播地址。
- ether 64:4e:d7:6c:24:96:物理地址(MAC地址)。
- RX packets 1044081 / bytes 409992381:接收数据包的统计信息。
- TX packets 1037423 / bytes 347334338:发送数据包的统计信息。
3. lo:
- flags=73<UP,LOOPBACK,RUNNING>:同样是网络接口的标志。
- inet 127.0.0.1:这是本地回环接口的IPv4地址。
- netmask 255.0.0.0:子网掩码。
- inet6 ::1:这是本地回环接口的IPv6地址。
- RX packets 166076 / bytes 120668074:接收数据包的统计信息。
- TX packets 166076 / bytes 120668074:发送数据包的统计信息。
4. veth3b12615:
- flags=4163<UP,BROADCAST,RUNNING,MULTICAST>:同样是网络接口的标志。
- inet6 fe80::4c73:e7ff:fea1:c72b:这是接口的IPv6地址。
- ether 4e:73:e7:a1:c7:2b:物理地址(MAC地址)。
- RX packets 3610 / bytes 252701:接收数据包的统计信息。
- TX packets 6240 / bytes 87300874:发送数据包的统计信息。
5. virbr0:
- flags=4099<UP,BROADCAST,MULTICAST>:同样是网络接口的标志。
- inet 192.168.122.1:IPv4地址。
- netmask 255.255.255.0:子网掩码。
- broadcast 192.168.122.255:广播地址。
- ether 52:54:00:19:28:58:物理地址(MAC地址)。
- RX packets 0 / bytes 0:接收数据包的统计信息。
- TX packets 0 / bytes 0:发送数据包的统计信息。
这几个网络接口在系统中有不同的作用:
-
docker0:这是Docker容器的默认网桥接口,用于连接Docker容器和宿主机的网络。Docker容器可以通过这个接口与外部网络通信。
-
enp1s0:这是一个物理网卡接口,通常用于连接宿主机到局域网或互联网。这个接口可能连接到路由器、交换机或者其他网络设备,用于宿主机的外部通信。
-
lo:这是本地回环接口,用于本地主机内部的通信。它通常用于本地主机上的进程之间的通信,例如用于访问本地主机上的服务或应用程序。
-
veth3b12615:这是一个虚拟以太网接口,通常与容器相关联,用于容器内部的通信和与宿主机的通信。
-
virbr0:这是用于虚拟化的桥接接口,通常与虚拟机相关联,用于虚拟机与宿主机的通信以及虚拟机之间的通信。
每个接口都有其特定的作用和用途,用于支持不同类型的网络通信需求,包括容器通信、物理网络通信、本地主机通信以及虚拟化环境中的通信。
开篇说了,docker自带none、host、bridge这三种网络,下面就来看看每种网络的具体含义。
一、none网络
Docker的"none"网络是一种特殊的网络模式,它允许容器在一个完全隔离的网络环境中运行,即容器内部没有网络连接。在"none"网络模式下,容器内部的网络栈被禁用,这意味着容器内部无法进行网络通信,也无法访问外部网络或被外部网络访问。
"none"网络模式通常用于那些不需要网络连接的容器,例如一些系统级的容器或者一些特殊用途的容器。在这种模式下,容器内部的进程只能与宿主机进行通信,无法直接与外部网络通信。
使用"none"网络模式可以提供更高的安全性,因为容器内部无法直接访问外部网络,从而减少了潜在的安全风险。同时,这也使得"none"网络模式适用于一些特殊的网络测试场景,或者需要完全隔离的应用场景。
总的来说,"none"网络模式提供了一种高度隔离的网络环境,适用于一些特殊的容器使用场景,但需要注意的是,在这种模式下容器内部的网络通信能力会受到限制。
二、host网络
连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。可以通过 --network=host指定使用host网络。
在容器中可以看到host的所有网卡,并且连hostname也是host的。
直接使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。
三、bridge网络
Docker安装时会创建一个命名为docker0的Linux bridge。如果不指定--network,创建的容器默认都会挂到docker0上。
Docker的"bridge"网络是一种默认的网络模式,它允许容器在一个虚拟的桥接网络上进行通信。当Docker引擎启动时,默认会创建一个名为"docker0"的虚拟网桥,这个网桥充当了容器连接到宿主机物理网络的桥梁。
在"bridge"网络模式下,每个容器都会被分配一个唯一的IP地址,并且可以通过"docker0"网桥与其他容器或者宿主机进行通信。此外,Docker还会为每个容器创建一个虚拟的以太网接口(veth pair),其中一个端口连接到容器内部的网络命名空间,另一个端口连接到"docker0"网桥上。
"bridge"网络模式的特点包括:
-
默认网络模式:当用户不指定网络模式时,Docker容器会默认采用"bridge"网络模式。
-
容器间通信:在同一个"bridge"网络中的容器可以通过其分配的IP地址相互通信,就像在同一个局域网中的设备一样。
-
与宿主机通信:容器可以与宿主机进行通信,宿主机可以通过容器的IP地址访问容器内的服务。
-
网络地址转换(NAT):"docker0"网桥会对容器的出站流量进行网络地址转换,使得容器可以通过宿主机的IP地址访问外部网络。
-
连接外部网络:"bridge"网络模式允许容器连接到宿主机所在的物理网络,从而可以与外部网络通信。
"bridge"网络模式是最常用的Docker网络模式之一,它提供了良好的隔离性和灵活性,使得容器可以方便地进行网络通信,并且可以连接到外部网络。这使得"bridge"网络模式适用于大多数应用场景,特别是那些需要容器之间通信或者容器与外部网络通信的场景。
一个问题:为什么在主机上仍可以通过localhost:port访问到容器中的服务?
在Docker中,默认情况下,容器会使用桥接网络模式,这意味着容器内部的服务可以通过容器的IP地址和端口进行访问。然而,当容器运行在默认的桥接网络模式下时,Docker会在宿主机上设置一些网络规则,使得容器内的服务可以通过宿主机的IP地址和端口进行访问。
这就解释了为什么可以在容器外部通过localhost访问Elasticsearch容器。当你在宿主机上通过localhost访问9200端口时,Docker会将这个请求转发到运行Elasticsearch容器的宿主机上,然后再转发到Elasticsearch容器内部的9200端口。这种转发是由Docker的网络规则和端口映射机制来实现的。
四、user-defined网络
Docker的用户自定义(user-defined)网络是一种高度灵活的网络模式,允许用户创建自己定义的网络,以满足特定的应用需求。用户自定义网络提供了更多的控制权和定制化选项,使得容器可以在一个独立的、自定义的网络环境中进行通信。
以下是用户自定义网络的一些关键特点:
-
自定义网络名称:用户可以为自定义网络指定一个名称,以便更好地识别和管理网络。
-
隔离性:每个用户自定义网络都是独立的,容器只能在同一个自定义网络中进行通信,无法直接与其他网络中的容器通信,从而提供了更好的隔离性。
-
自定义子网:用户可以为自定义网络指定自己的子网,从而更好地控制IP地址的分配和管理。
-
自定义网关:用户可以为自定义网络指定网关地址,使得容器可以通过网关进行通信,同时也可以连接到外部网络。
-
连接到多个网络:容器可以连接到多个用户自定义网络,从而实现不同网络环境中的通信。
-
跨主机通信:用户自定义网络可以跨多个Docker主机进行通信,这使得容器可以在分布式环境中进行跨主机的通信。
用户自定义网络适用于复杂的应用场景,特别是那些需要更高度定制化网络环境的场景。例如,当需要将多个容器组织成一个应用服务,并且这些容器需要在一个独立的网络环境中进行通信时,用户自定义网络就显得非常有用。
总的来说,用户自定义网络提供了更多的网络定制选项和更好的隔禽性,使得容器可以在更灵活和定制化的网络环境中进行通信,从而满足了更多复杂应用场景下的网络需求。
一般来说掌握前三种就能应付一般使用场景了,因此user-defined网络具体怎么配置请自行上网学习。