一、docker network 核心概念
Docker 网络是实现容器间通信、容器与宿主机 / 外部网络通信的基础,默认包含 3 种内置网络模式:
表格
| 网络模式 | 作用 |
|---|---|
bridge | 默认网络,容器接入此网络可通过网桥与宿主机 / 其他容器通信(最常用) |
host | 容器直接使用宿主机网络栈,无网络隔离,容器端口与宿主机端口直接映射 |
none | 容器无网络(仅回环地址),完全隔离,需手动配置网络 |
| 自定义网络 | 手动创建的 bridge/overlay/macvlan 网络,可自定义网段、网关,隔离性更好 |
二、docker network 核心命令(按使用频率排序)
1. 查看网络列表(基础)
bash
运行
# 查看所有Docker网络(默认显示名称、驱动、作用域)
docker network ls
# 输出示例:
NETWORK ID NAME DRIVER SCOPE
abc123456789 bridge bridge local # 默认bridge网络
def098765432 host host local # 默认host网络
ghi789012345 none null local # 默认none网络
-
关键字段:
DRIVER:网络驱动(bridge/host/none/overlay 等);SCOPE:作用域(local = 本地,swarm = 集群)。
2. 查看网络详情(排错必备)
bash
运行
# 查看指定网络的详细信息(如默认bridge网络)
docker network inspect bridge
# 输出包含:网段(Subnet)、网关(Gateway)、已连接容器(Containers)等核心信息
# 示例(关键片段):
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16", # 默认bridge网段
"Gateway": "172.17.0.1" # 默认网关(宿主机网桥地址)
}
]
},
"Containers": { # 已连接到此网络的容器
"容器ID": {
"Name": "容器名",
"IPv4Address": "172.17.0.2/16" # 容器IP
}
}
3. 创建自定义网络(实战常用)
默认 bridge 网络存在隔离性差、容器名无法直接通信的问题,建议创建自定义 bridge 网络:
bash
运行
# 创建自定义bridge网络(指定网段和网关,推荐)
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 my-custom-network
# 参数说明:
# --driver bridge:指定驱动为bridge(默认)
# --subnet:自定义网段(避免与宿主机/其他网络冲突)
# --gateway:自定义网关
# my-custom-network:网络名称(自定义)
4. 连接容器到网络
bash
运行
# 方式1:创建容器时指定网络
docker run -d --name nginx-test --network my-custom-network nginx:latest
# 方式2:将已运行的容器连接到网络
docker network connect my-custom-network 容器名/容器ID
# 示例:将已运行的nginx容器连接到自定义网络
docker network connect my-custom-network nginx-test
5. 断开容器与网络的连接
bash
运行
# 断开容器与指定网络的连接
docker network disconnect my-custom-network 容器名/容器ID
6. 删除网络
bash
运行
# 删除指定网络(需先断开所有容器连接)
docker network rm my-custom-network
# 清理所有未使用的网络(推荐定期清理)
docker network prune
# 执行后会提示确认,输入y即可删除所有无容器连接的网络
三、实战场景示例
场景 1:容器间通过自定义网络通信
bash
运行
# 1. 创建自定义网络
docker network create my-app-network
# 2. 启动两个容器接入此网络
docker run -d --name app1 --network my-app-network busybox sleep 3600
docker run -d --name app2 --network my-app-network busybox sleep 3600
# 3. 进入app1容器,ping app2(自定义网络支持容器名解析)
docker exec -it app1 ping app2
# 输出:能ping通(默认bridge网络也支持,但自定义网络更稳定)
场景 2:排查容器网络不通问题
bash
运行
# 1. 查看容器所属网络
docker inspect 容器名 | grep -i networkmode
# 2. 查看网络详情,确认容器IP和网关
docker network inspect 网络名
# 3. 测试容器到网关/外部网络的连通性
docker exec -it 容器名 ping 网关IP # 如192.168.100.1
docker exec -it 容器名 ping 8.8.8.8 # 测试外网连通性
场景 3:映射容器端口到宿主机(结合网络)
bash
运行
# 启动容器,接入自定义网络,并映射80端口到宿主机8080
docker run -d --name nginx-web --network my-custom-network -p 8080:80 nginx:latest
# 验证:宿主机访问http://localhost:8080 或 其他机器访问http://宿主机IP:8080
四、常见问题解决
-
容器无法访问外网:
- 检查容器网关是否正确(
docker network inspect 网络名); - 检查宿主机防火墙(
systemctl status firewalld),放行 Docker 网段; - 重启 Docker 网络服务:
systemctl restart docker。
- 检查容器网关是否正确(
-
自定义网络创建失败(网段冲突) :
- 更换网段(如 192.168.200.0/24),避免与宿主机网卡、其他网络重叠;
- 执行
ip addr查看宿主机网段,确保自定义网段不冲突。
-
容器名无法解析:
- 仅自定义 bridge 网络和默认 bridge 网络支持容器名解析,host/none 网络不支持;
- 确保容器已接入同一网络:
docker network inspect 网络名查看 Containers 列表。
总结
- 核心命令:
docker network ls(查看)、inspect(详情)、create(创建)、connect/disconnect(连接 / 断开)、rm/prune(删除 / 清理)是高频用法。 - 最佳实践:优先使用自定义 bridge 网络(而非默认 bridge),自定义网段和网关,提升网络隔离性和可维护性。
- 排错关键:通过
docker network inspect查看网络配置,通过容器内ping测试连通性,定位网络不通问题。