docker cp命令详解

docker cp 命令用于在 Docker 容器 和 宿主机(Host) 之间复制文件或目录。它类似于 Linux 的 cp 命令,但专门用于 Docker 容器与本地文件系统的交互。


1. 命令语法

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
  • CONTAINER:容器名称或 ID。

  • SRC_PATH:源文件/目录路径。

  • DEST_PATH:目标文件/目录路径。


2. 使用示例

(1) 从容器复制文件到宿主机

docker cp my-container:/app/logs/app.log ./logs/
  • 将容器 my-container 的 /app/logs/app.log 复制到宿主机的 ./logs/ 目录。

(2) 从宿主机复制文件到容器

docker cp ./config.yml my-container:/etc/app/config.yml
  • 将宿主机的 ./config.yml 复制到容器 my-container 的 /etc/app/config.yml

(3) 复制整个目录

docker cp my-container:/var/log/nginx/ ./nginx-logs/
  • 将容器内的 /var/log/nginx/ 目录复制到宿主机的 ./nginx-logs/


3. 常用选项

选项说明
-a / --archive 保持文件属性(如权限、所有者)。
-L / --follow-link 复制符号链接指向的实际文件(而非链接本身)。

示例(保持文件属性)

docker cp -a my-container:/app/data ./backup/
  • 复制时保留文件权限、时间戳等元数据。


4. 注意事项

  1. 路径格式:

    • 容器内路径:必须以 容器名或ID: 开头(如 my-container:/path/to/file)。

    • 宿主机路径:可以是相对路径(./file)或绝对路径(/home/user/file)。

  2. 文件覆盖:

    • 如果目标文件已存在,docker cp 会直接覆盖(无警告提示)。

  3. 容器状态:

    • 容器可以是 运行中(Running) 或 已停止(Exited),都能执行复制。

  4. 权限问题:

    • 如果容器内文件权限受限(如 root 所有),宿主机可能需要 sudo 才能访问。

  5. 符号链接:

    • 默认复制链接本身(而非目标文件),使用 -L 复制实际文件。


5. 实际应用场景

(1) 备份容器数据

docker cp my-db-container:/var/lib/mysql ./mysql-backup/
  • 备份 MySQL 容器的数据到宿主机。

(2) 调试容器

docker cp my-app-container:/tmp/debug.log ./
  • 从容器提取日志文件进行分析。

(3) 动态更新配置

docker cp ./new-config.json my-app-container:/etc/app/config.json
docker restart my-app-container
  • 更新容器配置文件后重启生效。


6. 与 docker exec 结合使用

如果需要在容器内直接查看或编辑文件,可以结合 docker exec

# 进入容器查看文件
docker exec -it my-container bash
# 或者直接编辑文件
docker exec -it my-container vi /app/config.yml

7. 总结

场景命令示例
容器 → 宿主机 docker cp my-container:/path/to/file ./
宿主机 → 容器 docker cp ./file my-container:/path/to/file
复制目录 docker cp my-container:/dir/ ./local-dir/
保持文件属性 docker cp -a my-container:/file ./

docker cp 是管理容器文件的利器,尤其适用于日志收集、配置更新和备份恢复!

posted @ 2025-06-27 13:43  郭慕荣  阅读(867)  评论(0)    收藏  举报