章节摘要:容器默认能上网却彼此陌生,要让服务之间互通,得请出网络命令族。本部把网络词条编成两部分:网络模式速览回答"容器以什么身份上网"(bridge、host、none、macvlan 各自的隔离面与适用场景);自定义网络现场回答"怎么让容器按名字互相访问"(network create、connect、inspect 与内置 DNS)。学完本部,容器互联不再靠暴露端口硬凑,而是按名字组网。
阅读完本部,你应当能够:
金句:默认网络里容器是门牌号邻居,自定义网络里才是叫得出名字的同事。
6.1 网络模式词条速览:docker network ls 起步,逐个看 bridge、host、none、macvlan 的接入方式与隔离代价。重点是"默认 bridge 与自定义 bridge 行为不同"这一最易踩的认知差。
6.2 自定义网络与容器互联现场:从 create 到按名字互访的完整会话。应用容器连数据库容器只写一个服务名即可,名字解析、成员查看、退出网络、清理闲置网络一并给全。
6.1 是认知底座(容器在世界里的身份),6.2 是操作主场(让容器互相认识):
+---------------------+ +----------------------+ | 6.1 网络模式速览 | --> | 6.2 自定义网络现场 | | bridge/host/none | | create/connect | | 隔离面与代价 | | 内置 DNS 按名互访 | +---------------------+ +----------------------+ | | +--- 叁部 -p 端口映射是 bridge 出网的手段 ----+
问:容器连不上外网,先查什么? 先看 network inspect 里容器在不在网内、领到的地址与网段对不对,再看宿主机自身的出口与 DNS(容器的 DNS 继承宿主机配置)。多数"容器断网"案例最后查出来是宿主机代理或防火墙,不是 Docker 的锅。
问:-p 写了端口还是访问不了? 依次核对三处:宿主机防火墙放行了吗;-p 绑的是 0.0.0.0 还是 127.0.0.1(后者只有本机能访问);服务在容器里监听的是 0.0.0.0 还是 localhost(监听 localhost 的服务映射了也进不去)。三处都对过,再考虑 host 模式误配 -p 的可能。
问:一个容器能同时在多个网络里吗? 能。connect 可以把容器接进多张网,它在每张网里各有一个地址——这正是"前端网络与后端网络分离"做安全分层的基础,6.2 现场会跑一遍。
问:自建网络多了会不会乱? 会。network ls 里自己建的网络用完即删(prune 词条在 6.2 收尾);命名带项目前缀是好习惯——Compose 自动建的网络都以项目名为前缀,用的正是这个思路。
前置:叁部 3.2 的端口组选项(-p 与 --network 的首秀在那里),本部解释其背后的网络语义。延伸:柒部 Compose 会为项目自动创建自定义网络——学完本部再看 Compose 起的服务互相按名字调用,原理一目了然;捌部排错里"连不上数据库"案例的第一取证命令正是本部的 inspect。过关自测:给你应用与数据库两个容器,你能在不暴露任何数据库端口的前提下让应用连上它,并说出这期间谁负责名字解析。