Docker 的网络模型是 Docker 容器之间以及与宿主机之间进行通信的基础。Docker 提供了几种不同的网络模式,包括 bridge(桥接模式,默认模式)、host(主机模式)、none(无网络模式)、container(容器模式)以及自定义网络(如 overlay 网络,用于 Docker Swarm)。这里,我们将详细解析 bridge 网络模式,并提供一个实际的代码示例,展示如何创建容器并让它们在同一桥接网络上通信。

1. Bridge 网络模式

Bridge 网络是 Docker 默认的网络模式。Docker 会在宿主机上创建一个虚拟的桥接网络接口(通常是 docker0),然后将容器连接到这个桥接网络上。每个容器都会被分配一个唯一的 IP 地址,并且可以通过 IP 地址或者容器名(在 Docker 内部 DNS 解析的帮助下)相互通信。

2. 示例:创建两个容器并让它们通信

步骤 1: 创建第一个容器

我们将创建一个运行 Web 服务器的容器(比如 Nginx),并将其命名为 web-server

bash复制代码

docker run --name web-server -d -p 8080:80 nginx
  • 1.
  • 2.
  • 3.

这里,-d 参数表示在后台运行容器,-p 8080:80 表示将容器的 80 端口映射到宿主机的 8080 端口,nginx 是要运行的镜像名称。

步骤 2: 创建第二个容器

我们将创建一个简单的容器,使用 curl 命令来访问前面创建的 Web 服务器。为了展示容器间的直接通信,我们将不使用宿主机的端口映射。

首先,我们需要一个包含 curl 的镜像。这里,我们使用 alpine 镜像,它是一个非常轻量级的 Linux 发行版,包含了许多常用的命令行工具。

bash复制代码

docker run --rm -it --name curl-client alpine sh
  • 1.
  • 2.
  • 3.

在容器的 shell 中,我们可以直接运行 curl 命令来访问 web-server 容器。由于它们都在同一个桥接网络上,我们可以直接使用容器名 web-server 来访问它(Docker 会处理 DNS 解析)。

bash复制代码

/ # curl web-server
  • 1.
  • 2.
  • 3.

由于 web-server 容器运行的是 Nginx,因此上面的命令应该会返回 Nginx 的默认欢迎页面。

3. 退出 curl-client 容器

curl-client 容器的 shell 中,你可以通过输入 exit 命令来退出容器。由于使用了 --rm 参数,这个容器会在退出后自动删除。

4. 验证和调试

如果你想要查看 Docker 的网络配置,可以使用 docker network ls 来列出所有网络,并使用 docker network inspect <network_name> 来查看特定网络的详细信息。对于桥接网络,默认的网络名称通常是 bridge,但你也可以通过 docker network create 命令创建自定义的桥接网络。

5. 结论

以上示例展示了如何在 Docker 的桥接网络模式下创建两个容器,并使它们能够相互通信。这是 Docker 容器间通信的基础,对于构建分布式应用和微服务架构至关重要。通过调整网络设置,你可以实现更复杂的网络拓扑和隔离策略。