在实际开发中,经常遇到多个服务需要协同工作的情况。比如一个项目里有前端、后端、数据库和 Redis 缓存,每个服务都运行在独立的 Docker 容器中。这时候如果它们之间无法通信,整个系统就跑不起来。最常见的解决方案就是使用 Docker 的网桥(bridge)网络进行配置。
默认网桥 vs 自定义网桥
Docker 安装后会自动创建一个名为 docker0 的默认网桥网络。所有容器如果不指定网络,都会连到这个默认网桥上。但默认网桥有个问题:容器之间只能通过 IP 地址访问,没法用容器名通信,维护起来很麻烦。
举个例子,你在本地启动了一个 MySQL 容器,另一个应用容器想连接它,写配置时得记住它的 IP。可每次重启容器,IP 可能就变了,程序立马连不上。这种“靠运气”的方式显然不适合生产环境。
创建自定义网桥
更靠谱的做法是创建一个自定义的网桥网络,让相关容器接入同一个网络,这样它们就能通过容器名称直接通信。
使用下面的命令创建一个名为 app-network 的网桥:
docker network create --driver bridge app-network
创建完成后,启动容器时指定这个网络:
docker run -d --name mysql-server --network app-network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
docker run -d --name web-app --network app-network -p 8080:80 my-web-app
这时候,web-app 容器里就可以直接用 mysql-server 这个主机名来连接数据库,不用关心具体 IP。
查看网络详情
想知道某个网络里有哪些容器,可以用以下命令查看:
docker network inspect app-network
输出内容会显示当前网络中的所有容器、IP 分配情况以及子网信息,排查问题时特别有用。
多个容器共享网络的场景
假设你正在做一个电商后台,包含用户服务、订单服务和商品服务,每个都是一个独立的微服务容器。它们之间频繁调用 API,如果都放在同一个自定义网桥里,不仅可以通过名字互访,还能隔离外部干扰,安全性也更高。
只需要在 docker-compose.yml 中统一声明网络:
version: '3'
services:
user-service:
image: user-svc
networks:
- app-network
order-service:
image: order-svc
networks:
- app-network
product-service:
image: product-svc
networks:
- app-network
networks:
app-network:
driver: bridge
执行 docker-compose up 后,三个服务就在同一网络下跑起来了,互相调用就像在局域网内一样顺畅。
注意事项
自定义网桥虽然好用,但也别滥用。不同功能模块的容器最好分网络部署,比如数据库和前端页面没必要在一个网段里。合理划分网络既能提升安全性,也能减少不必要的网络广播。