Docker 自定义网络

默认 bridge 上容器只能靠 IP 互访,而容器重建后 IP 会变化,很不方便。自定义网络自带 DNS 解析,容器之间可以直接用「名字」互访,还能把不同容器分到不同网络做访问隔离。

创建自定义网络

docker network create 建网,-d 指定驱动(默认就是 bridge):

docker network create -d bridge app-net
docker network ls                 # 输出中多出 app-net,DRIVER 为 bridge
docker network inspect app-net    # 查看子网、已接入容器等详细信息

用容器名互访(内置 DNS)

把容器加入 app-net 后,同一网络内的容器互相 ping 名字即可,无需关心 IP:

docker run -d --name web --network app-net nginx:alpine
docker run -d --name api --network app-net nginx:alpine
docker exec api ping -c 1 web
# 输出:64 bytes from 172.18.0.2 ...(容器名 web 被解析成 IP)

自定义网络由 Docker 内置 DNS 负责把容器名解析为 IP;前端调用后端、微服务互相发现都靠这个能力,容器重启后 IP 变了也不影响用名字访问。

一个容器加入多个网络

容器可以同时挂在多个网络上,docker network connect / disconnect 负责动态调整:

docker network create -d bridge db-net
docker network connect db-net web      # 把已运行的 web 再接入 db-net
docker inspect web                     # Networks 字段能看到 app-net 与 db-net
docker network disconnect db-net web   # 把 web 从 db-net 移出

「只有需要的网络才接」是网络隔离的基本准则。

网络隔离实践

经典的三段式隔离:外层代理可访问应用,应用可访问数据库,但代理不能直接碰数据库:

docker network create -d bridge front-net
docker network create -d bridge back-net
docker run -d --name proxy --network front-net nginx:alpine
docker run -d --name app --network back-net redis:7
docker network connect front-net app     # app 同时接入 front-net
docker run -d --name db --network back-net mysql:8
# 拓扑结果:proxy 与 app 在 front-net 互访;
#           app 与 db 在 back-net 互访;proxy 无法访问 db

Compose 自动建网

使用 docker compose 启动项目时,Compose 会自动为每个项目创建一个 bridge 网络,并把服务名注册进 DNS:服务之间直接用 compose 文件里的服务名互访即可,无需手动建网(详见 Compose 章节)。

小结

自定义 bridge 网络的价值在于内置 DNS:容器名可解析、IP 变化不影响访问;再配合 connect / disconnect 让容器同时接入多个网络,即可实现「谁和谁通」由你决定的精细隔离。

笔记加载中…