5.1 容器网络模式:四种泊位类型


5.1 容器网络模式:四种泊位类型

本节摘要:航道系统总览——bridge(默认内港)、host(贴岸直靠)、none(封闭泊位)、overlay(跨港航线)。本节讲清四种模式的机制与取舍,以及容器端口与宿主机端口之间那条泊位规则(-p)的完整语义。

孤箱为什么上不了系统

上一章的箱子单打独斗没问题,本章开头的任务书要求它"入编"。入编第一关是网络:容器默认活在引擎划出的内港里,宿主机以外的世界看不到它,它也找不到同港的邻居。本节先把整个航道系统的地图铺开。

看一眼引擎已经建好的航道设施:

# 查看引擎的全部航道(网络) docker network ls # NETWORK ID NAME DRIVER SCOPE # a1b2c3d4e5f6 bridge bridge local <- 默认内港 # 7c8d9e0f1a2b host host local <- 贴岸直靠 # 3e4f5a6b7c8d none null local <- 封闭泊位

三条出厂自带航道,加上跨港用的 overlay,就是本节的四种泊位类型。

图 5-1:四种网络模式的航道对比

图 5-1:四种网络模式的航道对比

四种模式逐一验船

bridge:默认内港。 不指定网络的容器全部落在 bridge 里:引擎建了一张虚拟交换机(网桥),每只容器接一条虚拟网线、分一个内网地址(通常 172 开头)。容器出港访问外网走地址伪装(把内网地址换成宿主机地址再发出去);外网进港则必须走泊位映射——这正是 -p 参数的完整语义:

# 泊位映射:宿主机 8080 泊位的访客,由引擎引到容器内港的 80 泊位 docker run -d --name berth-demo -p 8080:80 nginx:1.25-alpine # 验证泊位绑定(从宿主机视角) docker port berth-demo # 80/tcp -> 0.0.0.0:8080 # 细粒度写法:只绑本机回环地址(管理界面类服务推荐,不暴露到外网) docker run -d --name berth-admin -p 127.0.0.1:8081:80 nginx:1.25-alpine

内港的内部结构也值得看一眼——每只箱子的网络视图:

# 进容器看自己的网卡:只有一条内网网线(eth0)和一个孤回环(lo) docker exec berth-demo ip addr # 1: lo: <LOOPBACK,UP,LOWER_UP> ... 127.0.0.1 # 62: eth0@if63: <BROADCAST,MULTICAST,UP,LOWER_UP> ... 172.17.0.2 # 这就是命名空间隔离的网络面:箱子看不见宿主机和其他箱子的网卡 # 从宿主机侧看默认内港的配置段(子网与网关) docker network inspect bridge --format "子网: {{range .IPAM.Config}}{{.Subnet}}{{end}} 网关: {{range .IPAM.Config}}{{.Gateway}}{{end}}" # 子网: 172.17.0.0/16 网关: 172.17.0.1 # 网桥自身占网关位,箱子们从这个子网里依次领地址

host:贴岸直靠。 容器不建独立网络栈,直接用宿主机的:监听什么端口就真的占宿主机什么端口,没有映射层,网络性能最好,隔离性最差。单机跑对延迟极端敏感的服务可以选它,代价是端口冲突要自己当心、隔离边界形同虚设。

none:封闭泊位。 只有一条孤回环,不接任何航道。安全要求极高的离线作业(跑批、解密、一次性计算)用它,配合 4.3 的 exec 旁路完成"进料—加工—出料"的封闭作业。

overlay:跨港航线。 把不同宿主机上的容器接进同一个逻辑网络,靠隧道封装实现跨机通信。单机用不上它,但它是第 7 章集群与编排的地基——到时你会看到它自动被编排系统接管。

四种之外还有个了解即可的 macvlan:给容器直接分配宿主机局域网里的物理地址,像给箱子办了一张实体工牌——个别需要直接融入物理网络的老设备通信场景才用得上,日常业务避开它(与宿主机网络的边界纠缠不清,管理成本高)。

泊位规则(-p)的进阶语义

泊位映射有几个容易误会的细节。其一,-p 8080:80 的左边永远是宿主机侧;其二,不写宿主机端口(-p 80)等于让引擎自动挑高位泊位,适合并行起多只同款箱子;其三,UDP 要显式声明协议(-p 53:53/udp)。验证自动分配:

# 自动泊位:引擎随机挑一个高位端口 docker run -d --name berth-auto -P nginx:1.25-alpine docker port berth-auto # 80/tcp -> 0.0.0.0:32768 <- 引擎自动分配的高位泊位

现场对照:三只箱子各停在哪

光看图不够硬,把三种单机泊位各停一只箱子,用一条命令对照它们的网络视图:

# 三只演示箱子,分别停进三种泊位(overlay 需多机环境,第 7 章再见) docker run -d --name m-bridge nginx:1.25-alpine docker run -d --name m-host --network host nginx:1.25-alpine docker run -d --name m-none --network none nginx:1.25-alpine # 逐只查档:网络模式与领到的地址 docker inspect m-bridge --format "{{.Name}} 模式:{{.HostConfig.NetworkMode}} 地址:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" # /m-bridge 模式:default 地址:172.17.0.2 <- 内港子网里领了号 docker inspect m-host --format "{{.Name}} 模式:{{.HostConfig.NetworkMode}}" # /m-host 模式:host <- 没有独立地址:直接共用宿主机网络栈 docker inspect m-none --format "{{.Name}} 模式:{{.HostConfig.NetworkMode}}" # /m-none 模式:none <- 孤回环,无地址

host 与 bridge 的行为差异可以用端口当场钉死。m-host 不写任何映射参数,却直接占住了宿主机的 80 泊位;m-bridge 不写 -p 时,宿主机以外完全看不见它:

# host 箱子原生可达:没有 -p,宿主机端口直接就是它的端口 curl -s -o /dev/null -w "%{http_code}\n" http://localhost # 200 # (若宿主机 80 已被占用,m-host 连起吊都会失败——这正是 host 模式端口自担的代价) # 演习完清场 docker rm -f m-bridge m-host m-none

选型口径由此收拢成一句:默认 bridge,图省心;要性能上 host,自己扛端口冲突;要绝对隔离用 none;跨机才轮到 overlay

本节要点回顾

  • 四种泊位:bridge 默认隔离内港、host 直用宿主栈、none 封闭作业、overlay 跨机航线。
  • bridge 出港走地址伪装,进港必须泊位映射;-p 左边是宿主机侧。
  • 管理类服务用 127.0.0.1 前缀绑定泊位,不暴露公网。
  • host 模式性能最好、隔离最差,端口冲突自担;none 是安全跑批的标准选择。
  • overlay 是多机组网地基,单机用不上但编排查将依赖它。

航道地图在心,下一节组建船队:自定义网络里,容器名就是域名。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U