docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker容器传输文件

Docker容器传输文件的实现方式

作者:浆果0207

文章介绍了Docker容器与主机之间文件传输的四种常用方式:dockercp命令、Docker卷挂载、Dockerfile集成和网络工具,分别适用于临时传输、持久共享、镜像集成及远程场景

在 Docker 日常使用中,经常需要在主机与容器之间传输文件(如配置文件、代码包、日志等)。

以下是四种最常用的实现方式,覆盖临时传输、持久共享、构建集成等不同场景。

1. 使用docker cp命令(最常用,临时传输)

docker cp 是 Docker 官方提供的原生命令,专门用于主机与容器之间直接复制文件 / 目录,无需额外配置,适合临时传输场景。

核心语法

操作方向命令格式
主机 → 容器docker cp 主机源路径 容器名/ID:容器目标路径
容器 → 主机docker cp 容器名/ID:容器源路径 主机目标路径

示例

主机文件复制到容器

将主机当前目录下的 app.js 文件,复制到名为 my-container 的容器内 /tmp 目录:

docker cp ./app.js my-container:/tmp/

主机目录复制到容器

将主机 ./project 目录,复制到容器 /usr/local/project 目录(目录会自动创建):

docker cp ./project my-container:/usr/local/

容器文件复制到主机

将容器内 /var/log/app.log 日志文件,复制到主机 ./logs 目录:

docker cp my-container:/var/log/app.log ./logs/

2. 利用 Docker 卷(Volume)(持久化共享)

如果需要主机与容器长期、实时共享文件(如数据库数据、配置文件动态更新),推荐使用 Docker 卷(Volume)。

卷是 Docker 管理的持久化存储,独立于容器生命周期,数据安全性更高。

操作步骤

创建自定义卷

docker volume create my-volume  # 创建名为 my-volume 的卷

运行容器时挂载卷

将卷 my-volume 挂载到容器内的 /container/data 路径,主机与容器在此路径下的文件会实时同步:

docker run -d \
  --name my-container \
  -v my-volume:/container/data  # 卷挂载:卷名:容器内路径
  my-image  # 容器使用的镜像

主机访问卷数据

Docker 卷在主机上的默认存储路径为 /var/lib/docker/volumes/[卷名]/_data,可直接在主机操作该目录:

# 例如:向卷中添加文件,容器内 /container/data 会同步
cp ./config.ini /var/lib/docker/volumes/my-volume/_data/

3. 通过 Dockerfile 构建时添加(镜像集成)

如果需要容器创建时就内置固定文件(如应用代码、默认配置),可在 Dockerfile 中使用 COPYADD 指令,将文件打包到镜像中,容器启动后直接可用。

核心指令对比

指令功能说明推荐场景
COPY仅将主机本地文件 / 目录复制到镜像中,语法简单,功能明确。绝大多数本地文件复制场景
ADD除 COPY 功能外,还支持解压压缩包(如 .tar)、下载 URL 资源。需要自动解压或远程获取文件

示例 Dockerfile

dockerfile

# 基础镜像
FROM ubuntu:22.04

# 1. 使用 COPY 复制本地文件到镜像
COPY ./app.conf /etc/app.conf  # 主机 app.conf → 镜像 /etc/ 目录

# 2. 使用 COPY 复制本地目录到镜像
COPY ./src /usr/local/app/src  # 主机 src 目录 → 镜像 /usr/local/app/src

# 3. 使用 ADD 解压本地压缩包(自动解压到目标路径)
ADD ./app.tar.gz /usr/local/app/  # 主机 app.tar.gz → 镜像内自动解压到 /usr/local/app/

# 4. 使用 ADD 下载远程文件(不推荐,建议在主机下载后用 COPY,避免构建缓存问题)
# ADD https://example.com/config.ini /etc/config.ini

构建镜像并运行

# 构建镜像(当前目录需包含 Dockerfile 和待复制的文件)
docker build -t my-image:v1 .

# 运行容器(镜像内已包含上述文件)
docker run -it --name my-container my-image:v1

4. 网络传输工具(跨主机 / 特殊场景)

如果容器内已安装网络工具(如 wgetcurlssh),可通过网络实现文件传输,适合跨主机或无法直接访问容器的场景

常见场景示例

从主机 HTTP 服务下载文件

先在主机启动临时 HTTP 服务(以 Python 为例):

# 主机当前目录启动 HTTP 服务(端口 8000)
python3 -m http.server 8000

然后在容器内使用 wget 下载文件:

# 容器内下载主机的 app.zip 文件(主机 IP 需替换为实际地址)
wget http://192.168.1.100:8000/app.zip -O /tmp/app.zip

通过 SSH 传输文件

若容器内已配置 SSH 服务,可使用 scp 从主机复制文件:

# 主机 → 容器(容器需开放 SSH 端口,如 2222)
scp -P 2222 ./config.ini root@容器IP:/etc/config.ini

5. 方法选择建议

场景需求推荐方法优点
临时、少量文件传输docker cp无需配置,操作简单
长期、实时文件共享Docker 卷数据持久化,性能稳定
容器镜像内置固定文件Dockerfile COPY与镜像绑定,部署便捷
跨主机或远程传输网络工具(wget)灵活性高,不受本地环境限制

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文