03 容器网络
文章目录
- [03 容器网络](#03 容器网络)
-
- [一、Docker 原生网络驱动](#一、Docker 原生网络驱动)
- [二、none 网络](#二、none 网络)
- [三、host 网络](#三、host 网络)
- [四、bridge 与 docker0](#四、bridge 与 docker0)
-
- [1. docker0 是什么](#1. docker0 是什么)
- [2. veth pair 通信原理](#2. veth pair 通信原理)
- [3. 示例](#3. 示例)
- [五、用户自定义 bridge(user-defined bridge)](#五、用户自定义 bridge(user-defined bridge))
-
- [1. 创建网桥](#1. 创建网桥)
- [2. 启动时加入网络 / 指定静态 IP](#2. 启动时加入网络 / 指定静态 IP)
- [3. 互通规则](#3. 互通规则)
- [4. 给运行中的容器追加网卡(跨网桥互通)](#4. 给运行中的容器追加网卡(跨网桥互通))
- 六、常用网络命令汇总
- 七、常考判断/选择
- 八、速记口诀
常考主线:5 种原生网络驱动 → none/host/bridge 三种重点 → docker0 默认网桥 → 自定义网桥与容器互通。
一、Docker 原生网络驱动
Docker 有 5 种原生 Network Driver ;安装时会自动创建 3 个网络:none、host、bridge(docker0)。
| 驱动 | 说明 | 考点 |
|---|---|---|
| none | 只有 lo 回环网卡,无法与外界通信 | driver 类型为 null,IPAM 为空;用于不需要网络的后台任务 |
| host | 容器直接共享宿主机的 network namespace,网络配置和宿主机完全一样 | 不再做网络隔离,直接占用宿主机端口,无 -p 映射 |
| bridge | 默认驱动,同一台 Docker 宿主机上的容器通信 | 默认实现就是 docker0 网桥 |
| overlay | 基于 Linux 网桥 + VxLAN 实现跨主机容器通信 | 多用于 Swarm/K8s 多机 |
| macvlan | 给容器配 MAC 地址,使其像物理机一样直接接入物理网络,跨主机场景 |
选择题陷阱:flannel 不是 Docker 原生 network driver(它是 K8s 的网络方案/插件)。
二、none 网络
- 容器只有 lo 接口,没有对外网卡,IPAM 为空。
- 完全隔离,不能与外部或其他容器通信。
- 适用:不需要网络的纯计算/批处理任务,或需要手动精细配置网络的场景。
三、host 网络
- 容器加入宿主机的 network namespace,共享宿主机的网卡、IP、端口栈。
- 特点:
- 网络性能最好(无网桥/NAT 转发开销)。
- 端口直接用宿主机端口,端口冲突需自己避免。
- 常考判断:"使用 host 网络时,容器可以使用宿主机上已被占用 的端口对外服务" → 错(F),共享同一端口栈,已占用端口不能再用。
四、bridge 与 docker0
1. docker0 是什么
- Docker Daemon 首次启动 时自动创建的一个 Linux 网桥(虚拟交换机) ,名字就叫 docker0。
- 默认网段 172.17.0.0/16,网关一般是 172.17.0.1。
- 新建容器默认都挂到 docker0 上(默认 bridge 网络)。
2. veth pair 通信原理
- 每接入一个容器,Docker 会创建一对(两个)虚拟网卡 veth pair :
- 一端在容器内(通常叫 eth0);
- 另一端在宿主机上,接入 docker0 网桥。
- 同一网桥下的容器通过 docker0 二层互通;容器访问外网经 docker0 做 NAT(iptables MASQUERADE)。
- 容器 IP 由 docker0 网段动态分配,网关指向 docker0。
3. 示例
bash
docker run --name httpd1 -dit httpd
# 容器网卡 eth0: 172.17.0.2/16,网关 172.17.0.1,NetworkID = docker0 的 ID
docker network ls # 列出网络
docker network inspect bridge # 查看 docker0/bridge 详情(网段、容器、网关)
五、用户自定义 bridge(user-defined bridge)
用户可按需自建网桥,比默认 docker0 更灵活(可指定网段、静态 IP、容器间 DNS 名互通、隔离更好)。
1. 创建网桥
bash
# 让 Docker 自动分配网段和网关
docker network create --driver bridge net1
# 手动指定网段和网关
docker network create --driver bridge --subnet 172.10.10.0/24 --gateway 172.10.10.1 net2
2. 启动时加入网络 / 指定静态 IP
bash
docker run --name centos1 -dit --network net1 centos
docker run --name centos2 -dit --network net2 centos
# 在 net2 中指定静态 IP(必须在该网桥 subnet 范围内)
docker run --name centos3 -dit --network net2 --ip 172.10.10.10 centos
3. 互通规则
- 同一网桥 内的容器可以互通;不同网桥 之间默认隔离、不能直接通信 。
- 例:centos3(net2) 能 ping 通 centos2(net2),ping 不通 centos1(net1)。
4. 给运行中的容器追加网卡(跨网桥互通)
bash
docker network connect net2 centos1 # 给 centos1 再加一块网卡接入 net2
docker network disconnect net2 centos1 # 移除
- 一个容器可同时接入多个网络,从而实现跨网桥通信。
六、常用网络命令汇总
| 命令 | 作用 |
|---|---|
| docker network ls | 列出所有网络 |
| docker network inspect <网络> | 查看网络详情(driver、subnet、gateway、接入容器) |
| docker network create --driver bridge --subnet --gateway 名 | 创建网络 |
| docker network connect <网络> <容器> | 运行中容器接入网络(加网卡) |
| docker network disconnect <网络> <容器> | 断开网络 |
| docker network rm <网络> | 删除网络 |
| docker run --network / --ip | 指定网络 / 静态 IP |
| docker run -p 主机端口:容器端口 | 端口映射(bridge 下对外发布服务) |
七、常考判断/选择
- host 网络下容器能用宿主机已占用的端口提供服务 → F(共享端口栈,会冲突)。
- 下列不是 Docker 原生 network driver 的是:bridge / overlay / host / flannel → 选 flannel。
- Docker 安装后自动创建的 3 个网络:none、host、bridge。
- 默认网络驱动是 bridge ,默认网桥是 docker0(172.17.0.0/16)。
- 同网桥容器互通,不同网桥默认隔离;
docker network connect可让容器加入第二个网桥实现互通。
八、速记口诀
- 五大驱动:none 不通、host 共用、bridge 默认、overlay/macvlan 跨主机;flannel 不是原生驱动。
- docker0 = 默认 Linux 网桥,网段 172.17.0.0/16,容器默认挂它。
- 容器靠 veth pair 一头进容器、一头接网桥实现互通。
- 同网桥通、异网桥隔;要互通就
network connect加网卡。 - host 网络共享宿主机端口栈,被占端口不能再用。