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网络:生产环境的标配
我个人强烈建议,所有生产环境都用自定义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地址。
容器间通信实战:从理论到落地
光说不练假把式。咱们直接上一个真实场景——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里,外部无法直接访问。
网络管理常用命令速查
| 命令 | 作用 | 示例 |
|---|---|---|
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 |
避坑总结:我踩过的三个坑
- 默认bridge的DNS问题:前面说了,默认bridge不支持容器名解析。我刚开始用Docker时,写了个脚本硬编码IP,结果容器重启后全连不上。后来全部改成自定义bridge,世界清净了。
- 网络删除前要断开容器:删除网络时,如果还有容器连着,会报错。必须先
docker network disconnect再删。 - 端口映射与网络模式:用了
--network host模式后,-p参数会失效。这个坑我帮别人排查过好几次,每次都是“为什么我映射了端口但访问不了?”——一看,host模式。
嗯,Bridge网络模式的内容就这些。说白了,记住一句话:生产环境用自定义bridge,别用默认的。下一章咱们聊聊Host网络模式,那个更直接,但也更“危险”。