如何在宿主机与运行中的容器之间双向复制文件或目录?
在 Docker 中,要在宿主机(Host)与运行中的容器(Container)之间双向复制文件或目录,最常用且最直接的方法是使用 docker cp 命令。
这个命令不需要容器安装 SSH 或其他服务,只要容器处于运行(或停止)状态即可。
以下是具体的操作方法:
1. 从 宿主机 复制到 容器内 (Host -> Container)
语法:
bash
docker cp <宿主机文件或目录路径> <容器名或容器ID>:<容器内目标路径>
示例:
- 复制单个文件:
将宿主机当前目录下的app.log复制到名为my_container的容器的/usr/src/app/目录下:bashdocker cp ./app.log my_container:/usr/src/app/ - 复制整个目录:
将宿主机的/home/user/data目录复制到容器的/root/目录下:bashdocker cp /home/user/data my_container:/root/
2. 从 容器内 复制到 宿主机 (Container -> Host)
语法:
bash
docker cp <容器名或容器ID>:<容器内文件或目录路径> <宿主机目标路径>
示例:
- 复制单个文件:
将名为my_container的容器内的/etc/nginx/nginx.conf文件复制到宿主机的当前目录(.):bashdocker cp my_container:/etc/nginx/nginx.conf . - 复制整个目录:
将容器内的/var/log/nginx日志目录复制到宿主机的/tmp目录下:bashdocker cp my_container:/var/log/nginx /tmp/
💡 核心技巧与注意事项
- 获取容器名称或 ID:
如果你不知道容器的名称或 ID,可以在宿主机运行以下命令查看:bashdocker ps - 关于目录复制的行为:
- 如果源路径以
/.结尾(例如my_container:/data/.),Docker 会复制该目录下的内容,而不是目录本身。 - 如果直接写目录名(例如
my_container:/data),则会把整个data文件夹复制过去。
- 如果源路径以
- 权限问题:
复制过去的文件,其拥有者(Owner)通常会变为执行docker cp命令的用户(在宿主机上)或 root 用户(在容器内)。如果遇到权限问题,可能需要手动使用chmod或chown修改权限。 - 无需停止容器:
docker cp可以在容器运行中实时进行,不会影响容器内正在运行的业务。
🌟 另一种方案:挂载目录(适合频繁双向同步)
如果你需要频繁、实时地在宿主机和容器之间同步文件,使用 docker cp 会很麻烦。建议在启动容器时使用 -v 或 --mount 参数进行挂载(Volume):
bash
docker run -d --name my_container -v /host/path:/container/path nginx
这样,宿主机的 /host/path 和容器的 /container/path 就会直接绑定。任何一方修改文件,另一方都会瞬间同步,无需手动复制。