Docker :Docker 网络详解
适配 CSDN / 掘金博客,基于 CentOS 实验环境,实操 + 原理结合,承接上一章容器内容
0 本章学习总览
本章重点掌握 Docker 四大网络模式:bridge、host、none、container,理解默认网桥原理、自定义网桥、端口映射、容器之间互通、容器访问外网、外网访问容器。 核心命令:docker network系列命令、-p/-P端口映射参数。
一、Docker 网络基础概念
Docker 网络本质是在宿主机上创建虚拟网卡、网桥,实现容器之间、容器与外网之间通信。
- 每启动一个容器,容器会分配独立 IP;
- 宿主机上会生成
veth虚拟网卡,一端在容器内,一端挂在 docker 网桥上; - 网桥相当于虚拟交换机,负责转发各个容器之间数据包。
docker network 常用命令
#查看所有docker网络
docker network ls
#查看网络详细信息
docker network inspect 网络名/网络ID
#创建自定义网桥
docker network create 网桥名
#删除网络
docker network rm 网络ID
#将容器连接到指定网络
docker network connect 网络名 容器名
#断开容器与网络
docker network disconnect 网络名 容器名
二、Docker 四种网络模式
表格
| 网络模式 | 参数 | 特点 | 使用场景 |
|---|---|---|---|
| bridge(默认网桥) | --network bridge | docker 默认模式;容器独立 IP;宿主机创建 docker0 网桥;NAT 访问外网 | 大部分普通容器,默认使用 |
| host 模式 | --network host | 直接复用宿主机网络栈,没有独立隔离网络;容器 IP = 宿主机 IP;端口直接占用宿主机端口 | 需要占用大量端口、追求网络性能 |
| none 模式 | --network none | 关闭所有网络,容器无网卡无 IP,完全隔离 | 安全场景,不需要网络访问的容器 |
| container 模式 | --network container:容器ID | 复用另外一个容器的网络栈,共享 IP 和端口;两个容器网卡 IP 完全一样 | 日志收集、代理容器,共享网络 |
1. bridge 默认网桥(docker0)
- 启动容器不指定
--network,默认使用 bridge,挂载到docker0网桥。 - 原理:
- 创建一对 veth 虚拟网卡对;
- 一端放到容器内部,命名 eth0;
- 另一端挂接到宿主机 docker0 网桥;
- 通过 iptables 做 NAT,实现容器访问外网;
缺点:默认 docker0 网桥不支持容器名直接解析通信,不能用容器名字互相访问,只能靠 IP。
2. host 模式
容器直接使用宿主机网卡、IP、端口、路由表,没有网络隔离。 ⚠️注意:host 模式不需要做端口映射,容器监听端口直接就是宿主机端口。
docker run -d --name nginx-host --network host nginx
3. none 模式
容器内部只有 lo 回环网卡,没有外网网卡,完全断网。
docker run -it --network none ubuntu bash
4. container 共享网络模式
新容器复用已有容器的网络栈,两者 IP、端口完全一致,端口不能冲突。
#先启动容器A
docker run -d --name c1 nginx
#容器c2复用c1的网络
docker run -it --name c2 --network container:c1 ubuntu bash
三、端口映射 -p /-P
实现外网访问容器内部服务,把宿主机端口映射到容器端口。
-P(大写):随机宿主机端口映射容器 EXPOSE 声明的端口
docker run -d -P --name nginx1 nginx
-p(小写)手动指定映射,支持多种格式
#宿主机8080端口映射容器80端口
docker run -d -p 8080:80 --name nginx2 nginx
#指定宿主机IP,只监听本机回环地址
docker run -d -p 127.0.0.1:8081:80 nginx
#指定协议udp
docker run -d -p 8082:80/udp nginx
查看端口映射:
docker port 容器ID
四、自定义网桥(重点)
默认 docker0 网桥不支持 DNS 容器名解析;自定义网桥自带 DNS 服务,可以直接使用容器名字互相通信。
创建自定义网桥
#创建自定义网桥my-bridge
docker network create my-bridge
特性:
- 同一自定义网桥下的容器,可以直接用容器名称互相访问;
- 支持自动 DNS 解析;
- 可以自定义网段;
- 容器可以同时加入多个网络。
示例:测试自定义网桥通信
#启动两个容器,指定使用自定义网桥
docker run -d --name web1 --network my-bridge nginx
docker run -it --name web2 --network my-bridge ubuntu bash
#在web2容器内,直接ping web1容器名字,能够解析通
ping web1
容器可以运行后再接入自定义网络:
docker network connect my-bridge web1
五、容器通信场景总结
- 同一自定义网桥容器之间:直接容器名通信 ✅支持 DNS
- 同一默认 docker0 网桥容器之间:只能 IP 互通,不支持容器名 ❌
- 不同网桥的容器:默认不能直接互通;需要把容器同时加入同一个网桥
- 容器访问外网:bridge 模式下 iptables NAT 转发,宿主机能上网容器就可以上网
- 外网访问容器:做端口映射
-p,或者 host 模式 - 宿主机访问容器:可以直接访问容器 IP,或者映射的宿主机端口
六、常见问题排错思路
- 容器能 ping 外网 IP,不能 ping 域名 → DNS 问题,可以给容器指定
--dns - 外部机器访问不了映射端口 → 检查防火墙、安全组、监听地址
- 容器之间 ping 不通 → 确认是否在同一个网桥,docker0 网桥不能用容器名访问
- host 模式端口冲突 → host 模式共享宿主机端口,不能端口重复占用
📝本章小结
- Docker 四种网络模式:
bridge、host、none、container,默认 bridge; - bridge 依靠 docker0 网桥 + veth pair 虚拟网卡实现容器网络;
-p手动端口映射,-P随机端口映射;- 自定义网桥最大优势:自带 DNS,支持容器名称直接通信;
- host 模式无网络隔离,直接复用宿主机网络栈;none 完全断网;container 共享别的容器网络栈。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Wzh5452830/article/details/165487726




