在容器化技术中,Docker 提供了一个强大的网络功能,让容器能够高效、灵活地进行通信。
Docker 网络(Docker Networking)是 Docker 容器与外部世界、以及容器之间进行数据交换的基础设施。Docker 网络使得容器能够共享主机网络、通过端口映射与外部系统通信,甚至可以创建隔离的网络环境来提高安全性。
Docker 支持多种网络模式,允许用户根据具体需求选择最合适的网络结构。Docker 提供了四种主要的网络模式 bridge(桥接网络)、host(主机网络)、none(无网络)和container(容器共享网络)。每种模式都有其独特的特性和适用场景,接下来,我们将详细讲解这四种网络模式,帮助你理解它们的工作原理、优缺点以及使用方法。
首先是bridge模式,这是docker默认的网络模式。
使用docker创建一个bridge 模式的容器命令格式如下:
docker run -it -p 8080:80 docker-test
-p 8080:80
表示将容器的80端口映射到主机的8080端口。
bridge 模式称为网桥模式,首先 Docker 会在主机上创建一个名为 docker0 的虚拟网桥,每当创建一个新的容器时,容器都会通过 docker0 与主机的网络连接,docker0 相当于网桥。
在docker run 命令中之后,执行 ifconfig 命令,可以看到 docker0 网卡的 IP 地址。
docker0: flags=4163 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:a5ff:fe8e:31f1 prefixlen 64 scopeid 0x20
ether 02:42:a5:8e:31:f1 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
使用 bridge 模式新创建的容器,其内部都有一个虚拟网卡,名为 eth0,容器之间可以通过 172.17.x.x 相互访问。
我们可以通过docker exec -it
进入容器,使用 ifconfig
命令可以看到 容器 的 IP 地址。
在bridge模式中,容器之间可以直接通过 IP 地址相互访问,但是容器与外部的连接需要通过端口映射(如-p 8080:80
)来完成。
bridge模式的网络架构如下图所示:
+------------------+ +------------------+
| Container 1 | | Container 2 |
| IP: 172.17.0.2 | | IP: 172.17.0.3 |
+------------------+ +------------------+
| |
+------------------------+
|
Docker Bridge(docker0)
IP : 172.17.0.1
|
+-----------------+
| Host OS |
+-----------------+
bridge 模式
优点:
缺点
在host模式下,容器直接使用主机的网络栈。容器不会拥有自己的 IP 地址,而是和主机共享相同的网络接口。使用这种模式时,容器内的应用可以直接使用主机的 IP 地址,这对于需要极高网络性能的应用(例如高吞吐量网络应用)会有帮助,但会导致端口冲突的问题。
host 模式的网络架构如下图所示:
+--------------------+
| Host OS |
+--------------------+
| |
| |
+------v---------v----------+
| Container 1 IP: Host IP |
+---------------------------+
host的模式的创建方法:docker run -it --net=host docker-test
。通过--net=host
参数来指定容器使用主机网络。可以在容器内通过ifconfig
命令查看到主机的IP地址。
host 模式的优缺点:
优点
缺点
在 None 模式下,容器没有任何网络接口。这种模式通常用于隔离性较强的场景,比如需要完全控制网络环境或者使用其他特殊网络插件的场景。None 模式的容器默认只有 lo
回环接口,而没有外部网络连接。
none 模式的网络架构如下图所示:
+-----------------+
| Container 1 |
| (No Network) |
+-----------------+
none的模式的创建方法: docker run -it --net=none docker-test
。通过--net=none
参数来指定容器使用无网络。
none 模式的优缺点:
优点
缺点
在 container 模式下,多个容器共享同一个网络栈。通常,先启动一个基础容器(比如容器 A),并为它配置网络(例如使用默认的 bridge 模式)。随后启动的其他容器(如容器 B、C、D 等)可以通过 --network container:
参数连接到容器 A 的网络环境,从而共享容器 A 的网络栈。
在这种模式下,所有连接到同一网络栈的容器共享相同的 IP 地址和端口空间。因此,容器 B、C 和 D 将无法拥有自己的独立 IP 地址或端口,它们会与容器 A 共用相同的 IP 和端口。这意味着容器之间可以直接通过 localhost 或者 127.0.0.1 进行通信,类似于运行在同一主机上的多个进程。
以下是 container 模式的网络架构图:
+------------------------+
| Host OS |
+------------------------+
|
+-------v--------+
| Container A | <-- 网络栈:IP 172.17.0.2
| (Bridge) |
+----------------+
|
+-------v--------+
| Container B | <-- 共享网络:IP 172.17.0.2
+----------------+
|
+-------v--------+
| Container C | <-- 共享网络:IP 172.17.0.2
+----------------+
|
+-------v--------+
| Container D | <-- 共享网络:IP 172.17.0.2
+----------------+
container 模式的优缺点:
优点
Container、Bridge、Host、None 四种网络模式,是 Docker 网络的四种主要模式。每种模式都有其独特的特性和适用场景,在不同的场景下选择不同的模式,可以帮助我们更好地管理容器的网络环境。
参考资料:了解docker网络
创作不易,转载请注明出处