自定义网络配置讲解与实操
docker中的容器有独立的隔离空间,那么,它们能不能通过网络相互访问呢?
答案是可以的!作者在之前Redis篇中使用docker配置了主从、cluster集群,当时的做法是利用每个容器的ip地址和端口创建相应的配置文件,再使用配置文件和其他连接操作去构建集群。无论是主从集群中的主节点和从节点,还是cluster集群的各个节点,它们都可以做到网络连接与访问,如果不能连接那集群节点之间肯定就无法通信了。
这种默认的,通过docker自动分配ip地址作为网络节点的方式,就是创建docker时自带的网络通讯功能:
docker0
是Docker的默认虚拟网桥。当你安装Docker并启动它时,它会自动创建docker0
网桥。该网桥允许运行在Docker容器中的进程与主机或其他容器通信。
网桥(Bridge):
docker0
首先是一个网桥。它连接了容器网络与主机网络,使容器可以与主机和其他容器通信。网段(Subnet):默认情况下,
docker0
有一个与之关联的子网。通常,这个子网是172.17.0.0/16
。这意味着docker0
可以分配在此范围内的IP地址给容器。网关(Gateway):在这个子网内,
docker0
的IP地址通常是172.17.0.1
,并且它通常被用作该子网内的默认网关。这意味着,当容器要与外部网络通信时,它们的流量会首先经过这个地址。如果有读者不了解这三个概念,本文在后面会有补充知识的讲解哦!
当我们日常让容器连接docker0时,需要通过各个容器的ip地址进行访问连接。这是docker0默认的约束,必须通过docker0为你分配ip,再通过ip进行网络连接,我们以某两个位于docker0的容器为例:
ping 后加这个容器的ip地址,结果表明成功访问!
但是有一点,这一点也在作者之前配置redis的时候遇到过,就是:容器的开启顺序决定了docker为容器分配的ip地址,先启动的容器ip地址越“小”。
如果使用docker0所在子网作为默认的网段,首先一点:通过ip地址进行网络连接非常麻烦,需要通过docker inspect所有容器的ip,再通过ip连接。
第二点是:如果开启容器的顺序改变(比如增删容器、测试部分容器),其ip地址也会根据顺序改变,而原本配置写死的ip地址很有可能需要重新再配置,并且一直存在这样的隐患。
所以,通过ip地址连接网络的方法看起来不太行。为此,可以利用docker自定义网络解决这个问题!一旦创建自定义网络,就会生成新的网桥,加入自定义后的网桥可以通过容器名称互相访问!
无论容器重启多少次,它的容器名称是不会改变的,所以,这种自定义网络解决了原本docker0根据ip地址分配网络存在的根本问题!下面是创建自定义网络的例子:
创建网络后,可以通过ip addr指令查看网卡(不了解概念的不要着急,后面也有介绍):
最后一段表示新的自定义网桥出现了!再通过“docker network connect 网络名 容器名”将现有容器添加到该网络。添加之后,可以通过 “docker inspect 容器名” 查看容器所在的网络:
以mysql为例,发现除了默认docker0的bridge网络,它还处于刚刚自定义的网络中。对于还未创建的容器,我们可以在其创建语句中表明其网络 “--network 网络名” ,例子如下:
docker run -d --name demo -p 8080:8080 --network heima docker-demo
这样创建容器之后,该容器就不会存在于docker0网桥中,和java的构造方法类似。只要你先前定义好了容器的网络,默认的docker0网桥就不会再考虑为这个容器提供网络:
当我们进入demo容器后,利用容器名mysql验证二者网络是否连接:
结果表明,同处一个自定义网络heima中的demo和mysql容器可以只通过容器名进行网络访问!对于demo容器,由于其创建时指定了自定义网络,所以会与默认的docker0网桥失去联系,就不能再使用其他容器的ip地址进行网络连接了。但是,学会自定义网络后,基本也不会去通过ip连接网络。
网桥、网关、网段、网卡
网桥 (Bridge)
网桥主要用于连接同一种类型的网络,并使它们在数据链路层(第2层)上表现为一个网络。
例子:假设你有一个大楼,这个大楼有很多办公室。每个办公室都有自己的局域网(LAN)。为了让所有办公室内的设备都能彼此通信,大楼管理员为大楼安装了一个中央交换机或网桥。所有办公室都连接到这个中央交换机,从而能够互相通信。
Docker:docker0
可以被视为这个“大楼”。当你启动一个Docker容器,可以想象它就像是大楼里的一个“办公室”。所有这些“办公室”(容器)都通过docker0
网桥(“大楼”)连接在一起,所以它们可以彼此通信。
网关 (Gateway)
功能:网关是一个网络与另一个网络之间的接口。它在网络层(第3层)上工作,并将不同网络或不同协议的数据包进行转换和路由。
工作原理:它可以转换数据格式、通信协议等,使两个不同的网络能够进行通信。
使用场景:常见的例子是家庭路由器,它充当了家庭内部局域网和互联网之间的网关,另外在企业中连接内部网络和外部网络的设备也经常被称为网关。
例子:现在想象一下,大楼的人们希望与外部的互联网通信。为此,他们需要一个设备来转发他们的流量,并在必要时进行必要的协议和地址转换。这个设备就是网关。所有从局域网到互联网的流量都会经过这个网关。当我们提及"网关"在计算机网络的上下文中,网关通常指的是一个IP地址,该地址允许你的网络设备访问其他网络。
Docker:docker0
网桥除了允许容器之间的通信外,还有一个其他重要的功能:docker0
的IP地址(通常是172.17.0.1
)充当容器与主机或外部网络之间的默认网关。这意味着,当容器想要与外部世界通信时,它们会将流量发送到docker0
的这个地址,并由主机进一步处理和转发。
让我们看一个更为具体的例子,并解释其意义。
小型网关举例
假设你的电脑在家中的局域网内,它的IP地址可能是
192.168.1.100
。当你查看电脑的网络配置时,可能会看到这样一个默认网关的地址:192.168.1.1
。这个
192.168.1.1
就是你家中路由器的内部IP地址。所有从你的电脑发出并准备传输到互联网的数据都会首先发送到这个地址。简而言之,这个网关地址是你的电脑与外部世界通信的桥梁。
解释
内部通信:如果你的电脑想要与同一个局域网内的另一台电脑通信(例如,另一台电脑的IP地址是
192.168.1.101
),数据直接在这两台电脑之间传输,不需要经过网关。外部通信:但是,如果你的电脑想要访问一个外部的网站,例如
google.com
,这个请求会被发送到你的默认网关,也就是192.168.1.1
。接着,你家的路由器会处理这个请求,并将其转发到互联网。返回的数据:当
google.com
回应你的请求,数据首先被发送到你家的路由器(因为对于外部网络来说,它只认识你家的公共IP地址,不知道你家里的私有IP地址)。然后,路由器查看这个返回的数据,并通过内部的地址(如192.168.1.100
)将数据转发给正确的设备,也就是你的电脑。为什么需要网关:没有网关,你的电脑或其他设备就无法知道如何将数据发送到外部网络。网关为你的设备提供了一个出口,使其可以与外部世界通信。
大型网关举例
在大型网络环境中,尤其是企业级或数据中心网络,网关不再是简单的家庭路由器那样的设备。大型网络的网关通常由一系列高级、高性能的设备组成,具有更高级的功能、更高的吞吐量、更强大的处理能力和更高的可靠性。
以下是构成这些大型网络网关的一些常见组件和特性:
高性能路由器:大型网络中的网关通常是高性能的路由器,它们可以处理大量的并发连接和高速数据流量。
防火墙设备:这些设备专门用于检查、过滤和控制进出的数据流,确保网络的安全。
负载均衡器:在大型网络环境中,为了提供高可用性和性能,可能会使用负载均衡器来分配到达的流量,确保每个服务器或服务都得到均衡的工作量。
VPN设备:对于需要安全远程访问的企业,VPN(虚拟专用网络)网关是必不可少的,它们提供了一个加密的隧道,使远程工作者可以安全地连接到企业网络。
冗余和故障转移:为了提供高可用性,大型网络的网关通常具有冗余配置。这意味着如果一个设备出现故障,另一个设备可以立即接管,确保网络的持续运行。
高级路由和QoS功能:大型网络中的路由器和网关通常具有高级的路由功能,如BGP、OSPF等,以及质量服务(QoS)功能,确保优先处理关键数据。
网络安全功能:除了基本的防火墙功能外,大型网络的网关可能还具有入侵检测和预防系统(IDS/IPS)、应用层过滤、内容过滤、恶意软件检测等安全功能。
深度数据包检查:一些高级的网关设备可以进行深度数据包检查,对流经的数据进行深入分析,以提供更高级的安全和策略执行。
简而言之,网关(通常是你家中路由器的IP地址)是连接你的内部网络和外部网络(例如,互联网)的桥梁。当你的设备需要与外部网络通信时,它会将数据发送到网关,然后由网关处理后续的通信。
网桥与网关的区别
工作层次:网桥在数据链路层工作,而网关在网络层工作,甚至可能涉及更高的层次。你可以理解为网桥是更加基础的网络设备,没有网桥,网络内部就无法通信。
功能:网桥主要用于扩展或隔离网络段,而网关用于连接两个不同的网络或协议。
复杂性:相对而言,网关的功能通常更加复杂,因为它需要处理不同网络或协议之间的转换。
网段
网段(Subnet)指的是一个具有相同网络前缀的IP地址块。这些IP地址在网络上是连续的,并共享同一个网络ID。例如,对于IPv4,
192.168.1.0/24
表示的是一个包含256个IP地址(从192.168.1.0
到192.168.1.255
)的网段。
其中,/24表示ip前24位是固定不变的。对于IPv4,每一个小段的范围都是0~255,故都需要八位表示。前24位不变,则对应192.168.1.这三个小段不变。
默认情况下,
docker0
有一个与之关联的子网。通常,这个子网是172.17.0.0/16
。这意味着docker0
可以分配在此范围内的IP地址给容器。该子网就是docker0下的网段。
所以可得出结论:网关和内部网络的设备都位于同一个网段内。例如,如果你的设备IP地址是192.168.1.100
,而默认网关是192.168.1.1
,那么它们都在192.168.1.x
的网段内。
通常,家庭或小型办公网络的路由器不仅作为网络的网关,还充当DHCP服务器的角色,为连接到网络的设备动态分配IP地址,确保这些地址都在同一个网段内。
网卡与网络接口
网卡(Network Interface Card,简称 NIC)是一个硬件组件,允许计算机或其他设备与网络连接。它为设备提供了一个物理的、通常是有线的接口,以便与局域网(如 Ethernet)或广域网(如 Internet)连接。现代计算机通常内置了网卡,但也有外部的 USB 或 PCIe 接口的网卡。
1. 实际的网卡例子
如果你查看一个台式机或服务器的背部,你可能会看到一个 RJ-45 接口,它是用于 Ethernet 连接的。这个接口是网卡的一部分。当你用 Ethernet 网线连接这个接口和路由器或交换机时,你的计算机就可以与网络通信了。
在软件层面,操作系统也会为这个物理网卡提供一个软件接口,通常被称为网络接口或网络适配器。例如,在 Linux 系统中,这个接口可能被命名为 eth0
、ens33
等。
2. docker0与网络接口
docker0
是一个虚拟网桥,同时它也是一个网络接口。在 Linux 系统中,所有的网络连接,无论是物理的还是虚拟的,都通过网络接口来表示。
所以,当我们说
docker0
是一个网络接口时,我们是指它在操作系统中的表示形式。但在功能上,docker0
同时也具备网桥的特性,它可以连接多个 Docker 容器的虚拟网络接口,并允许这些接口进行内部通信。也就是说,docker0是一个网络接口,同时它也可以连接其他容器的网络接口,并且让它们互相通信,所以docker0也同时是一个网桥。
3. 容器与外界通信的流程
当容器想要与外部世界通信时,它们的流量从容器内部出发,经过这些容器的虚拟网络接口,然后通过
docker0
虚拟网桥,到达docker0
的默认网关地址。最后,流量从宿主机的默认网关进入外部网络,例如互联网。
4. ens33
ens33
通常是一个物理网卡的网络接口,在某些 Linux 分发版中采用这种命名规则。它不是一个网桥。它表示的是一个物理网卡或虚拟机的虚拟网卡与网络之间的连接。
5. 区分网络接口和网桥
网络接口:这是一个更为通用的术语,代表任何形式的网络连接,无论是物理的(如
ens33
)还是虚拟的(如 Docker 或 VM 中的虚拟网卡)。在 Linux 中,你可以使用ip addr
或ifconfig
命令来查看所有的网络接口。可以用于检查服务器的网络ip或者本文讲述的自定义网络。网桥:网桥是一种特殊的网络接口,它的主要功能是连接多个网络接口,并在它们之间转发数据。在功能上,网桥工作在数据链路层,并根据 MAC 地址来转发数据。在 Linux 中,你可以使用
brctl show
命令(需要安装 bridge-utils)来查看所有的网桥。
总之,所有的网桥都是网络接口,但并非所有的网络接口都是网桥。网卡是设备与网络之间的物理接口,而网桥(物理的或虚拟的)则是用来连接、过滤和转发同一种类型的网络的设备或软件。在 Docker 的场景中,docker0
是一个虚拟的网桥,它背后连接了多个容器的虚拟网络接口。