在 Docker 中,网络是非常重要的组成部分。在分布式系统中,容器之间需要进行通信,而 Docker 提供了不同的网络模式来实现容器之间的通信。其中,overlay 网络模式和 iptables 网络模式是最常用的两种网络模式。
Overlay 网络模式
Overlay 网络模式是一种将容器连接到跨主机的虚拟网络中的方法。它利用 Docker 内置的网络驱动程序(如 VXLAN、IPSec、GRE),将多个 Docker 主机上的容器连接到同一虚拟网络中,使它们可以彼此通信。这种网络模式适用于跨主机容器之间的通信和负载均衡。
使用 overlay 网络模式
使用 overlay 网络模式需要有至少两个 Docker 主机。首先,在各个主机上都创建一个 overlay 网络,然后启动容器并指定已创建的网络。
在创建网络时,需要指定一个名字和一个驱动程序。下面是创建一个名为 my-overlay-network
的 overlay 网络的命令:
docker network create -d overlay --attachable my-overlay-network
接着,需要在不同的 Docker 主机上启动各自的容器,并将容器连接到同一网络中。下面是在两个 Docker 主机上启动一个 Nginx 容器并将它们连接到 my-overlay-network
网络的示例代码。其中,--network
指定了网络名字,--name
指定了容器名字:
# 在 Docker 主机 1 上启动 Nginx 容器并将它连接到 `my-overlay-network` 网络 docker run -d --network my-overlay-network --name nginx-node1 nginx # 在 Docker 主机 2 上启动 Nginx 容器并将它连接到 `my-overlay-network` 网络 docker run -d --network my-overlay-network --name nginx-node2 nginx
现在,两个 Nginx 容器在同一个虚拟网络中,它们可以通过该网络相互通信。
测试 overlay 网络模式
为了测试 overlay 网络是否正常工作,可以在其中一个容器中安装 curl
工具,然后从另外一个容器中访问该容器上运行的服务。下面是在 nginx-node1
容器中安装 curl
工具的命令:
docker exec -it nginx-node1 apt update && apt install -y curl
然后,在 nginx-node2
容器中访问 nginx-node1
容器上运行的 Nginx 服务:
docker exec -it nginx-node2 curl http://nginx-node1
如果一切正常,将会看到 nginx-node1
容器上运行的 Nginx 服务的欢迎页面。
Iptables 网络模式
Iptables 网络模式是一种基于 iptables 规则来控制容器之间通信的方法。通过向容器绑定一条 iptables 规则,可以限制容器之间的网络通信。这种网络模式适用于需要控制容器间通信的场景,比如在安全性要求较高的环境中。
使用 iptables 网络模式
使用 iptables 网络模式需要在 Docker 初始时指定 --iptables
参数。下面是启动一个单节点 Docker 并指定启用 iptables 的示例命令:
dockerd --iptables=true
然后,可以在运行容器时指定 --iptables
参数来为容器创建 iptables 规则。下面是启动一个名为 nginx-iptables
的容器并为它创建 iptables 规则的示例代码:
docker run -d --net=host --cap-add=NET_ADMIN --name nginx-iptables nginx iptables -I DOCKER-USER -i docker0 -o docker0 -p tcp --dport 80 -j DROP iptables -I DOCKER-USER -i docker0 -o docker0 -p tcp --dport 443 -j DROP
上面的代码创建了两条 iptables 规则,将容器 nginx-iptables
在容器内所有对外部的 HTTP 和 HTTPS 通信阻止。
测试 iptables 网络模式
为了测试 iptables 规则是否正常工作,可以在启动容器时加上 --interactive
(-i
)和--tty
(-t
)参数来进入容器内部的 shell,然后使用 ping
命令测试容器之间的连通性。下面是进入 nginx-iptables
容器并使用 ping
命令测试 google.com
是否可以访问的示例命令:
docker exec -it nginx-iptables /bin/bash ping google.com
如果 iptables 规则有效,则无法访问外部网络。
总结
本文章介绍了 Docker 中的两种网络模式:overlay 和 iptables。overlay 网络模式适用于跨主机容器之间的通信和负载均衡,而 iptables 网络模式适用于需要控制容器间通信的场景。在实际应用中,应根据具体的应用场景选择合适的网络模式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650159fe95b1f8cacdf15aaf