Docker 入门教程(九):容器网络与通信机制

发布于:2025-07-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

🐳 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",
    ...
  }
}