0

0

如何在 Docker 容器之间安全高效地共享和复制文件

心靈之曲

心靈之曲

发布时间:2026-01-13 23:37:12

|

230人浏览过

|

来源于php中文网

原创

如何在 Docker 容器之间安全高效地共享和复制文件

本文介绍通过 docker 共享卷(named volume)在多个容器间实现文件共享与复制的最佳实践,避免使用 `docker cp` 或复杂 api,兼顾安全性、可维护性与权限控制。

在 Docker 环境中,容器默认相互隔离,无法直接通过 PHP 的 copy() 函数(如 copy('/src/file.jpg', '/dst/file.jpg'))跨容器访问文件系统——因为每个容器的根文件系统是独立的。你遇到的 container 1 无法访问 container 2 中路径的问题,本质是进程视角下的路径不可达,而非网络或权限问题。

推荐方案:使用命名卷(Named Volume)作为共享存储中介
创建一个持久化、宿主机托管的命名卷,同时挂载到两个容器的相同路径下,使双方均可读写该目录。例如:

# 创建共享卷(仅需执行一次)
docker volume create filetransfer

# 启动 container-1(PHP 应用 A),挂载为可读写
docker run -d \
  --name app-uploader \
  -v filetransfer:/var/www/html/transfer:rw \
  -v $(pwd)/app1:/var/www/html:ro \
  php:8.2-apache

# 启动 container-2(PHP 应用 B),挂载为只读(推荐用于接收端,防误写)
docker run -d \
  --name app-site \
  -v filetransfer:/var/www/html/transfer:ro \
  -v $(pwd)/app2:/var/www/html:ro \
  php:8.2-apache

随后,在 container 1 的 PHP 代码中,将文件先复制到共享路径:

// container 1 中执行(上传方)
$source = '/var/www/html/uploads/test.jpg';
$sharedDest = '/var/www/html/transfer/test.jpg';

if (copy($source, $sharedDest)) {
    echo "File staged to shared volume.";
}

在 container 2 中,即可从同一路径读取(注意:因挂载为 :ro,不可写入):

白果AI论文
白果AI论文

论文AI生成学术工具,真实文献,免费不限次生成论文大纲 10 秒生成逻辑框架,10 分钟产出初稿,智能适配 80+学科。支持嵌入图表公式与合规文献引用

下载
// container 2 中执行(接收方)
$sharedSrc = '/var/www/html/transfer/test.jpg';
$finalDest = '/var/www/html/site/uploads/test.jpg';

if (is_readable($sharedSrc) && copy($sharedSrc, $finalDest)) {
    echo "File copied from shared volume to local site.";
}

⚠️ 关键注意事项:

  • 权限一致性:若两容器以不同 UID 运行(如 www-data:33 vs user:1001),需确保共享卷内文件可被双方读取。启动时可通过 --user 统一 UID,或在初始化脚本中 chown -R 33:33 /var/www/html/transfer。
  • 并发安全:避免多容器同时写入同一文件。建议采用“单写多读”模式(即仅一个容器拥有 :rw 权限),或引入简单文件锁(如 flock + 临时 .lock 文件)。
  • 不适用场景:docker cp 仅支持容器 ↔ 宿主机传输,无法直连两容器;而为单文件传输构建 REST API 属过度设计,增加运维复杂度与延迟。

? 进阶提示:对于频繁或大文件传输,可结合 inotifywait 监听共享卷变更,自动触发同步逻辑;生产环境建议将共享卷备份策略纳入整体数据治理方案。使用命名卷不仅解耦容器依赖,还天然支持 Docker Compose 编排(通过 volumes: 声明复用),是云原生应用间轻量级文件协作的标准范式。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2485

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1582

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1479

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1414

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1305

2023.11.13

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号