概述
你有没有遇到过这种情况:
- 启动了两个容器,但它们无法互相访问?
- 明明服务在运行,却提示"Connection refused"?
- 只能通过 IP 地址通信,又难记又容易出错?
这些问题,根源在于你还没搞懂 Docker 网络
默认网络:Bridge(桥接模式)
Docker 安装后,默认提供三种网络模式,最常用的是 bridge 模式。
查看默认网络
bash
docker network ls
你会看到:
NETWORK ID NAME DRIVER SCOPE
... bridge bridge local
... host host local
... none null local
默认 bridge 网络的局限
当你不指定网络时,容器会自动加入 bridge 网络,但:
- 容器之间只能通过 IP 地址通信
- IP 可能变化,难以维护
- 没有内置 DNS,无法用容器名访问
不适合多容器应用协作
自定义网络:让容器"互相认识"
Docker 推荐使用自定义桥接网络(Custom Bridge Network),它能解决默认网络的所有问题
- 创建自定义网络
bash
docker network create my-network
- 启动容器并加入网络
bash
# 启动数据库容器
docker run -d --name mysql --network my-network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# 启动应用容器
docker run -d --name app --network my-network -p 3000:3000 my-node-app:1.0
- 容器之间如何通信
在 app 容器中,你可以直接用 服务名 访问 mysql:
javascript
// Node.js 应用配置
const dbConfig = {
host: 'mysql', // 不是 IP!而是容器名
user: 'root',
password: '123456'
};
自定义网络自动提供 DNS 解析,容器名即主机名
Docker 网络的三大优势
| 优势 | 说明 |
|---|---|
| 自动 DNS 解析 | 容器可通过名称互相访问,无需记住 IP |
| 内部隔离 | 只有加入同一网络的容器才能通信,更安全 |
| 动态加入/离开 | 可随时用 docker network connect/disconnect 管理 |
示例:动态连接容器
bash
# 让一个已运行的容器加入网络
docker network connect my-network redis-container
常见网络模式对比
| 模式 | 命令 | 适用场景 |
|---|---|---|
| bridge(自定义) | --network my-network |
多容器应用,本地开发 |
| host | --network host |
性能要求高,共享主机网络 |
| none | --network none |
完全隔离,无网络 |
| overlay | Docker Swarm | 跨主机容器通信 |
推荐:开发和测试使用自定义 bridge 网络,生产环境结合 Swarm 或 Kubernetes 使用 overlay。
用 Docker Compose 自动管理网络
还记得 docker-compose.yml 吗?它会自动创建网络,所有服务默认可通信
yaml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
DB_HOST: db # 直接用服务名
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
# Compose 会自动创建一个默认网络
# 所有服务都在同一个网络中,可直接通过服务名通信
运行:
bash
docker compose up
无需手动创建网络,一切自动完成
网络调试技巧
- 查看容器网络信息
bash
docker inspect <container-name>
查找 "Networks" 部分,查看 IP 和网络配置。
- 进入容器测试连通性
bash
docker exec -it app sh
ping mysql
curl http://backend:3000/api
- 查看网络中的容器
bash
docker network inspect my-network
最佳实践
| 实践 | 说明 |
|---|---|
| 使用自定义网络 | 避免默认 bridge 的限制 |
| 用有意义的服务名 | 如 db、redis、api |
在 docker-compose.yml 中定义网络 |
配置即代码,易于维护 |
| 不要暴露不必要的端口 | 只有需要被外部访问的服务才用 ports: |
总结
| 通信方式 | 是否推荐 | 说明 |
|---|---|---|
| 通过 IP 地址 | ❌ | IP 易变,难维护 |
使用 --link |
❌ | 已过时,不推荐 |
| 自定义网络 + 容器名 | ✅ | 推荐方式,支持 DNS |
| Docker Compose | ✅✅✅ | 最佳实践,自动管理 |
Docker 网络不是魔法,而是让容器协作的基础设施 。
掌握它,你才能真正驾驭多容器应用