【Docker】网络介绍

📅 2026/7/17 1:09:54
【Docker】网络介绍
【Docker】网络介绍【一】底层核心原理1. Linux 底层支撑技术2. 数据流转简单流程桥接模式默认【二】Docker 内置 5 种网络驱动1. bridge 默认网桥docker02. 自定义 bridge生产首选3. host 主机网络4. none 无网络5. container 复用容器网络【三】网络常用操作创建、查看、连接、删除1. 查看所有网络2. 创建自定义网桥重点3. 启动容器时指定网络方式 1创建容器直接加入自定义网络方式 2host 主机网络方式 3none 无网络方式 4复用其他容器网络4. 容器运行后动态连接 / 断开网络5. 删除网络【四】端口映射原理-p1. 两种写法底层原理【五】不指定 --network 时默认行为1底层环境2完整场景演示3生产环境结论【六】容器间通信规则【七】跨主机 Docker 网络Overlay简单补充【八】生产最佳实践总结【一】底层核心原理1. Linux 底层支撑技术Docker 网络完全基于 Linux 内核四大技术实现Network Namespace网络命名空间内核隔离技术每个容器拥有独立网络栈独立网卡、IP、路由表、iptables、端口、DNS。容器与宿主机、其他容器网络默认隔离相当于一台独立虚拟机网络环境。veth pair虚拟网线一对成对虚拟网卡一端宿主机网桥一端容器 namespace实现宿主机 ↔ 容器数据互通。Linux Bridge虚拟网桥宿主机虚拟交换机多个 veth 网卡挂载到网桥同网桥下容器二层互通。iptables / netfilter端口映射、SNAT/DNAT、访问控制、内外网转发、隔离策略全部依靠 iptables 规则实现。路由转发 ip_forward宿主机开启内核转发容器才能访问外网。2. 数据流转简单流程桥接模式默认容器内程序发包 → 容器内 eth0veth 一端通过 veth pair 转发到宿主机网桥 docker0网桥转发给同网络其他容器 / 交给宿主机网卡访问外网时 iptables 做 SNAT 源地址转换走宿主机物理网卡出去外部访问容器端口iptables DNAT 转发流量到容器内部 IP 端口【二】Docker 内置 5 种网络驱动执行docker network ls可查看默认网络表格网络类型驱动用途默认创建桥接网络bridge单机容器互通最常用自动创建bridgedocker0主机网络host容器共享宿主机网卡无隔离不默认创建手动使用无网络none容器完全禁用网络隔离自动创建none容器互联container复用另一个容器网络栈无需提前创建运行时指定自定义网桥bridge推荐生产使用自定义网段、DNS、隔离分组手动docker network create创建1. bridge 默认网桥docker0宿主机开机启动 docker 自动创建虚拟网桥 docker0网段默认172.17.0.0/16不指定网络的容器默认接入 docker0同 docker0 容器之间可以通过容器名 / IP 互相访问外部访问容器需要-p 宿主机端口:容器端口端口映射缺点多项目容器混在同一网段无隔离无法自定义网段复杂环境混乱。生产不建议直接用默认 docker0推荐自定义 bridge。2. 自定义 bridge生产首选和默认 bridge 原理一致但支持自定义网段、子网、网关、标签实现项目网络隔离。同一自定义网络内容器可直接用容器名称互相解析访问跨自定义网络默认不通。3. host 主机网络容器不创建独立 network namespace直接复用宿主机物理网卡、IP、端口。优势无端口转发损耗性能极高缺点无网络隔离容器直接占用宿主机端口多服务端口冲突风险大无法端口映射-p失效适用高性能中间件如 k8s node、监控采集、网关4. none 无网络容器只有 lo 本地回环网卡无任何外部网络完全隔离。适用纯本地计算、安全离线任务。5. container 复用容器网络新容器共享已有容器的 network namespace共用同一张网卡、同一个 IP。用法--network container:容器ID/名称适用sidecar 边车容器日志采集、监控代理和主容器共享网络。【三】网络常用操作创建、查看、连接、删除1. 查看所有网络docker network ls # 查看网络详情网段、挂载容器、配置 docker network inspect 网络名/ID2. 创建自定义网桥重点基础语法docker network create [参数] 网络名称常用参数--subnet自定义子网网段--gateway网关地址--driver bridge指定网桥驱动默认-d overlay跨主机集群网络Swarm--attachable允许容器后期动态接入网络示例创建业务专属网络 app-net# 指定网段 172.20.0.0/16网关172.20.0.1 docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 app-net3. 启动容器时指定网络方式 1创建容器直接加入自定义网络# 容器web加入app-net映射8080端口 docker run -d --name web --network app-net -p 8080:80 nginx # mysql 同网络和web互通 docker run -d --name mysql --network app-net -e MYSQL_ROOT_PASSWORD123456 mysql:5.7此时 web 容器可直接用mysql作为域名连接数据库Docker 内置 DNS 自动解析容器名。方式 2host 主机网络# 共享宿主机网络无需-p端口映射 docker run -d --name agent --network host prom/node-exporter方式 3none 无网络docker run -it --name offline --network none centos方式 4复用其他容器网络# 复用web容器网络栈 docker run -it --name sidecar --network container:web busybox4. 容器运行后动态连接 / 断开网络容器启动后可以中途加入其他网络实现跨网络互通# 将已存在容器连接到指定网络 docker network connect app-net web # 断开容器与网络 docker network disconnect app-net web5. 删除网络# 删除闲置网络无容器挂载才能删除 docker network rm app-net # 清理所有未使用网络 docker network prune【四】端口映射原理-p1. 两种写法# 宿主机所有网卡 8080 → 容器80 -p 8080:80 # 指定宿主机IP 192.168.1.100:8080 → 容器80 -p 192.168.1.100:8080:80 # 随机宿主机端口映射容器80 -p :80底层原理Docker 自动在宿主机 iptables 添加 DNAT 规则外部请求访问宿主机 IP:8080 → iptables 转发到容器内部 IP:80容器回包时做 SNAT修改源地址为宿主机网桥地址host 网络模式不经过端口映射直接监听宿主机端口【五】不指定 --network 时默认行为执行docker run不加--network xxx容器会自动接入 Docker 默认网桥bridge宿主机虚拟网卡 docker0。1底层环境自动分配172.17.0.0/16网段内一个空闲 IP网关为172.17.0.1docker0 网桥地址自动创建一对 veth pair 虚拟网卡一端挂 docker0一端进容器网络命名空间容器拥有独立网络栈和宿主机、其他容器隔离。1能做什么同属默认 bridge 的容器可以互通所有没指定自定义网络的容器都在 docker0 网段互相之间可以通过容器 IP 访问。容器能访问外网Docker 自动配置 iptables SNAT 规则容器流量经过宿主机转发访问互联网。宿主机可以访问容器只要启动时加-p 宿主机端口:容器端口做端口映射外部 / 宿主机就能访问容器服务。宿主机内部可直接 ping 容器内部 IP。2关键限制和自定义 bridge 最大区别默认 bridge 不支持 Docker DNS 容器名解析这是最核心痛点自定义 bridge同网络容器可以直接用容器名称互相访问如curl nginx默认 docker0 bridge只能用 IP 访问容器名无法解析。示例# 两个容器都不指定网络都在默认bridgedockerrun-d--nameng nginxdockerrun-it--namebus busybox# bus 里 ping ng 会失败域名解析失败pingng# 只能 ping ng 的容器IP才能通3无法和自定义 bridge 网络互通假设A 容器未指定网络 → 默认 bridge (docker0)B 容器加入自定义网络 app-net两者默认完全隔离互相 ping 不通。想要互通只能手动执行dockernetwork connect bridge B容器名# 或dockernetwork connect app-net A容器名4网段不可自定义默认网段固定172.17.0.0/16不能修改子网、网关多业务混在一起无网络隔离容易 IP 冲突、维护混乱。5无业务分组隔离所有不指定网络的容器挤在同一个大网段测试、预发、业务容器混在一起安全边界模糊。2完整场景演示# 容器1不指定网络进默认bridgedockerrun-d--nameweb nginx# 容器2不指定网络同默认bridgedockerrun-it--nametestbusybox# 1. test ping web IP 能通# 2. test ping web 容器名 解析失败# 3. 新建一个自定义网络容器 mysqltest 和 mysql 互相不通3生产环境结论本地临时测试、一次性容器可以不指定网络省事正式业务服务必须创建自定义 bridge 并手动 --network 指定支持容器名称 DNS 互通业务网络隔离可自定义网段、网关方便权限、访问控制分组。【六】容器间通信规则同一自定义 bridge 网络容器之间互通Docker DNS 解析容器名称直接使用容器名访问无需 IP。不同自定义 bridge 网络默认隔离互相不通如需互通用docker network connect将容器加入对方网络。默认 docker0 网桥容器同网段互通但无法和自定义 bridge 容器互通。host 模式容器可直接访问宿主机所有服务、所有网段容器。none 网络只能访问自身 127.0.0.1无法和任何外部通信。【七】跨主机 Docker 网络Overlay简单补充前面所有 bridge 仅限单台宿主机容器互通多台服务器容器互通使用overlay驱动依赖 Docker Swarm初始化 swarm 集群docker swarm init创建 overlay 网络docker network create -d overlay swarm-net不同节点容器加入 swarm-net 即可跨服务器通信底层基于 VXLAN 隧道技术封装 UDP 数据包跨物理主机传输。【八】生产最佳实践总结禁止直接使用默认 docker0每个业务项目单独创建自定义 bridge 网络实现环境隔离所有业务容器统一加入同一张自定义网络利用容器名 DNS 互通无需写死 IP数据库、中间件容器不暴露外网端口仅同网络业务容器访问提升安全高性能采集组件使用host网络普通 web / 数据库使用自定义 bridge离线计算类容器使用none网络缩小攻击面禁止容器以 roothost 网络运行对外服务风险极高。