Ubuntu下多个Docker容器之间如何通信和数据共享?

在 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 流水线)提供详细配置吗?