在阿里云 CentOS 系统上配置多个 Docker 容器并实现互通,核心思路是使用自定义网络(Custom Network)。Docker 默认创建的 bridge 网络虽然也能通信,但无法通过容器名自动解析,且安全性较差。以下是完整、安全的操作步骤:
✅ 一、基础准备
-
确认 Docker 已安装(CentOS 7/8):
docker --version # 若未安装,参考官方文档安装(推荐 Docker CE) sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker -
创建自定义桥接网络(推荐方式):
docker network create my-net✅ 优势:容器可通过服务名或容器名直接通信;支持 DNS 解析;隔离性好。
✅ 二、启动多个容器并加入同一网络
示例场景:Web 服务 + 数据库
# 启动 Web 容器(如 Nginx),指定名称并加入网络
docker run -d
--name web-server
--network my-net
-p 80:80
nginx:alpine
# 启动 MySQL 容器,同样加入网络
docker run -d
--name db-server
--network my-net
-e MYSQL_ROOT_PASSWORD=your_password
-e MYSQL_DATABASE=mydb
mysql:8.0
🔔 注意:
--network my-net是关键,确保容器在同一二层网络。- 容器间访问使用 容器名(如
db-server)或 服务名(若用 Swarm/K8s)。- 无需暴露数据库端口到宿主机(除非外部需访问),保持内网安全。
✅ 三、验证容器互通
方法 1:进入一个容器 ping 另一个容器
docker exec -it web-server sh
# 在容器内执行:
ping db-server
# 应能解析并连通(返回 IP 地址)
exit
方法 2:测试 HTTP/API 调用(以 Nginx → API 为例)
假设 web-server 需访问 api-server:
curl http://api-server:3000/health
方法 3:查看网络详情
docker network inspect my-net
# 可查看所有容器的 IP、连接状态等
✅ 四、进阶:多网络隔离与跨网通信(可选)
- 多网络场景:不同业务组可创建独立网络(如
dev-net,prod-net),互不干扰。 - 跨网络通信:将容器同时加入多个网络(
docker network connect),实现逻辑隔离下的可控互通。docker network connect shared-net api-server
⚠️ 阿里云环境注意事项
| 项目 | 建议 |
|---|---|
| 安全组规则 | 仅开放必要端口(如 80/443),不要开放数据库端口(3306)到公网! |
| 防火墙 | 检查 firewalld 是否拦截 Docker 流量:sudo firewall-cmd --list-all |
| 资源限制 | 高并发场景建议为容器设置 CPU/内存限制:--cpus="1" --memory="512m" |
| 持久化数据 | 数据库卷务必挂载宿主机目录或使用 Docker Volume:-v /data/mysql:/var/lib/mysql |
📌 最佳实践总结
- ✅ 始终使用
docker network create创建自定义网络; - ✅ 容器间通信优先用容器名而非硬编码 IP;
- ✅ 生产环境避免使用
host网络模式; - ✅ 结合
.env文件管理环境变量,提升可维护性; - ✅ 使用
docker-compose.yml编排多容器应用(推荐):version: '3.8' services: web: image: nginx:alpine ports: ["80:80"] networks: [my-net] db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: [db-data] networks: [my-net] networks: my-net: volumes: db-data:
需要我提供完整的 docker-compose.yml 模板或针对特定应用(如 WordPress + MySQL、Spring Boot + Redis)的配置示例吗?
云小栈