docker network 命令(长文讲解)

Docker 网络基础:理解容器通信的“高速公路”

在使用 Docker 时,我们经常需要让多个容器之间互相通信。就像现实世界中,不同城市之间的车辆需要通过公路系统连接一样,Docker 容器之间的通信也依赖于一个“网络系统”。这个系统的核心就是 Docker 的网络功能。而要管理这个网络系统,最关键的工具就是 docker network 命令。

docker network 命令是 Docker 提供的一组用于创建、查看、管理容器网络的命令行工具。它让我们能够像搭建真实网络一样,定义不同容器之间的连接方式,控制它们的通信权限和方式。无论是开发微服务应用,还是部署多容器项目,掌握这个命令都至关重要。

想象一下,如果你正在开发一个 Web 应用,前端容器运行在 Nginx 中,后端服务是 Node.js,数据库是 PostgreSQL。这三个组件必须能互相访问,才能构成完整的应用。这时候,我们就需要通过 docker network 命令为它们创建一个统一的网络环境,让它们“在同一张网”上工作。

查看与管理现有网络

在开始创建新网络之前,先了解当前系统中有哪些网络是很有必要的。你可以使用以下命令查看所有已存在的网络:

docker network ls

这个命令会输出类似下面的结果:

NETWORK ID     NAME         DRIVER    SCOPE
abc123def456   bridge       bridge    local
xyz789uvw012   host         host      local
pqr456stu789   none         null      local

每一行代表一个网络,包含四个字段:

  • NETWORK ID:网络的唯一标识符,用于精确操作。
  • NAME:网络的名称,方便记忆和调用。
  • DRIVER:网络驱动类型,决定网络的行为方式。
  • SCOPE:网络的作用范围,通常是 local(本地)或 global(全局)。

其中,bridge 是默认网络,所有未指定网络的容器都会自动连接到这个网络。host 模式让容器直接使用宿主机的网络栈,none 则表示容器没有网络接口。

💡 提示:虽然 bridge 网络默认可用,但不推荐在生产环境中直接使用它来连接多个服务,因为它缺乏隔离性。更好的做法是创建自定义网络。

创建自定义网络:为容器构建专属“通信圈”

为了实现更好的隔离和控制,我们通常会创建自定义网络。例如,为你的前后端应用创建一个名为 app-network 的网络:

docker network create app-network

这条命令会在系统中创建一个名为 app-network 的桥接网络。这个网络就像一个专属的“通信圈”,只有加入这个圈的容器才能互相通信。

创建完成后,你可以再次运行 docker network ls,就会看到 app-network 出现在列表中。

自定义网络的驱动选择

docker network create 支持多种驱动,最常用的是 bridgeoverlaybridge 适用于单机多容器通信,而 overlay 用于跨主机的容器网络(需要配合 Docker Swarm 使用)。

例如,创建一个使用 bridge 驱动的网络:

docker network create --driver bridge app-network

虽然默认就是 bridge,但显式声明可以增强代码可读性。

✅ 小贴士:建议为每个应用或项目创建独立的网络,避免不同项目之间的容器“串门”。

连接容器到网络:让服务“入网”工作

创建网络只是第一步,接下来需要把容器连接到这个网络。你可以通过 --network 参数在运行容器时指定网络,也可以在容器运行后使用 docker network connect 命令动态连接。

运行时指定网络

docker run -d --name web-server --network app-network nginx:alpine

这条命令启动一个 Nginx 容器,并将其连接到 app-network 网络。此时,这个容器就拥有了该网络中的 IP 地址,可以与其他连接到同一网络的容器通信。

运行后动态连接

如果容器已经运行,但你希望它加入某个网络,可以使用:

docker network connect app-network database-container

这会把名为 database-container 的容器连接到 app-network。注意:容器必须是运行状态,才能执行 connect 操作。

⚠️ 注意:容器可以连接到多个网络,但每个网络中只能有一个 IP 地址。

查看网络详细信息:诊断通信问题的利器

当容器无法通信时,我们往往需要查看网络的详细配置。docker network inspect 命令就是用来查看网络详细信息的。

docker network inspect app-network

执行后会返回一个 JSON 格式的详细信息,包括:

  • 网络的 ID、名称、驱动类型
  • 所有连接到该网络的容器(Containers 字段)
  • 子网(Subnet)、网关(Gateway)、IP 范围等网络配置
  • 与该网络相关的 DNS 设置

例如,你可以看到某个容器的 IP 地址是 172.18.0.2,这有助于你在容器内通过 IP 直接访问其他服务。

🔍 实用技巧:如果某个容器无法访问另一个容器,先用 inspect 查看它们是否在同一个网络中,IP 是否在同一子网。

删除网络与清理工作:保持系统整洁

当项目结束或不再需要某个网络时,应及时删除,避免系统中积累无用网络。

docker network rm app-network

这条命令会删除名为 app-network 的网络。但前提是:该网络中没有正在运行的容器

如果还有容器连接着该网络,命令会失败,提示类似:

Error response from daemon: network app-network has active endpoints

这时你需要先断开容器:

docker network disconnect app-network web-server
docker network disconnect app-network database-container

然后才能删除网络。

🧹 建议:定期清理不再使用的网络,保持 Docker 环境整洁,避免资源浪费。

实际案例:搭建一个前后端通信的简单环境

我们来动手做一个完整的例子:创建一个前后端通信的最小系统。

步骤 1:创建自定义网络

docker network create frontend-backend-network

步骤 2:启动后端服务容器(Node.js)

docker run -d --name backend-server \
  --network frontend-backend-network \
  -p 3000:3000 \
  node:18-alpine sh -c "echo 'Hello from backend!' > /app/index.html && http-server /app -p 3000"

这个容器运行一个简单的 Node.js 服务,监听 3000 端口,返回“Hello from backend!”。

步骤 3:启动前端服务容器(Nginx)

docker run -d --name frontend-server \
  --network frontend-backend-network \
  -p 8080:80 \
  nginx:alpine

步骤 4:验证通信

现在,两个容器都在同一个网络中。你可以进入前端容器,测试是否能访问后端服务:

docker exec -it frontend-server sh

进入容器后执行:

wget -qO- http://backend-server:3000

如果返回 Hello from backend!,说明通信成功!

🎯 这个例子展示了 docker network 命令的核心价值:让不同服务在隔离的环境中协同工作,同时保持通信能力。

总结:掌握 Docker 网络,掌控容器通信

通过本文,你已经系统掌握了 docker network 命令的使用方法。从查看现有网络、创建自定义网络,到连接容器、检查配置、清理资源,每一步都为你构建健壮的多容器应用打下基础。

记住,容器之间的通信不是“自动发生”的,而是需要我们主动定义和管理的。docker network 命令就是你手中的“网络设计师”。掌握它,你就能像搭积木一样,轻松构建出复杂的微服务架构。

无论是初学者还是中级开发者,熟练运用 docker network 命令,都能显著提升你的开发效率和项目可维护性。别再让容器“彼此看不见”,用网络把它们连接起来,让应用真正跑起来。