docker network 是 Docker 中用于管理容器网络的核心命令套件。它允许你创建、检查、连接和断开容器与网络的连接,以及清理未使用的网络资源。
以下是 docker network 命令的详细指南:
一、 核心子命令概览
| 命令 | 描述 |
|---|---|
docker network ls |
列出所有网络 |
docker network create |
创建一个新的自定义网络 |
docker network inspect |
查看网络的详细配置信息(JSON格式) |
docker network connect |
将正在运行的容器连接到指定网络 |
docker network disconnect |
将容器从指定网络断开 |
docker network rm |
删除一个或多个网络 |
docker network prune |
删除所有未被容器使用的网络 |
二、 Docker 的默认网络驱动
在创建网络之前,了解 Docker 提供的三种主要网络驱动非常重要:
2.1、 bridge (桥接) :默认驱动。
- 适用于单机上的多个容器通信。
- 每个容器获得一个内部 IP,通过 NAT 与宿主机通信。
- 自定义 bridge 网络 比默认
bridge更好,因为它支持自动 DNS 解析(容器可以通过名称互相访问)。
2.2. host (主机):
- 容器直接使用宿主机的网络栈,没有独立的 IP。
- 性能最高,但端口冲突风险大,隔离性最差。
2.3. none (无网络):
- 容器没有网络接口,完全隔离。
- 适用于不需要网络的高安全需求场景。
三、 常用命令详解
3.1、 查看网络 (ls)
bash
# 列出所有网络
docker network ls
#输出示例:
NETWORK ID NAME DRIVER SCOPE
a1b2c3d4e5f6 bridge bridge local
g7h8i9j0k1l2 host host local
m3n4o5p6q7r8 none null local
3.2、 创建自定义网络 (create)
强烈建议 为应用创建自定义 bridge 网络,而不是使用默认的 bridge。
bash
# 创建一个名为 my-app-net 的 bridge 网络
docker network create my-app-net
# 查看创建的网络 my-app-net
docker network ls | grep my-app-net
3226df05ac88 my-app-net bridge local
指定子网和网关(高级用法,避免IP冲突)
bash
docker network create \
--driver bridge \
--subnet 192.168.10.0/24 \
--gateway 192.168.10.1 \
my-custom-net
创建指定网络模式的:https://blog.csdn.net/yuelai_217/article/details/160119439
3.3、 查看网络详情 (inspect)
这是调试网络问题的最强工具。它可以显示连接到该网络的所有容器及其 IP 地址。
bash
docker network inspect d4645d4390be
[
{
"Name": "bridge",
"Id": "d4645d4390be0309cc54c02e8f3a0227ae967beec67b6a6ecf2dc9c942ce5f30",
"Created": "2026-03-20T15:45:07.281158334+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"61472937d1b6f0823150d55cf02e6d659d055e92c415a8972e7ffa60b9605e61": {
"Name": "priceless_hertz",
"EndpointID": "f876cc38b23cd9936ce09b20228423e5d884e45d403a0990be577455c04d2903",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"b372f3ca0beff5c7a51d7c7d2140b523f1038f6b74287386b92b824602997832": {
"Name": "mychart",
"EndpointID": "34bd3a25f8cada4b05500754465c86c56079d1d9655c62d672b652755497033a",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
参数解读:
Name: "bridge": 这是 Docker 安装后自动创建的默认网络。如果你启动容器时不指定 --network,容器就会连到这个网络。Driver: "bridge": 使用 Linux 网桥驱动。这意味着容器之间通过虚拟交换机通信。Scope: "local": 表示这个网络只在当前这台宿主机上有效,不能跨机器通信(不同于 Swarm 的 overlay 网络IPAM指的是地址管理的核心配置Subnet: "172.17.0.0/16":- 这是整个网络的"地盘"。
- /16 意味着有 216 = 65,536个可用 IP 地址。
- 范围是从 172.17.0.1 到 172.17.255.254。
Gateway: "172.17.0.1":- 这是容器的"大门"。
- 在宿主机上,这通常对应虚拟网卡 docker0 的 IP 地址。
- 容器如果要访问外网(互联网)或宿主机其他非 Docker 网络,数据包都会发给这个网关。
Containers: 列出所有连接到此网络的容器 ID、名称、IPv4Address 和 MAC 地址。EnableIPv6: false: 未启用 IPv6。Internal: false: 不是内部网络。如果是 true,容器将无法访问外网(只能内网互访)。Attachable: false: 默认桥接网络不支持手动将正在运行的容器动态 attach 进去(虽然 connect 命令在某些版本可用,但自定义网络更灵活)。default_bridge: "true": 确认这是默认网络。enable_icc: "true" (Inter-Container Communication): 允许容器间通信。如果设为 false,即使在同一网络,容器也无法互相访问(除了通过端口映射)。enable_ip_masquerade: "true":- 开启 IP 伪装(NAT)。这是容器能上网的关键。
- 当容器 172.17.0.2 访问百度时,数据包到达宿主机网关 172.17.0.1,网关会把源 IP 改成宿主机的真实 IP(如 192.168.1.100)再发出去。百度回包给宿主机,宿主机再转交给容器。
name: "docker0": 这是在宿主机 Linux 系统中看到的虚拟网桥接口的名字。你可以运行 ifconfig docker0 或 ip addr show docker0 看到它。"com.docker.network.driver.mtu": "1500"指的是 最大传输单元(Maximum Transmission Unit),其值为 1500 字节。简单来说,它规定了单个网络数据包(Packet)最大能装多少数据。
3.4、 连接容器到网络 (connect)
你可以将一个正在运行 或已停止的容器连接到额外的网络。
bash
# 语法: docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect my-app-net my-web-container
# 如下:
docker network connect ebfb0510e037 9cf7436181a1
docker inspect 9cf7436181a1 | jq '.[0].NetworkSettings.Networks[].NetworkID'| awk 'NR==2'
"ebfb0510e03741142c9dadaa806bdb1bc1805bcedc4e16c22b1a69d406e45faf"
- 作用 :连接后,
my-web-container可以通过容器名my-db-container(如果也在同一网络)直接访问数据库,无需知道 IP。
3.5、 断开网络连接 (disconnect)
bash
# 语法: docker network disconnect [OPTIONS] NETWORK CONTAINER
docker network disconnect my-app-net my-web-container
3.6、 删除网络 (rm)
bash
# 删除指定网络
docker network rm my-app-net
# 强制删除(即使有容器连接,也会先断开再删除 - 慎用)
docker network rm -f my-app-net
3.7、 清理未使用网络 (prune)
定期清理可以释放资源。
bash
# 删除所有未被任何容器使用的网络
docker network prune
# 系统提示确认时输入 y
四、 实战场景:Web 应用 + 数据库
假设你要部署一个 Nginx 前端和一个 Redis 后端。
步骤 1: 创建专用网络
bash
docker network create my-backend-net
步骤 2: 启动 Redis 并加入网络
bash
docker run -d \
--name redis-server \
--network my-backend-net \
redis:alpine
步骤 3: 启动 Nginx 并加入同一网络
bash
docker run -d \
--name nginx-web \
--network my-backend-net \
-p 80:80 \
nginx:alpine
步骤 4: 验证通信
进入 Nginx 容器,尝试 ping Redis 容器名:
bash
docker exec -it nginx-web sh
# 在容器内执行:
ping redis-server
结果 :应该能通!这就是自定义 Bridge 网络的魔力------DNS 自动解析 。如果你使用默认 bridge 网络,这一步通常会失败,除非使用 --link(已废弃)。
步骤 5: 动态添加另一个容器
假设你后来启动了一个 Python 应用,也想访问 Redis:
bash
docker run -d \
--name python-app \
--network my-backend-net \
python:3.9-slim sleep infinity
# 现在 python-app 也可以通过 "redis-server" 这个名字访问 Redis
五、 常见误区与最佳实践
5.1、 不要过度依赖默认 bridge 网络:
- 默认
bridge网络不支持通过容器名进行 DNS 解析。你必须使用--link(不推荐)或硬编码 IP(极不推荐)。 - 最佳实践 :始终使用
docker network create创建自定义网络。
5.2、 一个容器可以连接多个网络:
- 例如,一个容器可以连接
frontend-net(暴露给公网)和backend-net(仅内部通信),实现网络隔离和安全分层。
5.3、 端口映射 (-p) 与网络的关系:
-p 8080:80是将宿主机的端口映射到容器。这与容器所在的网络类型无关,但在host模式下不能使用-p,因为容器直接使用宿主机端口。
5.4、 排查网络问题:
- 如果容器间无法通信,首先运行
docker network inspect <network_name>确认两个容器是否都在同一个网络的Containers列表中。 - 检查防火墙规则(如
ufw或iptables)是否阻止了 Docker 网桥的流量。
总结
- 开发/单机多容器 :使用 自定义 Bridge 网络 (
docker network create)。 - 高性能/无需隔离 :使用 Host 网络 (
--network host)。 - 完全隔离 :使用 None 网络 (
--network none)。 - 调试神器 :
docker network inspect。
参考文档
1、https://blog.csdn.net/yuelai_217/article/details/160119439
2、https://blog.csdn.net/yuelai_217/article/details/160119516