容器之间怎么通信?Docker 网络全解析

概述

你有没有遇到过这种情况:

  • 启动了两个容器,但它们无法互相访问?
  • 明明服务在运行,却提示"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),它能解决默认网络的所有问题

  1. 创建自定义网络
bash 复制代码
docker network create my-network
  1. 启动容器并加入网络
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
  1. 容器之间如何通信

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

无需手动创建网络,一切自动完成

网络调试技巧

  1. 查看容器网络信息
bash 复制代码
docker inspect <container-name>

查找 "Networks" 部分,查看 IP 和网络配置。

  1. 进入容器测试连通性
bash 复制代码
docker exec -it app sh
ping mysql
curl http://backend:3000/api
  1. 查看网络中的容器
bash 复制代码
docker network inspect my-network

最佳实践

实践 说明
使用自定义网络 避免默认 bridge 的限制
用有意义的服务名 dbredisapi
docker-compose.yml 中定义网络 配置即代码,易于维护
不要暴露不必要的端口 只有需要被外部访问的服务才用 ports:

总结

通信方式 是否推荐 说明
通过 IP 地址 IP 易变,难维护
使用 --link 已过时,不推荐
自定义网络 + 容器名 推荐方式,支持 DNS
Docker Compose ✅✅✅ 最佳实践,自动管理

Docker 网络不是魔法,而是让容器协作的基础设施

掌握它,你才能真正驾驭多容器应用

相关推荐
阿里云云原生13 分钟前
快速构建企业 AI 开放平台,HiMarket 重磅升级
云原生
老蒋新思维20 分钟前
创客匠人:认知即资产 ——AI 时代创始人 IP 知识变现的底层逻辑
网络·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人
白帽子黑客罗哥2 小时前
渗透测试技术:从入门到实战的完整指南
网络·安全·web安全·渗透测试·漏洞挖掘·网络安全培训
北邮刘老师2 小时前
【智能体互联协议解析】ACPs/AIP为什么还在用“落后”的“中心化”架构?
网络·人工智能·架构·大模型·智能体·智能体互联网
winfield8212 小时前
MCP 协议详解
开发语言·网络·qt
sdszoe49222 小时前
IP地址规划与VLSM技术
网络·网络协议·tcp/ip·vlsm·ip地址规划
m0_569531012 小时前
《K8s 网络入门到进阶:Service 与 Ingress 原理、部署方案及核心区别对比》
网络·容器·kubernetes
广东大榕树信息科技有限公司2 小时前
当运维管理面临挑战时,如何借助动环监控系统提升响应能力?
运维·网络·物联网·国产动环监控系统·动环监控系统
wxjlkh2 小时前
docker 搭建 grafana+prometheus 监控主机资源之node_exporter
docker·grafana·prometheus
狂奔的sherry4 小时前
WIFI后端功能问题解决
网络