Docker 主机网络 vs 桥接网络

dockeroperating systemopen source更新于 2026/1/5 23:07:17

Docker 网络有两种类型的单主机网络 - "主机" 和 "桥接" 网络。单主机网络意味着它们的作用域仅限于每个主机。

对于主机网络,特定的 Docker 容器可以直接使用主机的网络发送和接收数据包。对于桥接网络,它需要端口映射才能进行通信。

为了更好地理解它们,让我们借助主机网络创建一个 nginx 容器。在创建 nginx 容器之前,让我们列出所有可用的网络。

sudo docker network ls

您将找到一个名为 host 的网络,驱动程序名称为 host,作用域为 local。尝试使用以下命令检查该网络。

sudo docker network inspect host

您将获得一个包含所有网络详细信息的 JSON 列表。请注意,Containers 对象初始为空。

现在我们将创建一个包含 host 网络的 nginx Docker 容器。

sudo docker container run −d −−network host −−name nginx01 nginx−alpine

使用 host 网络时,我们无需指定端口映射,因为 host 网络驱动程序会自动使用"eth0"端口。在 Linux/Unix 系统上运行时。

使用以下命令获取容器 ID。

sudo docker inspect <container−id>

在浏览器中复制此 IP 地址,即可验证 nginx 容器是否成功运行。

要检查主机网络是否使用端口映射,请列出容器以获取端口详细信息。

sudo docker container ls

您会发现 nginx 容器的端口列表为空。

现在,使用以下命令检查主机网络。

sudo network inspect host

您会发现容器列表中现在包含了 nginx 容器的详细信息。这验证了 nginx 容器现在正在主机网络上运行。

现在,让我们使用网桥驱动程序(不带端口映射)创建另一个 nginx 容器。

sudo docker run −d −−network bridge −−name nginx02 nginx−alpine

现在,执行 docker list 命令获取容器的详细信息。

sudo docker container ls

您会发现在 nginx02 容器的 ports 部分中,有一个端口号以及列出的协议。由于我们在使用桥接网络驱动程序创建容器时未指定端口映射,因此您将无法通过本地计算机访问它。为了验证这一点,请尝试通过浏览器粘贴容器的 IP 地址来访问它。

sudo docker inspect <container−id>

将 IP 地址复制到浏览器,你会发现浏览器报错,因为我们没有指定端口映射。

现在,我们将停止并删除 nginx02 容器,然后创建另一个容器,但这次要指定端口映射。

sudo docker stop nginx02

sudo docker container rm nginx02

删除 nginx 容器后,创建另一个网络,最好使用相同的名称,但使用端口映射和网桥网络驱动程序。

sudo docker container run −d −−network bridge −−name nginx02 −p 80:80 nginx:alpine

现在,我们已经使用网桥网络驱动程序通过映射端口号 80 创建了 nginx02 容器。执行 container list 命令进行验证。

sudo docker container ls

现在,使用以下命令查找 nginx02 容器的 IP 地址。

sudo docker inspect <container−id>

复制 IP 地址并将其粘贴到浏览器中。现在,您将能够使用浏览器访问 nginx 容器。检查桥接网络以验证这一点。

sudo docker network inspect bridge

总而言之,在本文中,我们讨论了如何使用主机和桥接网络驱动程序创建 nginx 容器。然后,我们了解了两者之间的区别。主机驱动程序会自动访问 eth0 端口,因此无需进行端口映射。但是,桥接网络驱动程序需要进行端口映射才能从外部访问它们。


相关文章