Docker主机网络与桥接网络


Docker网络有两个类型的单主机网络 - **“host”** 和 **“bridge”** 网络。单主机网络意味着它们的影响仅限于每个主机。

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

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

sudo docker network ls

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

sudo docker network inspect host

你会得到一个包含网络所有详细信息的JSON列表。请注意,Containers对象最初是空的。

现在,我们将使用主机网络创建一个nginx Docker容器。

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

使用主机网络时,我们不需要指定端口映射,因为主机网络驱动程序在Linux/Unix系统上运行时会自动使用“eth0”。

使用以下命令获取容器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

我们现在已经使用桥接网络驱动程序创建了nginx02容器,并映射了端口号80。执行容器列表命令以验证。

sudo docker container ls

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

sudo docker inspect <container−id>

复制IP地址并将其粘贴到浏览器中。你现在可以使用浏览器访问nginx容器。检查桥接网络以验证。

sudo docker network inspect bridge

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

更新于:2020年10月27日

5K+ 阅读量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.