测试容器之间的基本连接
既然我们已经设置好容器并将它们连接到网络,就可以测试它们之间的连接了。我们将使用几种方法来验证容器之间是否能够相互通信。
使用 Ping 测试连接
测试基本网络连接的最简单方法是使用 ping
命令,该命令会向目标主机发送 ICMP 回显请求。
让我们使用 IP 地址从 container1 向 container2 发送 Ping 请求:
## 首先,获取 container2 的 IP 地址
CONTAINER2_IP=$(docker exec container2 hostname -i)
echo "Container2 IP: $CONTAINER2_IP"
## 获取 CONTAINER2_IP 的第一个 IP 地址
CONTAINER2_IP=$(echo $CONTAINER2_IP | cut -d' ' -f1)
echo "Container2 IP: $CONTAINER2_IP"
## 现在从 container1 向 container2 发送 Ping 请求
docker exec container1 ping -c 4 $CONTAINER2_IP
你应该会看到类似以下的输出:
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.095 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.087 ms
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.085/0.095/0.000 ms
测试 DNS 解析
自定义 Docker 网络的一个优点是它们提供自动 DNS 解析,允许容器通过名称相互访问。
让我们通过按名称 Ping 容器来测试 DNS 解析:
docker exec container1 ping -c 4 container2
这应该可行,因为两个容器都在我们的自定义 my-network
上,该网络提供 DNS 解析。你应该会看到与之前测试类似的 Ping 响应,但使用的是容器名称而不是 IP。
使用 curl 测试 HTTP 连接
对于运行 Web 服务的应用程序,我们通常需要测试 HTTP 连接。让我们在 container2 中设置一个简单的 HTTP 服务器,并从 container1 测试与它的连接。
首先,在 container2 中启动一个基本的 HTTP 服务器:
docker exec container2 apt-get install -y python3
docker exec -d container2 bash -c "echo 'Hello from container2' > /index.html && cd / && python3 -m http.server 8080"
等待几秒钟让服务器启动,然后从 container1 测试连接:
docker exec container1 curl -s http://container2:8080
你应该会看到输出:
Hello from container2
这确认了 container1 可以使用容器名称进行 DNS 解析,从而连接到 container2 的 HTTP 服务。
使用不同方法测试连接
了解如何使用其他工具测试连接也很有用。让我们尝试使用 nc
(netcat)检查特定端口是否打开:
## 确保在 container1 中安装了 netcat
docker exec container1 apt-get install -y netcat
## 测试与 container2 上的 HTTP 服务器的连接
docker exec container1 nc -zv container2 8080
你应该会看到表明连接成功的输出:
Connection to container2 (172.18.0.3) 8080 port [tcp/*] succeeded!
这些测试确认了我们的容器在网络级别(Ping)和应用程序级别(HTTP)都可以相互通信。