如何测试同一自定义网络上容器之间的通信

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker 是一个强大的平台,用于在容器化环境中构建、部署和运行应用程序。了解如何管理和测试 Docker 容器之间的通信对于构建健壮且可扩展的应用程序至关重要。本教程将指导你完成创建自定义 Docker 网络并测试同一网络上容器之间通信的过程。

理解 Docker 网络

Docker 提供了一个内置的网络系统,允许容器相互之间以及与外部世界进行通信。Docker 支持多种类型的网络,包括:

桥接网络

Docker 中的默认网络类型是桥接网络。当你启动一个新容器时,除非你指定了不同的网络,否则它会自动连接到默认的桥接网络。同一桥接网络上的容器可以使用它们的容器名称或 IP 地址相互通信。

graph LR A[主机] -- 桥接网络 --> B[容器 1] A[主机] -- 桥接网络 --> C[容器 2] B[容器 1] -- 桥接网络 --> C[容器 2]

主机网络

主机网络允许容器直接使用主机的网络栈,绕过 Docker 网络。这对于对性能敏感的应用程序或当你需要访问特定于主机的网络资源时可能很有用。

覆盖网络

覆盖网络用于将多个 Docker 守护进程连接在一起,使 swarm 服务能够相互通信。覆盖网络通常用于 Docker Swarm 环境。

自定义网络

除了默认网络之外,你还可以创建自己的自定义网络。自定义网络允许你将容器相互隔离,并控制它们之间的通信方式。这对于构建更复杂的多层应用程序很有用。

graph LR A[主机] -- 自定义网络 --> B[容器 1] A[主机] -- 自定义网络 --> C[容器 2] B[容器 1] -- 自定义网络 --> C[容器 2]

理解 Docker 的网络功能对于构建和管理容器化应用程序至关重要。在下一节中,我们将探讨如何创建自定义网络并测试该网络上容器之间的通信。

创建自定义网络

要在 Docker 中创建自定义网络,你可以使用 docker network create 命令。此命令允许你指定网络驱动程序、子网和其他配置选项。

创建自定义桥接网络

让我们创建一个名为 my-network 的自定义桥接网络:

docker network create my-network

你可以使用 docker network ls 命令验证网络创建:

网络 ID     名称         驱动程序    作用域
a1b2c3d4e5f6   my-network   bridge    本地

将容器连接到自定义网络

现在,让我们启动两个容器并将它们连接到 my-network 自定义网络:

## 启动容器 1
docker run -d --name container1 --network my-network ubuntu:22.04 sleep infinity

## 启动容器 2
docker run -d --name container2 --network my-network ubuntu:22.04 sleep infinity

你可以使用 docker network inspect 命令检查网络并查看已连接的容器:

[
  {
    "名称": "my-network",
    "Id": "a1b2c3d4e5f6",
    "创建时间": "2023-04-18T12:34:56.789Z",
    "作用域": "本地",
    "驱动程序": "bridge",
    "启用 IPv6": false,
    "IPAM": {
      "驱动程序": "default",
      "选项": {},
      "配置": [
        {
          "子网": "172.18.0.0/16"
        }
      ]
    },
    "内部": false,
    "可附加": false,
    "入口": false,
    "配置来源": {
      "网络": ""
    },
    "仅配置": false,
    "容器": {
      "container1_id": {
        "名称": "container1",
        "端点 ID": "container1_endpoint_id",
        "Mac 地址": "02:42:ac:12:00:02",
        "IPv4 地址": "172.18.0.2/16",
        "IPv6 地址": ""
      },
      "container2_id": {
        "名称": "container2",
        "端点 ID": "container2_endpoint_id",
        "Mac 地址": "02:42:ac:12:00:03",
        "IPv4 地址": "172.18.0.3/16",
        "IPv6 地址": ""
      }
    },
    "选项": {},
    "标签": {}
  }
]

既然我们已经创建了一个自定义网络并将容器连接到它,我们可以在下一节中测试容器之间的通信。

测试容器通信

既然我们已经创建了一个自定义网络并将容器连接到它,我们就可以测试容器之间的通信了。

容器之间的 Ping 操作

让我们先从一个容器 ping 另一个容器开始:

## 进入第一个容器
docker exec -it container1 bash

## 通过名称 ping 第二个容器
ping -c 4 container2

输出应该显示容器可以使用它们的容器名称相互通信:

PING container2 (172.18.0.3) 56(84) 字节的数据。
64 字节来自 container2.my-network (172.18.0.3):icmp_seq=1 ttl=64 时间=0.065 毫秒
64 字节来自 container2.my-network (172.18.0.3):icmp_seq=2 ttl=64 时间=0.057 毫秒
64 字节来自 container2.my-network (172.18.0.3):icmp_seq=3 ttl=64 时间=0.057 毫秒
64 字节来自 container2.my-network (172.18.0.3):icmp_seq=4 ttl=64 时间=0.057 毫秒

--- container2 ping 统计信息 ---
4 个数据包已发送,4 个已接收,0% 数据包丢失,时间 3 毫秒
rtt 最小值/平均值/最大值/标准偏差 = 0.057/0.059/0.065/0.003 毫秒

测试 TCP 通信

你还可以测试容器之间的 TCP 通信。例如,你可以在一个容器中运行一个简单的 HTTP 服务器,并从另一个容器访问它:

## 在 container1 中启动一个简单的 HTTP 服务器
docker exec -it container1 bash
python3 -m http.server 8000

## 在另一个终端中,从 container2 访问 HTTP 服务器
docker exec -it container2 bash
curl http://container1:8000

第二个终端中的输出应该显示在第一个容器中运行的 HTTP 服务器的内容。

通过测试同一自定义网络上容器之间的通信,你可以确保容器化应用程序组件能够正确地相互交互,这对于构建和部署复杂的多服务应用程序至关重要。

总结

在本 Docker 教程中,你将学习如何创建自定义网络、在该网络上启动容器以及验证它们之间的通信。在本指南结束时,你将掌握测试 Docker 容器之间连接性的知识和技能,确保你的应用程序能够在同一自定义网络中无缝地相互交互。