玩转Docker(五):网络

文章目录

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:发送数据包的统计信息。

这几个网络接口在系统中有不同的作用:

  1. docker0:这是Docker容器的默认网桥接口,用于连接Docker容器和宿主机的网络。Docker容器可以通过这个接口与外部网络通信。

  2. enp1s0:这是一个物理网卡接口,通常用于连接宿主机到局域网或互联网。这个接口可能连接到路由器、交换机或者其他网络设备,用于宿主机的外部通信。

  3. lo:这是本地回环接口,用于本地主机内部的通信。它通常用于本地主机上的进程之间的通信,例如用于访问本地主机上的服务或应用程序。

  4. veth3b12615:这是一个虚拟以太网接口,通常与容器相关联,用于容器内部的通信和与宿主机的通信。

  5. 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"网络模式的特点包括:

  1. 默认网络模式:当用户不指定网络模式时,Docker容器会默认采用"bridge"网络模式。

  2. 容器间通信:在同一个"bridge"网络中的容器可以通过其分配的IP地址相互通信,就像在同一个局域网中的设备一样。

  3. 与宿主机通信:容器可以与宿主机进行通信,宿主机可以通过容器的IP地址访问容器内的服务。

  4. 网络地址转换(NAT):"docker0"网桥会对容器的出站流量进行网络地址转换,使得容器可以通过宿主机的IP地址访问外部网络。

  5. 连接外部网络:"bridge"网络模式允许容器连接到宿主机所在的物理网络,从而可以与外部网络通信。

"bridge"网络模式是最常用的Docker网络模式之一,它提供了良好的隔离性和灵活性,使得容器可以方便地进行网络通信,并且可以连接到外部网络。这使得"bridge"网络模式适用于大多数应用场景,特别是那些需要容器之间通信或者容器与外部网络通信的场景。

一个问题:为什么在主机上仍可以通过localhost:port访问到容器中的服务?

在Docker中,默认情况下,容器会使用桥接网络模式,这意味着容器内部的服务可以通过容器的IP地址和端口进行访问。然而,当容器运行在默认的桥接网络模式下时,Docker会在宿主机上设置一些网络规则,使得容器内的服务可以通过宿主机的IP地址和端口进行访问。

这就解释了为什么可以在容器外部通过localhost访问Elasticsearch容器。当你在宿主机上通过localhost访问9200端口时,Docker会将这个请求转发到运行Elasticsearch容器的宿主机上,然后再转发到Elasticsearch容器内部的9200端口。这种转发是由Docker的网络规则和端口映射机制来实现的。

四、user-defined网络

Docker的用户自定义(user-defined)网络是一种高度灵活的网络模式,允许用户创建自己定义的网络,以满足特定的应用需求。用户自定义网络提供了更多的控制权和定制化选项,使得容器可以在一个独立的、自定义的网络环境中进行通信。

以下是用户自定义网络的一些关键特点:

  1. 自定义网络名称:用户可以为自定义网络指定一个名称,以便更好地识别和管理网络。

  2. 隔离性:每个用户自定义网络都是独立的,容器只能在同一个自定义网络中进行通信,无法直接与其他网络中的容器通信,从而提供了更好的隔离性。

  3. 自定义子网:用户可以为自定义网络指定自己的子网,从而更好地控制IP地址的分配和管理。

  4. 自定义网关:用户可以为自定义网络指定网关地址,使得容器可以通过网关进行通信,同时也可以连接到外部网络。

  5. 连接到多个网络:容器可以连接到多个用户自定义网络,从而实现不同网络环境中的通信。

  6. 跨主机通信:用户自定义网络可以跨多个Docker主机进行通信,这使得容器可以在分布式环境中进行跨主机的通信。

用户自定义网络适用于复杂的应用场景,特别是那些需要更高度定制化网络环境的场景。例如,当需要将多个容器组织成一个应用服务,并且这些容器需要在一个独立的网络环境中进行通信时,用户自定义网络就显得非常有用。

总的来说,用户自定义网络提供了更多的网络定制选项和更好的隔禽性,使得容器可以在更灵活和定制化的网络环境中进行通信,从而满足了更多复杂应用场景下的网络需求。

一般来说掌握前三种就能应付一般使用场景了,因此user-defined网络具体怎么配置请自行上网学习。

相关推荐
sunfove1 小时前
光网络的立交桥:光开关 (Optical Switch) 原理与主流技术解析
网络
唯情于酒2 小时前
Docker学习
学习·docker·容器
喵叔哟2 小时前
20.部署与运维
运维·docker·容器·.net
Kevin Wang7274 小时前
欧拉系统服务部署注意事项
网络·windows
min1811234564 小时前
深度伪造内容的检测与溯源技术
大数据·网络·人工智能
汤愈韬4 小时前
Full Cone Nat
网络·网络协议·网络安全·security·huawei
zbtlink5 小时前
现在还需要带电池的路由器吗?是用来干嘛的?
网络·智能路由器
桌面运维家5 小时前
vDisk配置漂移怎么办?VOI/IDV架构故障快速修复
网络·架构
dalerkd5 小时前
忙里偷闲叙-谈谈最近两年
网络·安全·web安全
德育处主任5 小时前
『NAS』在群晖部署一个文件加密工具-hat.sh
前端·算法·docker