Docker实战:网络管理

文章目录

  • [1. 实战概述](#1. 实战概述)
  • [2. 实战步骤](#2. 实战步骤)
    • [2.1 查看虚拟网桥](#2.1 查看虚拟网桥)
      • [2.1.1 查看容器信息](#2.1.1 查看容器信息)
      • [2.1.2 查看网络接口信息](#2.1.2 查看网络接口信息)
      • [2.1.3 安装网桥工具包](#2.1.3 安装网桥工具包)
      • [2.1.4 查看虚拟网桥信息](#2.1.4 查看虚拟网桥信息)
    • [2.2 网络模式](#2.2 网络模式)
      • [2.2.1 host模式](#2.2.1 host模式)
        • [2.2.1.1 host模式概述](#2.2.1.1 host模式概述)
        • [2.2.1.2 host模式实战](#2.2.1.2 host模式实战)
      • [2.2.2 container模式](#2.2.2 container模式)
        • [2.2.2.1 container模式概述](#2.2.2.1 container模式概述)
        • [2.2.2.2 container模式实战](#2.2.2.2 container模式实战)
      • [2.2.3 none模式](#2.2.3 none模式)
        • [2.2.3.1 none模式概述](#2.2.3.1 none模式概述)
        • [2.2.3.2 none模式实战](#2.2.3.2 none模式实战)
      • [2.2.4 bridge模式](#2.2.4 bridge模式)
        • [2.2.4.1 bridge模式概述](#2.2.4.1 bridge模式概述)
        • [2.2.4.2 bridge模式实战](#2.2.4.2 bridge模式实战)
      • [2.2.5 四种模式对比](#2.2.5 四种模式对比)
    • [2.3 容器互联](#2.3 容器互联)
      • [2.3.1 容器互联概述](#2.3.1 容器互联概述)
      • [2.3.2 容器互联实战](#2.3.2 容器互联实战)
    • [2.3 容器访问互联网](#2.3 容器访问互联网)
      • [2.3.1 容器访问互联网概述](#2.3.1 容器访问互联网概述)
      • [2.3.2 容器访问互联网实战](#2.3.2 容器访问互联网实战)
      • [2.3.3 四种模式访问互联网总结](#2.3.3 四种模式访问互联网总结)
  • [3. 实战总结](#3. 实战总结)

1. 实战概述

  • 本次实战系统验证了 Docker 四种网络模式(bridge、host、none、container)的特性,包括容器间互联、互联网访问能力及底层网络结构。通过创建自定义网络 hwnet,实现基于容器名的 DNS 通信,并对比各模式在隔离性、性能与连通性上的差异,全面掌握 Docker 网络工作机制。

2. 实战步骤

2.1 查看虚拟网桥

2.1.1 查看容器信息

  • 执行命令:docker ps -a
  • 结果说明 :该命令显示了系统中所有容器的运行状态,结果表明有两个容器(web1 和 web3)已成功启动并持续运行。它们均基于 alpine:3.19 镜像,执行命令为 sleep infinity,状态为"Up",说明容器处于活跃状态,可用于后续网络或服务测试。

2.1.2 查看网络接口信息

  • 执行命令:ip link show
  • 结果说明 :该命令显示了系统中所有网络接口的信息,其中 docker0 是 Docker 创建的虚拟网桥,处于 UP 状态,MAC 地址为 02:42:32:d9:83:c0,用于连接容器与宿主机网络。其下挂载了多个 veth 对(如 veth7eb1d@if42),实现容器与网桥的通信,表明 Docker 网络已正常配置并运行。

2.1.3 安装网桥工具包

  • 执行命令:yum -y install bridge-utils
  • 结果说明 :该命令成功安装了 bridge-utils 软件包,系统从默认仓库下载并安装了版本为 1.7.1-3.oe2509 的工具包,包含 brctl 等网桥管理命令。安装过程顺利完成,事务检查与验证均通过,最终提示"Complete!",表明网络桥接工具已就绪,可用于配置和管理 Linux 虚拟网桥。

2.1.4 查看虚拟网桥信息

  • 虚拟网桥 :Docker 的虚拟网桥(默认为 docker0)是 Docker 守护进程创建的 Linux 网桥,用于实现容器与宿主机、容器之间的网络通信。每个容器通过 veth 虚拟网卡对连接到该网桥,获得独立 IP 并处于同一二层网络,默认使用 NAT 与外部通信,是 Docker 默认网络驱动(bridge 模式)的核心组件。
  • 执行命令:brctl show
  • 结果说明 :该命令成功执行 brctl show,显示当前系统中存在名为 docker0 的虚拟网桥,其桥接 ID 为 8000.024232b983c0,STP(生成树协议)未启用。网桥下挂载了两个 veth 接口:veth0b411cveth87eb1d,表明 Docker 容器已通过这些接口连接到网桥,实现容器间的网络通信。

2.2 网络模式

2.2.1 host模式

2.2.1.1 host模式概述
  • Docker 的 host 网络模式下,容器共享宿主机的网络命名空间 ,不创建虚拟网卡或 NAT,直接使用宿主机的 IP 和端口。容器内服务监听的端口即为宿主机端口,网络性能高、延迟低,但失去网络隔离性,且端口易冲突,适用于对性能敏感或需直接暴露服务的场景。
2.2.1.2 host模式实战
  1. 启动host模式容器

    • 执行命令:docker run -d --name web-host --network host nginx
  2. 查看进程监听端口(无需端口映射)

    • 执行命令:ss -tuln | grep :80
    • 结果说明 :该命令显示了宿主机上监听 80 端口的进程,结果表明 TCP 协议下,端口 80 正在监听所有 IP 地址(0.0.0.0:80[::]:80),对应 PID 为 511 的进程。结合上下文,此进程即为 web-host 容器中运行的 Nginx 服务,说明容器已成功以 host 模式启动并绑定宿主机 80 端口,网络通信正常。
  3. 宿主机访问Nginx首页

    • 执行命令:curl http://euler:80
    • 执行命令:curl http://euler,不写端口80
  4. Windows访问Nginx首页

    • 在浏览器里访问http://euler

2.2.2 container模式

2.2.2.1 container模式概述
  • Docker 的 container 网络模式允许新容器共享另一个已存在容器的网络命名空间,两者共用 IP、端口、路由表等网络资源,如同运行在同一容器中。该模式适用于需要紧密网络协作但隔离文件系统或进程的场景,如 sidecar 代理、调试工具容器等,实现"网络合一、其他隔离"的灵活架构。
2.2.2.2 container模式实战
  1. 启动主容器(被共享网络的容器)

    • 执行命令:docker run -d --name main-nginx nginx
  2. 启动共享网络的容器

    • 执行命令:docker run -it --network container:main-nginx --name debug-tools alpine:3.19 sh
  3. 验证网络共享效果

    • 执行命令:ip addr
    • 执行命令:wget -qO- http://localhost:80,直接访问localhost:80(即main-nginx服务)
    • 结果说明 :输出返回 Nginx 欢迎页 HTML,证明两个容器共享同一网络栈
  4. 对比独立容器

    • 若另启一个普通容器访问 main-nginx,需通过 Docker 虚拟 IP(如 172.17.0.x),而 container 模式可直接用 localhost无需暴露端口或配置链接

2.2.3 none模式

2.2.3.1 none模式概述
  • Docker 的 none 网络模式为容器禁用所有网络功能 ,不配置网卡、IP 地址、路由或 DNS,仅保留回环接口(lo)。容器完全与外部网络隔离,适用于运行无需网络通信的离线任务、安全敏感型应用或自定义网络栈的场景,是 Docker 中隔离性最强的网络模式。
2.2.3.2 none模式实战
  1. 启动none模式容器
    • 执行命令:docker run -d --name isolated --network none alpine:3.19 sleep infinity
  2. 验证网络状态
    • 执行命令:docker exec isolated ip addr
    • 结果说明 :该命令显示了 isolated 容器的网络接口信息,仅存在回环接口 lo(127.0.0.1/8 和 ::1/128),无任何物理或虚拟网卡(如 eth0),说明容器处于 none 网络模式下,完全隔离于外部网络 。此时容器无法访问互联网或被外部访问,仅能进行本地进程通信,验证了 none 模式"断网"特性。
    • 执行命令:docker exec isolated ping -c2 8.8.8.8
    • 结果说明 :该命令尝试在 isolated 容器中 ping 8.8.8.8,返回"Network unreachable",说明容器无法访问外部网络。结合其使用 none 网络模式的配置,验证了该模式下容器完全隔离,无路由、无网关、无对外连接能力,仅保留本地回环接口,符合"断网"设计预期,适用于安全或离线任务场景。

2.2.4 bridge模式

2.2.4.1 bridge模式概述
  • Docker 的 bridge 模式是默认网络模式 ,容器通过虚拟网桥 docker0 连接宿主机,每个容器拥有独立的网络命名空间、私有 IP 地址(如 172.17.0.x)和虚拟网卡(veth pair)。容器间可通过 IP 通信,对外访问依赖 NAT,外部访问需显式端口映射(-p)。该模式在隔离性与连通性之间取得平衡,适用于大多数单机应用部署场景。
2.2.4.2 bridge模式实战
  1. 启动 bridge 模式容器(默认即为此模式)
    • 执行命令:docker run -d --name web-bridge -p 8080:80 nginx,未指定 --network 时,默认使用 bridge 网络
    • 结果说明 :该命令成功启动了一个名为 web-bridge 的 Nginx 容器,使用默认的 bridge 网络模式,并将宿主机的 8080 端口映射到容器的 80 端口。输出中的长字符串为容器 ID,表明容器已创建并运行。后续可通过 curl http://localhost:8080 访问服务,验证端口映射与网络连通性正常。
  2. 查看网络配置
    • 执行命令:docker inspect -f '{``{range .NetworkSettings.Networks}}{``{.IPAddress}}{``{end}}' web-bridge,查看容器IP地址
    • 执行命令:docker port web-bridge,查看宿主机端口映射
    • 结果说明 :该命令显示了容器 web-bridge 的端口映射信息,表明容器内 80 端口被映射到宿主机的 8080 端口(IPv4 和 IPv6 均支持)。说明 Docker 已正确配置 NAT 规则,外部可通过 http://<宿主机IP>:8080 访问容器中的 Nginx 服务,验证了 bridge 模式下端口映射功能正常。
  3. 验证网络连通性
    • 执行命令:curl http://localhost:8080,从宿主机访问Nginx服务
    • 在Windows浏览器里访问http://euler:8080
    • 执行命令:docker run --rm alpine:3.19 wget -qO- http://172.17.0.5,在另一个容器中通过IP访问该容器
  4. 查看底层网络结构
    • 执行命令:ip addr show docker0,在宿主机上查看docker0网桥
    • 执行命令:ip link | grep veth,查看 veth 接口(连接容器与网桥)
    • 结果说明 :该命令输出显示了宿主机上多个 veth 虚拟网卡接口,它们是 Docker 容器与 docker0 网桥之间的连接通道。每个 veth 接口一端连接容器(在容器内为 eth0),另一端挂载到 docker0 网桥,实现容器与宿主机的网络通信。这些接口的存在验证了 bridge 模式下虚拟网络的构建机制。

2.2.5 四种模式对比

特性 bridge host none container
独立 IP ✅(如 172.17.0.x) ❌(共享宿主机 IP) ❌(共享目标容器的 IP)
端口映射(-p) 需显式映射 无效(直接暴露) 不支持 无效(共享目标容器端口)
网络隔离 中等(独立命名空间) 最强 与目标容器共享,其他容器隔离
性能 有 NAT 和虚拟网桥开销 高(无虚拟化) --- 与目标容器一致(无额外开销)
典型用途 默认开发/测试环境 高性能服务、监控 离线任务 Sidecar、调试工具、网络代理

2.3 容器互联

2.3.1 容器互联概述

  • Docker 容器互联指多个容器之间通过网络进行通信的能力。默认 bridge 网络下容器可通过 IP 互访,但不支持自动服务发现;推荐使用自定义 bridge 网络,支持容器名 DNS 解析、网络隔离与更佳安全性。互联是构建多服务应用(如 Web + DB)的基础。

2.3.2 容器互联实战

  1. 创建自定义bridge网络

    • 执行命令:docker network create hwnet
  2. 启动两个容器加入同一网络

    • 执行命令:docker run -d --name db --network hwnet -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0,启动MySQL容器

    • 执行命令:docker run -d --name web --network hwnet alpine:3.19 sleep infinity,启动Web容器

  3. 进入 web 容器中访问 db

    • 执行命令:docker exec -it web sh
    • 执行命令:ping -c4 db
    • 结果说明 :该命令在 web 容器中执行 ping db,成功解析 db 为 IP 地址 172.18.0.2,并完成 4 次 ICMP 请求,往返时间稳定,丢包率为 0%,表明两个容器通过自定义网络 hwnet 实现了正常通信,验证了 Docker 容器间基于名称的 DNS 解析与网络互联功能有效。

2.3 容器访问互联网

2.3.1 容器访问互联网概述

  • Docker 容器默认通过 NAT(网络地址转换) 访问互联网:容器流量经 docker0 网桥转发,由宿主机内核的 iptables 规则进行 SNAT 转换,源 IP 替换为宿主机 IP 后发出。该机制依赖宿主机的 IP 转发功能和 NAT 规则,适用于 bridge 模式;host 模式直接共享宿主机网络,无需 NAT 即可访问互联网

2.3.2 容器访问互联网实战

  1. bridge模式访问互联网
    • 执行命令:docker run -it --rm alpine:3.19 sh,启动一个临时容器
    • 执行命令:ping -c4 www.baidu.com,测试互联网连通性
    • 结果说明 :该命令在容器中执行 ping www.baidu.com,成功解析域名并返回 IP 地址 183.2.172.177,四次 ICMP 请求均收到响应,丢包率为 0%,往返时间稳定,表明容器通过 NAT 模式正常访问互联网,验证了 Docker 默认 bridge 网络下容器对外通信功能正常。
  2. host模式访问互联网
    • 执行命令:docker run -it --rm --network host alpine:3.19 sh
    • 执行命令:ping -c4 www.baidu.com,测试互联网连通性
    • 结果说明 :该命令在 host 网络模式下运行容器并执行 ping www.baidu.com,成功解析域名并返回 IP 地址 183.2.172.177,四次请求全部响应,丢包率为 0%,TTL 为 128,表明容器直接使用宿主机网络栈,无需 NAT 即可访问互联网,验证了 host 模式下网络性能高、连通性良好的特性。
  3. container模式访问互联网
    • 执行命令:docker run -it --network container:main-nginx alpine:3.19 sh
    • 执行命令:ping -c4 www.baidu.com,测试互联网连通性
    • 结果说明 :该命令启动一个容器,使用 --network container:main-nginx 共享主容器的网络命名空间,并成功执行 ping www.baidu.com,返回 IP 183.2.172.177,四次请求均响应,丢包率为 0%,TTL 为 127,表明容器通过共享网络栈正常访问互联网,验证了 container 模式下网络能力完全继承自目标容器。
  4. none 模式无法访问互联网(验证隔离性)
    • 执行命令:docker run -it --rm --network none alpine:3.19 sh
    • 执行命令:ping -c4 8.8.8.8,测试互联网连通性
    • 结果说明 :该命令在 none 网络模式下运行容器,执行 ping 8.8.8.8 时返回"Network unreachable",说明容器无网络接口、无路由配置,完全与外部网络隔离。验证了 none 模式下容器无法访问互联网,仅保留回环接口,适用于安全或离线任务场景。

2.3.3 四种模式访问互联网总结

网络模式 是否能访问互联网 机制
bridge(默认) ✅ 能 通过 docker0 + NAT
host ✅ 能 直接使用宿主机网络
none ❌ 不能 无网络接口
container 取决于目标容器 共享其网络能力

3. 实战总结

  • 本次实战深入探究了 Docker 网络核心机制:bridge 模式 通过 docker0 网桥和 NAT 实现容器内外通信,默认支持端口映射;host 模式 共享宿主机网络栈,性能高但无隔离;none 模式 彻底断网,适用于安全敏感场景;container 模式 复用目标容器网络,便于调试与 sidecar 架构。通过自定义 bridge 网络 hwnet,成功实现容器间基于名称的 DNS 解析与稳定通信,验证了服务发现能力。同时,四种模式对互联网访问行为各异:bridge 和 host 可正常上网,none 完全隔离,container 则继承目标容器的网络能力。实验结果表明,合理选择网络模式对构建安全、高效、可维护的容器化应用至关重要。
相关推荐
ℳ₯㎕ddzོꦿ࿐2 小时前
零基础教程:在 Linux 上通过 Docker 快速部署 Dify
linux·运维·docker·dify
hanzhuhuaa2 小时前
Docker的网络配置,导致Docker使用网路很慢的问题及解决办法
docker·容器·eureka
这就是佬们吗2 小时前
一文讲清---ELK搭建
java·笔记·elk·docker·容器
Filotimo_2 小时前
在java后端开发中,docker虚拟化容器用处
java·开发语言·docker
Java程序员-小白2 小时前
使用Docker安装MySQL
mysql·docker·容器
峰顶听歌的鲸鱼2 小时前
17.docker:监控及日志
linux·运维·docker·容器·云计算
眠りたいです3 小时前
Docker:镜像的运行实体-Docker Container
java·运维·c++·docker·容器·eureka
刘个Java3 小时前
手搓遥控器通过上云api执行航线
java·redis·spring cloud·docker
balalawb3 小时前
docker构建镜像并上传到服务器
服务器·docker