Skip to content

Docker - 网络

Docker 提供了强大的网络功能,允许容器之间、容器与 Docker 宿主机以及容器与外部网络进行通信。理解 Docker 网络对于构建多容器应用至关重要。

安装 Docker 时,它会创建几个默认网络。最常见的是 bridge 网络。

  • bridge:如果在运行容器时未指定其他网络,容器会连接到此默认网络。默认 bridge 网络上的容器可以使用它们的 IP 地址相互通信,但不能通过容器名称来解析彼此。
  • host:容器共享宿主机的网络栈。没有网络隔离。
  • none:容器没有网络接口,只有一个回环设备。网络方面完全隔离。

在 Linux 宿主机上,您可以使用 ip addr show 或 ifconfig 等命令查看默认的 bridge 网络接口(通常命名为 docker0)。

Docker 提供了用于管理网络的命令:

此命令列出 Docker 宿主机上所有可用的网络。

docker network ls

输出通常显示默认网络(bridge、host、none)以及任何用户创建的网络。

NETWORK ID NAME DRIVER SCOPE
ca411b7d6ebf bridge bridge local
2f89b2b5b01a host host local
3d1d7a7d5c5b none null local

提供关于特定网络的详细信息,包括其配置、子网 (subnet)、网关 (gateway) 以及已连接的容器。

docker network inspect bridge

输出是 JSON 格式。如果您运行一个容器并再次检查 bridge 网络,您将看到容器列在 Containers 键下,以及为其分配的 IP 地址。

# Start a container (it attaches to 'bridge' by default)
docker run -dit --name my-temp-container busybox
# Inspect the bridge network again
docker network inspect bridge

在 JSON 输出中查找 Containers 部分。

虽然默认的 bridge 网络很有用,但对于涉及多个需要通信的容器的应用,通常推荐使用用户定义的 bridge 网络。

  • **自动 DNS 解析:**同一用户定义网络上的容器可以通过它们的容器名称相互解析。这消除了管理 IP 地址或使用遗留的 --link 选项的需要。
  • **更好的隔离性:**提供网络分段。未连接到特定用户定义网络的容器无法访问其中的容器(除非发布了端口)。
  • **动态连接性:**容器可以动态地连接或从用户定义网络中分离。

创建用户定义的 Bridge 网络 (docker network create)

Section titled “创建用户定义的 Bridge 网络 (docker network create)”
# Create a new bridge network named 'my-app-net'
docker network create my-app-net

默认情况下,这会使用 bridge 驱动程序创建一个网络。您可以使用 --driver 选项指定其他驱动程序(例如用于 Swarm 的 overlay,或自定义插件)。

在运行容器时使用 --network 标志:

# Start a backend container on the custom network
docker run -d --name backend-db --network my-app-net redis:alpine
# Start a frontend container on the same network
# This container can now reach 'backend-db' using its name
docker run -d --name frontend-app --network my-app-net -p 8080:80 some-frontend-image

在 frontend-app 容器内部,您现在通常可以使用主机名 backend-db 连接到 Redis。

您可以检查您的自定义网络 (docker network inspect my-app-net) 以查看连接的容器。