Docker 默认提供三种网络驱动:
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认网络,容器通过 NAT 访问外网,容器间需端口映射 | 单机、简单场景 |
| host | 容器直接使用宿主机网络栈(无隔离) | 性能敏感、端口不冲突 |
| none | 无网络 | 完全隔离、特殊安全场景 |
| overlay | 跨多台宿主机通信(Swarm/K8s) | 集群场景 |
你之前用的默认 bridge 网络的问题:
容器间不能直接用容器名通信(只能用 IP)
需要手动
--link(已废弃)
自定义 bridge 网络的好处:
容器间可以通过容器名互相访问(内置 DNS)
更好的隔离性
可以指定子网 IP 范围
第 21 步操作:对比默认网络 vs 自定义网络
1. 查看当前网络列表
你会看到 root@docker-test:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
4a4b5163ad07 bridge bridge local
f536a0a68643 host host local
41df356c148c none null local
root@docker-test:~# bridge(默认)、host、none 三个默认网络。
2. 创建自定义网络
root@docker-test:~# docker network create my-net
644572449ffbff417dc8ed3fd9068c3c63a654e62db73485d6856ba5bf1c550c
root@docker-test:~#
3. 查看网络详情
root@docker-test:~# docker network inspect my-net
[
{
"Name": "my-net",
"Id": "644572449ffbff417dc8ed3fd9068c3c63a654e62db73485d6856ba5bf1c550c",
"Created": "2026-05-12T09:14:11.843230888Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv4": true,
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
4. 运行两个容器在自定义网络上
root@docker-test:~# docker run -d --name ping-box-1 --network my-net alpine sleep infinity
053f6d5f720d52f0b369c12295807362f6a7253167bc3d0a23bf6bbd7d3c9932
root@docker-test:~# docker run -d --name ping-box-2 --network my-net alpine sleep infinity
230658b18cb41ada2086431c4db5086ef235bf6948f862e51ca92c1f8004d678
root@docker-test:~#
5. 测试容器间通过名称通信
root@docker-test:~# docker exec ping-box-1 ping -c 2 ping-box-2
PING ping-box-2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.083 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.080 ms
--- ping-box-2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.080/0.081/0.083 ms
root@docker-test:~#
6. 测试默认 bridge 网络(不支持名称解析)
这应该会失败(root@docker-test:~# docker run -d --name ping-box-3 alpine sleep infinity
292eafedaebae6ef8697cdc257d32e5cb37284301f7e8b7da119457452c3fa47
root@docker-test:~# docker run -d --name ping-box-4 alpine sleep infinity
de7720518172c0336025e65233b17f65b6bbd95f5adac5b599d9c646d654b0c8
root@docker-test:~# docker exec ping-box-3 ping -c 2 ping-box-4
ping: bad address 'ping-box-4'
root@docker-test:~#bad address 'ping-box-4')。
