本节摘要:自定义网络是容器互联的现行标准:network create 建网、run 或 connect 接入、内置 DNS 让容器名即主机名。本节用"应用连数据库"的完整现场走通全链路,覆盖成员查看、动态进出网络、闲置网络清理,并交代 --link 为什么进了历史词条。
两个容器要互访——应用找数据库、前端调后端——旧教程多半会让你敲 --link。这条词条已经进了历史的故纸堆:现行答案是自定义网络加内置 DNS。本节现场从建网开始,到按名字连通收尾,中间每个命令都可照敲。
docker network create [OPTIONS] 网络 # 建自定义网络 docker network connect 网络容器 # 把运行中容器接入网络 docker network disconnect 网络容器 # 把容器移出网络 docker network inspect 网络 # 查看网络详情与成员 docker network rm 网络 [网络...] # 删除网络(有成员时拒绝) docker network prune # 清理未被引用的网络
$ docker network create appnet a7b8c9d0e1f2... $ docker run -d --name pg --network appnet \ -e POSTGRES_PASSWORD=secret postgres:16 $ docker run -d --name api --network appnet myapi:2.0
应用代码里数据库地址直接写服务名:
DB_HOST=pg # 就是容器名,无需 IP、无需端口映射 DB_PORT=5432
验证名字解析与连通:
$ docker exec api ping -c 1 pg PING pg (172.20.0.2): 56 data bytes 64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.089 ms $ docker exec api getent hosts pg 172.20.0.2 pg a7b8c9
ping 通了,解析出来的地址是 Docker 在自定义网络里自动分配的私网地址。整个过程没有任何 -p 映射——数据库端口 5432 从宿主机完全不可达,只在 appnet 网络内部可达。这正是比"端口映射 + IP 地址"更安全的组网姿势:服务暴露面收窄到网络内部,外面想连也连不上。
注意 DNS 只对容器名、以及容器声明网络别名生效;解析由内置 DNS 承担,地址变更(容器重建换 IP)也不用改任何配置——名字不变,连接照旧。这是按名字互联最大的工程红利:配置与地址解耦。
$ docker network connect appnet debug-tool $ docker network inspect appnet --format '{{range .Containers}}{{.Name}} {{end}}' pg api debug-tool $ docker network disconnect appnet debug-tool
connect 的价值在于"运行中容器也能接入"——排查时临时把一个调试容器拉进网络,用完 disconnect 送走,业务容器全程无感。inspect 的容器清单是排错第一步:连不上时先看双方是否真的在同一张网里,这份清单比记忆可靠。
$ docker network rm oldnet oldnet $ docker network prune -f Deleted Networks: ci-net-20260831 tmp-test-net
rm 与 prune 补齐生命周期尾巴。Compose 项目网络(柒部)命名带项目前缀,项目下线后常有残留,prune 定期收拾。有成员在网内时 rm 会拒绝,先清理容器再删网。
旧命令长这样:
$ docker run -d --name api --link pg:database myapi:1.0 # 已淘汰写法
--link 做的事(名字解析加环境变量注入)如今全部由自定义网络原生覆盖,且更干净:不依赖启动顺序、不往环境变量里塞连接串、支持多网络多别名。见到老脚本里的 --link,改写公式固定:建一张网、双方接入、引用名改容器名。本册保留此词条仅作"读得懂旧配置"之用,新代码一律不写。
⚠️ 常见坑:容器重建后 IP 会变(自建网按序分配,先到先得),任何把 172.x 写死进配置或防火墙规则的做法都是在埋雷。锁定名字解析这条通道,别锁定地址。
本部词条覆盖单机场景。多台主机组成容器网络,靠的是 overlay 等驱动与集群层(如 Swarm 或专用的网络方案),在入门与绝大多数业务团队的日常里出场率有限,本册不展开词条,只在捌部排错现场提示一句:跨主机连不通时,先确认双方真的属于同一套网络方案,再用本部 inspect 逐段核对。
组网 experiment 结束后的收拾动作同样有词条:disconnect 把单个容器摘出网络,prune 批量清掉没有任何成员的闲置网络。
$ docker network disconnect appnet debug-box $ docker network prune -f Deleted Networks: lab-net appnet
prune 只清"空网"——还有成员的网络它不敢动,这层保守设计救过不少人的生产网。顺带回答一个高频疑问:删除网络报 error while removing network: has active endpoints,说明还有容器挂着,先逐个 disconnect 或直接 rm 容器,再删网。
💡 别名补一句:connect 时可以用 --alias 给容器在网络内再起一个对外名字,比如把主从数据库都接到别名 db 上,应用只认别名不认具体实例——故障切换时换容器不换名字,应用配置一行不用动。
单机的网络词条到此收束。当容器多到 run 命令写不完时,就该把整组服务交给声明文件——柒部 Compose 编排部开讲。