实验六:Docker 容器网络 完整报告
一、实验目的
- 理解 Docker 的四种网络模式(bridge、container、host、none)及其特点;
- 掌握如何创建、连接、断开和查看 Docker 网络;
- 学会使用自定义网络实现容器间的通信与隔离;
- 掌握容器网络的基本调试方法。
二、实验环境
- 笔记本直接安装的纯 Linux(Ubuntu)
- Docker
- 宿主机 IP:
10.1.173.146(wlo1 网卡) - 已有 Harbor 环境(
harbor_harbor网络占用172.18.0.0/16)
重要说明:因 Harbor 已占用
172.18.0.0/16,实验二中TestNet01自动分配到了172.19.0.0/16,与实验文档中的172.18.0.x不同。实际 ping 时以docker network inspect显示的 IP 为准。
三、实验步骤
实验一:Docker 网络模式认知
步骤 1:查看当前 Docker 网络
bashdocker network ls
输出:
textNETWORK ID NAME DRIVER SCOPE7fd7d421db1a bridge bridge localb59eeae5a030 harbor_harbor bridge localb2f7e2fbd0c3 host host localc558956df84a none null local
步骤 2:创建并查看不同网络模式的容器
1. Bridge 模式(默认)
bashdocker run -itd --name t1 --net bridge busybox:latest /bin/shdocker inspect t1 | grep NetworkMode -A 5
结果:"NetworkMode": "bridge" ✅
2. None 模式
bashdocker run -itd --name t2 --net none busybox:latest /bin/shdocker inspect t2 | grep NetworkMode -A 5docker exec -it t2 /bin/ship addrexit
结果:"NetworkMode": "none",容器内只有 lo 接口,无 eth0 ✅
3. Container 模式
bashdocker run -itd --name t3 busybox:latest /bin/shdocker run -itd --name t4 --net container:t3 busybox:latest /bin/shdocker exec -it t3 /bin/ship addrexitdocker exec -it t4 /bin/ship addrexit
结果:t3 和 t4 的 IP 完全相同(172.17.0.3),说明共享同一个网络命名空间 ✅
4. Host 模式
bashdocker run -itd --name t5 --net host busybox:latest /bin/shdocker inspect t5 | grep NetworkMode -A 5docker exec -it t5 /bin/ship addrexit
结果:"NetworkMode": "host",容器内显示宿主机全部网卡(wlo1、docker0、br-... 等) ✅
实验二:容器网络连接(Bridge 网络)
步骤 1:创建自定义网络
bashdocker network create TestNet01docker network lsdocker network inspect TestNet01
结果:TestNet01 自动分配子网 172.19.0.0/16,网关 172.19.0.1。
步骤 2:启动两个容器并加入该网络
bashdocker run -itd --name busybox01 --network TestNet01 busybox:latestdocker run -itd --name busybox02 --network TestNet01 busybox:latestdocker ps | grep busybox
步骤 3:查看网络详情
bashdocker network inspect TestNet01
实际分配的 IP:
| 容器 | IP |
|---|---|
| busybox01 | 172.19.0.2 |
| busybox02 | 172.19.0.3 |
步骤 4:测试容器间通信
bashdocker exec -it busybox02 /bin/shping -c 3 172.19.0.2exitdocker exec -it busybox01 /bin/shping -c 3 172.19.0.3exit
结果:两个容器互相 ping 通,0% packet loss ✅
步骤 5:断开网络并测试
bashdocker network disconnect TestNet01 busybox02docker exec -it busybox02 /bin/ship addr # 只剩 loexitdocker exec -it busybox01 /bin/shping -c 3 172.19.0.3 # 无法 ping 通exit
结果:busybox02 只剩 lo,busybox01 无法 ping 通它 ✅
步骤 6:重新连接网络
bashdocker network connect TestNet01 busybox02docker exec -it busybox01 /bin/shping -c 3 172.19.0.3 # 恢复通信exit
结果:通信恢复 ✅
实验三:自定义 Bridge 网络与网络隔离
步骤 1:创建自定义 Bridge 网络
bashdocker network create -d bridge --subnet "172.31.0.0/16" --gateway "172.31.0.1" user-netdocker network ls
步骤 2:启动容器并测试
bashdocker run -itd --name t6 --net user-net busybox:latest /bin/shdocker exec -it t6 /bin/ship addrping -c 3 172.31.0.1 # 自定义网关ping -c 3 172.17.0.1 # 宿主机 docker0 网关exit
结果:
| 目标 | 结果 |
|---|---|
| 172.31.0.1(自定义网关) | 3 packets received,0% loss ✅ |
| 172.17.0.1(宿主机 docker0) | 3 packets received,0% loss ✅ |
步骤 3:创建另一个自定义网络并测试隔离
bashdocker network create -d bridge --subnet "172.32.0.0/16" --gateway "172.32.0.1" user-net32docker run -itd --name t7 --net user-net32 busybox:latest /bin/shdocker exec -it t7 /bin/ship addrping -c 3 172.31.0.2 # 应无法 ping 通 t6exit
结果:100% packet loss,说明不同自定义网络之间默认隔离 ✅
四、遇到的问题及解决方法
问题 1:容器名冲突
现象:
textdocker: Error response from daemon: Conflict. The container name "/t1" is already in use by container "3471574600e4..."
原因:之前实验创建过 t1、t2,容器已停止但记录还在,名称被占用。
解决:
bashdocker rm -f t1 t2 t3 t4 t5
-f 强制删除,不管容器是否在运行。
问题 2:docker attach 无法连接已停止的容器
现象:
textcannot attach to a stopped container, start it first
原因:t2 处于停止状态,attach 只能连接运行中的容器。
解决:
- 用
docker exec -it t2 /bin/sh进入(需要容器在运行); - 或者先
docker start t2,再docker attach t2。
推荐使用 docker exec,退出后容器不会停止。
问题 3:在宿主机执行 ip addr,看到的是宿主机网卡
现象:在宿主机 shell 里直接执行 ip addr,显示 wlo1、docker0 等宿主机接口。
原因:ip addr 是 Linux 命令,在宿主机执行就是宿主机的网络。
解决:先进入容器再执行:
bashdocker exec -it <容器名> /bin/ship addrexit
问题 4:ping 时多写了 /16,报 bad address
现象:
text/ # ping 172.19.0.2/16ping: bad address '172.19.0.2/16'
原因:/16 是子网掩码,只在 ip addr 输出中显示,ping 命令只接受纯 IP。
解决:
bashping -c 3 172.19.0.2
问题 5:ping 命令打成 ing
现象:
text/ # ing -c 3 172.31.0.2/bin/sh: ing: not found
原因:输入时漏了首字母 p。
解决:正确输入 ping -c 3 172.31.0.2。
问题 6:粘贴时出现 ^[[200~ 导致 zsh 报错
现象:
text^[[200~docker exec -it busybox01 /bin/shzsh: bad pattern: ^[[200~docker
原因:zsh 的括号粘贴模式(bracketed paste)在粘贴多行时插入控制字符。
解决:
- 用
Ctrl+Shift+V代替Ctrl+V; - 或手动输入命令;
- 或执行
bindkey -v切换到 vi 模式。
问题 7:TestNet01 分配的子网与实验文档不一致
现象:实验文档写 ping 172.18.0.2,但实际 TestNet01 分配的是 172.19.0.0/16。
原因:Harbor 的 harbor_harbor 网络已占用 172.18.0.0/16,Docker 自动为 TestNet01 分配下一个可用子网 172.19.0.0/16。
解决:用 docker network inspect TestNet01 查看实际分配的 IP,用真实 IP 进行 ping 测试。
五、证明实验完成的命令
bash# 实验一:四种网络模式docker network lsdocker run -itd --name t1 --net bridge busybox:latest /bin/shdocker inspect t1 | grep NetworkMode -A 5docker run -itd --name t2 --net none busybox:latest /bin/shdocker inspect t2 | grep NetworkMode -A 5docker exec -it t2 /bin/ship addrexitdocker run -itd --name t3 busybox:latest /bin/shdocker run -itd --name t4 --net container:t3 busybox:latest /bin/shdocker exec -it t3 /bin/ship addrexitdocker exec -it t4 /bin/ship addrexitdocker run -itd --name t5 --net host busybox:latest /bin/shdocker inspect t5 | grep NetworkMode -A 5docker exec -it t5 /bin/ship addrexit# 实验二:容器网络连接docker network create TestNet01docker network inspect TestNet01docker run -itd --name busybox01 --network TestNet01 busybox:latestdocker run -itd --name busybox02 --network TestNet01 busybox:latestdocker network inspect TestNet01docker exec -it busybox02 /bin/shping -c 3 172.19.0.2exitdocker network disconnect TestNet01 busybox02docker exec -it busybox02 /bin/ship addrexitdocker network connect TestNet01 busybox02docker exec -it busybox01 /bin/shping -c 3 172.19.0.3exit# 实验三:自定义 Bridge 网络与隔离docker network create -d bridge --subnet "172.31.0.0/16" --gateway "172.31.0.1" user-netdocker run -itd --name t6 --net user-net busybox:latest /bin/shdocker exec -it t6 /bin/ship addrping -c 3 172.31.0.1ping -c 3 172.17.0.1exitdocker network create -d bridge --subnet "172.32.0.0/16" --gateway "172.32.0.1" user-net32docker run -itd --name t7 --net user-net32 busybox:latest /bin/shdocker exec -it t7 /bin/ship addrping -c 3 172.31.0.2exit# 清理docker rm -f t1 t2 t3 t4 t5 t6 t7 busybox01 busybox02docker network rm TestNet01 user-net user-net32docker network ls
六、实验总结
| 网络模式 | 特点 | 验证结果 |
|---|---|---|
| bridge | 默认,独立网络命名空间,通过 docker0 通信 | ✅ |
| none | 无网络,只有 lo 接口 | ✅ |
| container | 与另一容器共享网络命名空间,IP 完全相同 | ✅ |
| host | 直接使用宿主机网络,看到宿主机全部网卡 | ✅ |
| 自定义网络 | 子网 | 验证结果 |
|---|---|---|
| TestNet01 | 172.19.0.0/16 | 容器间可通信,断开后隔离,重连恢复 ✅ |
| user-net | 172.31.0.0/16 | 可访问自定义网关和宿主机 docker0 ✅ |
| user-net32 | 172.32.0.0/16 | 与 user-net 默认隔离,无法互通 ✅ |
核心结论:
- Docker 四种网络模式各有用途,bridge 最常用,host 性能最好但隔离性差,none 完全隔离,container 用于共享网络。
- 自定义 bridge 网络支持容器名 DNS 解析,比默认 bridge 网络更灵活。
- 不同自定义网络之间默认隔离,需要手动
connect才能互通。 docker network connect/disconnect可动态调整容器的网络连接。- 调试网络常用命令:
ip addr、ping、docker network inspect。
实验六完成。



