实验六:Docker 容器网络 完整报告

2026-09-21我也不知道取什么名字👁 1 阅读📝 1746 字12 分钟阅读💬 0 评论
实验六:Docker 容器网络 完整报告

实验六:Docker 容器网络 完整报告

一、实验目的

  1. 理解 Docker 的四种网络模式(bridge、container、host、none)及其特点;
  2. 掌握如何创建、连接、断开和查看 Docker 网络;
  3. 学会使用自定义网络实现容器间的通信与隔离;
  4. 掌握容器网络的基本调试方法。

二、实验环境

  • 笔记本直接安装的纯 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 网络

bash
docker network ls

输出:

text
NETWORK ID     NAME            DRIVER    SCOPE7fd7d421db1a   bridge          bridge    localb59eeae5a030   harbor_harbor   bridge    localb2f7e2fbd0c3   host            host      localc558956df84a   none            null      local

步骤 2:创建并查看不同网络模式的容器

1. Bridge 模式(默认)
bash
docker run -itd --name t1 --net bridge busybox:latest /bin/shdocker inspect t1 | grep NetworkMode -A 5

结果:"NetworkMode": "bridge"

2. None 模式
bash
docker 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 模式
bash
docker 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 模式
bash
docker run -itd --name t5 --net host busybox:latest /bin/shdocker inspect t5 | grep NetworkMode -A 5docker exec -it t5 /bin/ship addrexit

结果:"NetworkMode": "host",容器内显示宿主机全部网卡(wlo1docker0br-... 等) ✅


实验二:容器网络连接(Bridge 网络)

步骤 1:创建自定义网络

bash
docker network create TestNet01docker network lsdocker network inspect TestNet01

结果:TestNet01 自动分配子网 172.19.0.0/16,网关 172.19.0.1

步骤 2:启动两个容器并加入该网络

bash
docker run -itd --name busybox01 --network TestNet01 busybox:latestdocker run -itd --name busybox02 --network TestNet01 busybox:latestdocker ps | grep busybox

步骤 3:查看网络详情

bash
docker network inspect TestNet01

实际分配的 IP:

容器 IP
busybox01 172.19.0.2
busybox02 172.19.0.3

步骤 4:测试容器间通信

bash
docker 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:断开网络并测试

bash
docker 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:重新连接网络

bash
docker network connect TestNet01 busybox02docker exec -it busybox01 /bin/shping -c 3 172.19.0.3   # 恢复通信exit

结果:通信恢复 ✅


实验三:自定义 Bridge 网络与网络隔离

步骤 1:创建自定义 Bridge 网络

bash
docker network create -d bridge --subnet "172.31.0.0/16" --gateway "172.31.0.1" user-netdocker network ls

步骤 2:启动容器并测试

bash
docker 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:创建另一个自定义网络并测试隔离

bash
docker 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:容器名冲突

现象

text
docker: Error response from daemon: Conflict. The container name "/t1" is already in use by container "3471574600e4..."

原因:之前实验创建过 t1t2,容器已停止但记录还在,名称被占用。

解决

bash
docker rm -f t1 t2 t3 t4 t5

-f 强制删除,不管容器是否在运行。


问题 2:docker attach 无法连接已停止的容器

现象

text
cannot 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,显示 wlo1docker0 等宿主机接口。

原因ip addr 是 Linux 命令,在宿主机执行就是宿主机的网络。

解决:先进入容器再执行:

bash
docker 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。

解决

bash
ping -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 默认隔离,无法互通 ✅

核心结论

  1. Docker 四种网络模式各有用途,bridge 最常用,host 性能最好但隔离性差,none 完全隔离,container 用于共享网络。
  2. 自定义 bridge 网络支持容器名 DNS 解析,比默认 bridge 网络更灵活。
  3. 不同自定义网络之间默认隔离,需要手动 connect 才能互通。
  4. docker network connect / disconnect 可动态调整容器的网络连接。
  5. 调试网络常用命令:ip addrpingdocker network inspect

实验六完成。

我也不知道取什么名字
技术博客作者
1746 字 · 0 评论
2026-09-21

评论 (0)

暂无评论,来写第一条吧

登录后发表评论