如果您需要从Docker主机复制文件到您的Docker容器,这个教程适合您。
在本教程中,您将学习使用各种方法将文件从Docker主机复制到Docker容器。
让我们开始吧!
先决条件
如果您想一步一步跟着做,请确保具备以下条件:
- A Linux host. This tutorial uses Ubuntu 18.04.5 LTS.
- 在Linux主机上安装了Docker。本教程使用Docker v19.03.11。您可以通过运行
docker version
来确认您的Docker版本。
- 下载并可用的任何Docker镜像。本教程使用了Docker Hub上最新的NGINX Docker镜像。
使用docker cp
命令复制文件
要开始本教程,您将学习使用docker cp
命令将文件从Docker主机复制到容器。docker cp
命令在容器和Docker主机的本地文件系统之间相互复制文件或文件夹。
让我们学习如何使用 Docker cp 命令,附带一个示例。
1. 在本地机器上打开一个终端。
2. 使用 touch
命令创建一个名为 myfile.txt 的文件。 myfile.txt 将从 Docker 主机复制到容器中。
3. 执行 docker run
命令。下面的 docker run 将在后台创建一个新容器。下面的命令包含下面描述的三个参数:
d
flag that runs the container in the background and keeps it alive until deleted.p
flag publishes a container’s port80
to the host on port80
.nginx
将是用于运行容器的镜像。

4. 使用 docker ps
命令验证 Docker 容器是否成功创建。在执行 docker ps
命令之后,您应该在属性 CONTAINER ID (在下面的示例中为 ccae4670f030
) 下看到一个使用 NGINX 镜像生成的新值,确认容器已成功创建。

在执行 Docker cp 命令之前,Docker cp 命令的语法为:
CONTAINER: SRC_PATH
指定容器的源路径。DEST_PATH
是主机上的目标路径。CONTAINER: DEST_PATH
是容器上的目标路径。
此外,您还可以在命令中使用以下参数添加 options
:
- 使用档案或a-复制所有文件和文件夹的用户和主要组权限。
- 使用L-指定L选项将允许将源路径中的任何符号链接复制到目标路径。
5. 接下来,执行docker cp
命令。 docker cp
命令将把您之前创建的myfile.txt复制到容器的/usr/share目录中。ccae4670f030
是要将myfile.txt复制到的容器ID。
6. 最后,通过运行带有/bin/bash
的docker exec
命令来SSH到运行的容器中,该命令用作Linux系统用户登录的默认shell。
-
i
标志表示您想要打开一个交互式SSH会话到容器。 即使容器未附加,i
标志也不会关闭SSH会话。 t
标志分配一个伪TTY,必须用来交互式地运行命令。sudo docker exec -it ccae4670f030 /bin/bash
当您运行docker exec
时,您将看到您现在已连接到容器的shell。

7. 登录容器后,请使用ls命令验证是否已使用myfile.txt将文件复制到容器中。
ls
是Unix和类Unix操作系统中用于列出计算机文件的命令。grep
将搜索usr/share目录中以字符串my
开头的所有文件或文件夹。

使用DockerFile复制文件
在前一节中,您学会了通过运行Docker cp命令将文件复制到容器中的方法。如果您需要一次性复制多个文件怎么办?当然,运行多个命令会增加负担!为了解决运行多个cp命令的问题,为什么不尝试使用Dockerfile和COPY
命令将文件或文件夹复制到容器中呢?
部署容器并使用Dockerfile复制文件/文件夹允许您省去在上一节中执行的手动复制步骤。Dockerfile是一个包含用户可以在命令行上调用的所有命令的文本文档,以组装镜像。
让我们创建一个Dockerfile,从中运行一个容器,最终复制文件。
1. 创建一个名为~/host-to-container-copy-demo的文件夹,然后更改(cd
)工作目录到该文件夹。此文件夹将包含您在此演示中将要创建的所有文件。
2. 现在,创建两个文本文件,命名为myfile1.txt和myfile2.txt,将它们复制粘贴到文件中,并保存到~/host-to-container-copy-demo目录中。
3. 创建另一个文件,复制/粘贴下面的配置,并将文件保存为Dockerfile,放在~/host-to-container-copy-demo目录中。完成后,Docker 将使用此 DockerFile 运行所有必要的命令来构建一个新的 Docker 镜像,该镜像位于任何基础镜像之上。
下面的DockerFile包含了构建新容器的各种步骤/指令:
4. 通过运行tree
命令验证构建新镜像所需的所有文件。您应该在~/host-to-container-copy-demo目录下看到Dockerfile、myfile1.txt和myfile2.txt。

5. 接下来,通过运行docker build
命令构建镜像。使用t
标志为镜像updated_ubuntu_image
打标签为latest
,.
允许Docker从当前工作目录中选择所有必需的文件。

docker build
command 6. 现在,通过运行docker images
命令验证新构建的镜像updated_ubuntu_image
。注意REPOSITORY属性。此属性是在前一步骤中使用-t
标志创建的标签。

7. 最后,通过运行docker run
命令使用新构建的镜像运行Docker容器。-it
标志指示Docker分配一个伪终端连接到容器的标准输入。bash
提供Linux系统用户登录的默认Shell。
您将看到,您现在位于Docker容器的Bash shell中。

8. 接下来,通过运行ls
命令验证文件是否成功复制到容器中的目录/tmp和/usr/share。

使用Docker Volume
命令挂载存储卷并访问文件
截止目前,您已经学会了使用两种不同的方法将文件从主机复制到容器,一种是使用 docker cp
命令,另一种是使用 DockerFile。这次,让我们学习如何使用 docker volume
命令轻松共享主机和容器之间的文件系统。
假设您仍然登录到终端:
1. 运行 docker volume create
命令在 Docker 主机上创建一个卷。以下命令将创建一个名为 my-vol
的卷。 sudo docker volume create my-vol
2. 运行 docker volume ls
命令验证卷是否成功创建。 docker volume ls 命令列出了卷。运行 docker volume ls
命令后,您将在 VOLUME NAME 属性中看到 my-vol
,确认卷已成功创建。

3. 接下来,使用 docker run
命令运行容器。
- 名为
volume_testing
的容器使用nginx:latest
镜像。 d
flag runs the container in the background and keeps it alive until deleted.v
flag mounts the volumemy-vol
created on Docker host to the container’s destination/app
directory.

4. 验证之前创建的卷 my-vol 是否正确地挂载到容器上,可以使用 docker inspect
命令。 Docker inspect 命令 提供容器的信息。运行 docker inspect
命令后,将显示指定容器(volume_testing
)的所有细节,包括挂载细节,如下所示。
下面,镜像快照确认了在主机上创建的卷(my-vol
)已成功地挂载到容器的 /app
目录。

结论
在本教程中,您学习了从 Docker 主机复制文件或文件夹到容器的不同方法,例如使用 Docker cp 命令、Docker 卷命令和 Dockerfile。
那么,在从主机复制数据到 Docker 容器时,您下一步要使用哪种方法?