介绍
在本实验中,你将学习如何使用 docker compose cp 命令在服务容器与本地文件系统之间复制文件和目录。我们将从搭建一个简单的 Docker Compose 项目开始,包括安装 Docker Compose 以及创建一个基于 Ubuntu 镜像的基础 docker-compose.yml 文件。
完成项目搭建后,你将练习从服务容器复制文件到本地机器,再从本地机器复制文件到服务容器。最后,你将学习如何将整个目录从服务容器复制到本地文件系统,从而展示 docker compose cp 命令在管理 Docker Compose 环境数据时的灵活性。
准备一个简单的 Docker Compose 项目
在本步骤中,我们将准备一个简单的 Docker Compose 项目。由于 LabEx 环境未预装 Docker Compose,我们需要先安装它。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序的服务,然后只需一条命令就能根据配置创建并启动所有服务。
首先,让我们安装 Docker Compose。我们将下载 Docker Compose 二进制文件并赋予可执行权限。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
现在,让我们通过检查 Docker Compose 版本来验证安装是否成功。
docker-compose --version
你应该会看到类似 Docker Compose version v2.20.2 的输出。
接下来,我们将创建一个简单的 Docker Compose 项目。首先为项目创建目录,然后在其中创建 docker-compose.yml 文件。该文件将使用 ubuntu 镜像定义一个简单服务。
mkdir ~/project/my-compose-app
cd ~/project/my-compose-app
nano docker-compose.yml
在 nano 编辑器中,将以下内容粘贴到 docker-compose.yml 文件中:
version: "3.8"
services:
my-service:
image: ubuntu:latest
command: tail -f /dev/null
按 Ctrl + X,然后按 Y 和 Enter 保存并退出编辑器。
让我们解析这个 docker-compose.yml 文件:
version: '3.8'指定了 Docker Compose 文件格式版本services:定义了组成应用程序的服务my-service:是我们的服务名称image: ubuntu:latest指定了该服务使用的 Docker 镜像(我们使用最新版 Ubuntu 镜像)command: tail -f /dev/null是容器启动时执行的命令。该命令让容器无限期运行而不消耗大量资源,这对测试和调试很有用
在启动服务前,我们需要拉取 ubuntu:latest 镜像。
docker pull ubuntu:latest
现在,我们可以使用 docker-compose up 命令启动服务。-d 标志表示以分离模式运行容器,即在后台运行。
docker-compose up -d
你应该会看到服务被创建和启动的输出信息。
最后,让我们用 docker-compose ps 命令检查运行中服务的状态。
docker-compose ps
你应该会看到显示 my-service 容器正在运行的输出。
从服务容器复制文件到本地文件系统
在本步骤中,我们将学习如何从运行的 Docker 容器中复制文件到本地文件系统。当你需要获取容器内生成的日志、配置文件或其他数据时,这是一项常见任务。
我们将使用 docker cp 命令实现这一操作。该命令用于在容器与本地文件系统之间复制文件/文件夹。语法格式为:docker cp <container>:<src_path> <dest_path> 表示从容器复制到本地文件系统,docker cp <src_path> <container>:<dest_path> 表示从本地文件系统复制到容器。
首先,让我们在运行的 my-service 容器内创建一个简单文件。我们将使用 docker exec 命令在容器内执行命令,该命令用于在运行中的容器内执行新命令。
确保当前位于 ~/project/my-compose-app 目录下:
cd ~/project/my-compose-app
docker-compose exec my-service bash -c "echo 'This is a test file inside the container.' > /tmp/container_file.txt"
该命令在 my-service 容器内执行 bash shell,然后运行 echo 命令创建名为 /tmp/container_file.txt 的文件并写入内容。
现在,让我们将该文件从容器复制到本地文件系统。我们将把它复制到当前目录(~/project/my-compose-app):
docker-compose cp my-service:/tmp/container_file.txt .
docker-compose cp 命令与 docker cp 类似,但它适用于 docker-compose.yml 文件中定义的服务名称。其中:
my-service是我们的服务名称/tmp/container_file.txt是容器内文件路径.表示本地文件系统的当前目录
执行命令后,你应在 ~/project/my-compose-app 目录下看到 container_file.txt 文件。让我们验证文件是否存在并查看内容:
ls container_file.txt
cat container_file.txt
你将看到文件名列表和打印到控制台的内容:"This is a test file inside the container."
将本地文件复制到服务容器中
在本步骤中,我们将学习如何将文件从本地文件系统复制到正在运行的 Docker 容器中。当容器启动后需要添加配置文件、脚本或其他数据时,这个操作非常有用。
我们将再次使用 docker cp 命令,但这次是反向操作:docker cp <src_path> <container>:<dest_path>。
首先,让我们在本地文件系统的 ~/project/my-compose-app 目录下创建一个简单文件:
cd ~/project/my-compose-app
echo "This file is from the local filesystem." > local_file.txt
现在,我们将这个 local_file.txt 文件从本地文件系统复制到 my-service 容器内的 /tmp/ 目录:
docker-compose cp local_file.txt my-service:/tmp/
这里使用的 docker-compose cp 命令参数说明:
local_file.txt是本地文件系统上的文件路径my-service是我们的服务名称/tmp/是容器内的目标目录
为了验证文件是否成功复制,我们将在容器内执行命令检查文件并显示其内容:
docker-compose exec my-service cat /tmp/local_file.txt
该命令在 my-service 容器内执行 cat /tmp/local_file.txt 命令。你应该会在控制台看到输出内容 "This file is from the local filesystem.",这确认了文件已正确复制。
从服务容器复制目录到本地文件系统
在本步骤中,我们将学习如何从运行的 Docker 容器中复制整个目录到本地文件系统。这对于获取应用程序输出目录、日志目录或容器内生成的任何其他目录结构非常有用。
我们将再次使用 docker cp 命令,类似于复制文件的操作,但这次指定的是目录路径。
首先,让我们在运行的 my-service 容器内创建一个目录和一些文件。我们将使用 docker-compose exec 在容器内执行命令。
确保当前位于 ~/project/my-compose-app 目录下:
cd ~/project/my-compose-app
docker-compose exec my-service bash -c "mkdir /tmp/container_dir && echo 'File 1' > /tmp/container_dir/file1.txt && echo 'File 2' > /tmp/container_dir/file2.txt"
该命令在 my-service 容器内创建名为 /tmp/container_dir 的目录,然后在该目录下创建两个文件 file1.txt 和 file2.txt。
现在,让我们将这个完整目录从容器复制到本地文件系统。我们将把它复制到当前目录(~/project/my-compose-app):
docker-compose cp my-service:/tmp/container_dir .
这里使用的 docker-compose cp 命令参数说明:
my-service是我们的服务名称/tmp/container_dir是容器内的目录路径.表示本地文件系统的当前目录
执行命令后,你应在 ~/project/my-compose-app 目录下看到名为 container_dir 的新目录。让我们验证其存在并列出内容:
ls container_dir
ls container_dir/file1.txt container_dir/file2.txt
你应该会看到列出的 container_dir 目录,以及其中的两个文件(file1.txt 和 file2.txt)。
最后,让我们清理已启动的 Docker Compose 服务:
docker-compose down
该命令会停止并移除由 docker-compose up 创建的容器、网络和卷。
总结
在本实验中,我们学习了如何使用 docker compose cp 命令在服务容器和本地文件系统之间复制文件和目录。我们首先准备了一个简单的 Docker Compose 项目,包括安装 Docker Compose 和创建一个使用 Ubuntu 镜像定义基础服务的 docker-compose.yml 文件。
完成项目设置后,我们实践了以下操作:
- 将文件从服务容器复制到本地文件系统
- 将文件从本地文件系统复制到服务容器
- 将整个目录从服务容器复制到本地文件系统
这些步骤展示了 docker compose cp 命令在 Docker Compose 环境中管理数据传输的实际应用。



