Docker 入门教程(九):容器网络与通信机制
文章目录
- 🐳 Docker 入门教程(九):容器网络与通信机制
- 一、Docker 网络模型
- 二、Docker 的四种网络类型
- 三、容器间通信机制
- 四、相关指令
🐳 Docker 入门教程(九):容器网络与通信机制
一、Docker 网络模型
Docker 网络建立在 Linux 的标准网络堆栈之上。
你可以把 Docker 的默认网络结构理解为这样:
[容器A] -- vethA --┐│[docker0] -- [eth0/eth1] -- 外网│
[容器B] -- vethB --┘
- 每个容器都有自己的虚拟网卡(veth)
- 它连到一个桥接设备(如 docker0)
- Docker 使用 NAT 和 iptables 把容器网络流量转发出去
二、Docker 的四种网络类型
1. bridge
(默认网络)
docker run -it ubuntu
- 容器会被接入
docker0
网桥 - 它会获得一个私有 IP,如
172.17.0.2
- 容器与容器通信需要通过 IP 地址
- 不支持容器名通信(除非用 extra hosts)
原理:
veth pair
虚拟网卡连接容器与宿主的 docker0 网桥- iptables + NAT 转发出网流量
2. host
网络(共享主机)
docker run --network host nginx
- 容器直接用宿主的网络协议栈
- 没有独立 IP,容器中的
localhost
就是宿主 - 所有端口直接暴露在宿主上
- 性能高(少一层 NAT)
- 安全性低,容易冲突
3. none
网络(禁用)
docker run --network none alpine
- 容器没有任何网络接口(除了
lo
) - 它无法 ping、curl、connect 到任何外部主机
- 完全隔离
用于:
- 极端安全场景(如跑本地算法模型)
- 自己配置网络(如 macvlan)
4. 自定义 bridge 网络(推荐)
docker network create mynet
- 容器获得独立私有 IP(如 172.18.x.x)
- 自动启用 Docker 内建 DNS 服务器
- 可以通过容器名通信
- 网络隔离,跨网络无法互通(unless connect)
这是生产中建议的做法。
三、容器间通信机制
默认网络:不能用容器名通信
docker run -dit --name a1 busybox
docker run -dit --name a2 busybox
docker exec -it a1 ping a2 # 无法解析
因为默认网络没有 DNS 解析;只能用 IP 访问,但 IP 每次变化
自定义网络下:支持 DNS 容器名通信
docker network create mynet
docker run -dit --name a1 --network mynet busybox
docker run -dit --name a2 --network mynet busybox
docker exec -it a1 ping a2 # 成功
Docker 会在该网络中启用 DNS 服务,自动解析容器名;每个容器注册自己的名字
四、相关指令
docker network ls
列出所有网络,包括系统默认和自定义的:
docker network ls
输出示例:
NETWORK ID NAME DRIVER SCOPE
d72e7e0a6f8b bridge bridge local
d8c7d1ed43e7 host host local
192e5ee1525d none null local
ac28c2fbad1f mynet bridge local
docker network inspect <网络名>
查看网络的详细信息,包括:
- 连接了哪些容器
- 分配了哪些 IP
- DNS 名称等
docker network inspect mynet
docker network create [参数] <网络名>
创建一个自定义网络(推荐):
docker network create mynet
也可以加参数:
docker network create \--driver bridge \--subnet 192.168.100.0/24 \--gateway 192.168.100.1 \mynet
Docker 默认使用 bridge
驱动,你也可以用 overlay
(Swarm)或 macvlan
(高级网络映射)
docker network rm <网络名>
删除网络(网络中不能有容器,否则会失败):
docker network rm mynet
docker network connect
将某个容器连接到另一个网络:
docker network connect mynet mycontainer
- 容器可以连接多个网络
- 可用于跨网段打通通信
docker network disconnect
将容器从某网络断开:
docker network disconnect mynet mycontainer
如果容器只连接了一个网络,断开后它将失去网络功能。
调试
docker exec
进入容器内测试连接
docker exec -it myapp ping otherapp
docker exec -it myapp nslookup otherapp
docker exec -it myapp curl http://otherapp:5000
docker inspect <容器名>
查看网络配置
docker inspect myapp
重点字段:
"Networks": {"mynet": {"IPAddress": "172.18.0.2",...}
}