2、Bridge网络模式:默认bridge网络详解、自定义bridge网络创建与管理、容器间通信实战

默认bridge网络:Docker的“新手村”

说实话,默认bridge网络是每个Docker用户都会接触到的第一个网络模式。你只要执行docker run不加任何网络参数,容器就会自动挂到这个叫bridge的网络上。

这个默认bridge网络,我习惯叫它“新手村”。它帮你做了三件事:

  • 给容器分配一个私有IP(通常是172.17.0.x段)
  • 通过NAT让容器能访问外网
  • 容器之间可以通过IP互相通信

但这里有个坑——默认bridge不支持通过容器名进行DNS解析。什么意思呢?就是容器A想访问容器B,只能写死IP地址。你想想看,容器重启后IP变了怎么办?我曾经在一个测试环境里吃过这个亏,写死的IP一重启全崩了。

⚠️ 避坑指南: 默认bridge网络下,容器间通信只能靠IP。如果你需要稳定的服务发现,请直接使用自定义bridge网络。

自定义bridge网络:生产环境的标配

我个人强烈建议,所有生产环境都用自定义bridge网络。为什么?因为它解决了默认bridge最头疼的问题——DNS解析。

创建自定义bridge网络非常简单:

# 创建一个名为 my-net 的bridge网络
docker network create my-net

# 查看网络列表
docker network ls

# 查看网络详情
docker network inspect my-net

创建完网络后,启动容器时指定网络:

# 启动两个容器,都连接到 my-net
docker run -d --name web --network my-net nginx
docker run -d --name db --network my-net mysql:5.7

这时候,web容器里可以直接用ping db或者curl db:3306来访问数据库容器。Docker内置的DNS会自动把容器名解析成IP地址。

💡 核心要点: 自定义bridge网络提供了自动DNS解析,容器名就是主机名。这是生产环境容器间通信的基础。

容器间通信实战:从理论到落地

光说不练假把式。咱们直接上一个真实场景——Web应用 + Redis缓存的通信。

第一步:创建网络

docker network create app-net

第二步:启动Redis容器

docker run -d \
  --name redis-cache \
  --network app-net \
  redis:7-alpine

第三步:启动Web应用容器

docker run -d \
  --name web-app \
  --network app-net \
  -p 8080:80 \
  my-web-app:latest

这时候,web-app容器里连接Redis只需要写:

redis_host = "redis-cache"
redis_port = 6379

是不是很清爽?不用记IP,不用操心重启。我记得有一次线上Redis需要扩容,我直接停掉旧容器,启动新容器,名字还是叫redis-cache,Web应用那边完全无感知。

网络隔离与多网络接入

生产环境中,我们经常需要做网络隔离。比如数据库层只允许应用层访问,不允许外部直接访问。

Docker允许一个容器接入多个网络:

# 创建两个网络
docker network create front-net
docker network create back-net

# 启动应用容器,接入两个网络
docker run -d \
  --name app \
  --network front-net \
  --network back-net \
  my-app:latest

# 启动数据库容器,只接入 back-net
docker run -d \
  --name database \
  --network back-net \
  mysql:8.0

这样,app容器既能被前端访问(通过front-net),又能访问数据库(通过back-net)。而数据库容器完全隔离在back-net里,外部无法直接访问。

🔧 实战技巧: 我习惯把网络按层级命名:front-net(前端层)、back-net(后端层)、data-net(数据层)。这样一看网络名就知道是干什么的。

网络管理常用命令速查

命令 作用 示例
docker network create 创建网络 docker network create --driver bridge my-net
docker network ls 列出网络 docker network ls
docker network inspect 查看网络详情 docker network inspect my-net
docker network connect 容器接入网络 docker network connect my-net container1
docker network disconnect 容器断开网络 docker network disconnect my-net container1
docker network rm 删除网络 docker network rm my-net

避坑总结:我踩过的三个坑

  1. 默认bridge的DNS问题:前面说了,默认bridge不支持容器名解析。我刚开始用Docker时,写了个脚本硬编码IP,结果容器重启后全连不上。后来全部改成自定义bridge,世界清净了。
  2. 网络删除前要断开容器:删除网络时,如果还有容器连着,会报错。必须先docker network disconnect再删。
  3. 端口映射与网络模式:用了--network host模式后,-p参数会失效。这个坑我帮别人排查过好几次,每次都是“为什么我映射了端口但访问不了?”——一看,host模式。

嗯,Bridge网络模式的内容就这些。说白了,记住一句话:生产环境用自定义bridge,别用默认的。下一章咱们聊聊Host网络模式,那个更直接,但也更“危险”。