在 Ubuntu 上,多个 Docker 容器之间可以通过网络通信和数据共享两种方式实现交互。以下是具体方法和最佳实践:
一、容器间网络通信
1. 使用自定义网络(推荐)
Docker 默认创建的 bridge 网络中,容器无法通过名称直接访问(需手动指定 IP)。建议使用用户自定义桥接网络,支持 DNS 解析(容器名即主机名)。
# 创建自定义网络
docker network create my-network
# 启动容器并加入该网络
docker run -d --name app1 --network my-network nginx
docker run -d --name app2 --network my-network python:3.9-slim
# 在 app2 中可直接 ping 或 curl app1
docker exec app2 ping app1
docker exec app2 curl http://app1:80
✅ 优势:自动 DNS 解析、隔离性好、支持多子网。
2. 使用 host 网络(谨慎使用)
容器共享宿主机网络命名空间,可通过 localhost 或宿主机 IP 访问,但失去网络隔离性,仅适用于调试或高性能场景(如数据库 + 应用在同一宿主机)。
docker run -d --network host --name db postgres
docker run -d --network host --name app python app.py # 可直连 localhost:5432
⚠️ 注意:端口冲突风险高,生产环境不推荐。
3. 链接旧式方式(已废弃)
--link 参数已被标记为过时,仅用于兼容旧项目,不建议新项目使用。
二、容器间数据共享
1. 挂载卷(Volumes)—— 推荐方式
将数据持久化到宿主机或直接由 Docker 管理,多个容器可挂载同一卷读写。
# 创建命名卷
docker volume create shared-data
# 启动两个容器挂载同一卷
docker run -d --name writer -v shared-data:/data alpine sh -c "echo 'hello' > /data/file.txt && sleep infinity"
docker run -d --name reader -v shared-data:/data alpine tail -f /dev/null
# 验证数据
docker exec reader cat /data/file.txt # 输出:hello
✅ 优点:数据独立于容器生命周期、跨容器共享、备份恢复方便。
2. 挂载绑定目录(Bind Mounts)
将宿主机特定目录映射到容器,适合开发调试。
docker run -d --name container1 -v /home/user/data:/data alpine
docker run -d --name container2 -v /home/user/data:/data alpine
⚠️ 注意:权限问题(需确保宿主机目录权限正确),且依赖宿主机路径。
3. 临时共享(无持久化需求)
- 使用
tmpfs内存文件系统(重启后丢失):docker run -d --tmpfs /cache alpine - 或通过 HTTP/RPC 等应用层协议传输(非文件级共享)。
三、完整示例:Web 服务 + 数据库共享数据
# 1. 创建网络和卷
docker network create web-net
docker volume create data-vol
# 2. 启动 MySQL(只写日志和配置)
docker run -d
--name mysql
--network web-net
-e MYSQL_ROOT_PASSWORD=secret
-v data-vol:/var/lib/mysql
mysql:8.0
# 3. 启动 Python 应用(写入数据)
docker run -d
--name py-app
--network web-net
-v data-vol:/data
python:3.9
python -c "import time; open('/data/result.txt','w').write('OK'); time.sleep(9999)"
# 4. 启动 Nginx(读取结果并返回)
docker run -d
--name nginx
--network web-net
-v data-vol:/usr/share/nginx/html
nginx:alpine
此时:
py-app与mysql通过web-net网络互通(如需 DB 连接用mysql主机名)py-app和nginx通过data-vol共享/data目录内容
四、安全与运维建议
| 场景 | 推荐方案 |
|---|---|
| 微服务通信 | 自定义桥接网络 + 服务发现(如 Consul/DNS) |
| 文件共享/缓存 | 命名卷(docker volume) |
| 开发调试 | 绑定挂载 + host 网络(仅限本地) |
| 生产环境 | 避免 host 网络;卷权限需严格管控;启用 TLS 加密通信 |
🔐 提示:若容器需跨主机通信,需结合 Swarm/Kubernetes 或使用 Overlay 网络。
需要我针对某个具体场景(如 Redis 集群、日志聚合、CI/CD 流水线)提供详细配置吗?
PHPWP博客