该命令docker cp
用于将文件从主机复制到容器,反之亦然。即使容器处于停止状态或退出,此命令也有效。Docker 使用分层方法来存储图像,当我们使用该图像运行容器时,它会在其上方再创建一个可写层,该层负责处理容器内完成的所有更改。一旦我们从容器中退出,这个可写层就消失了。在这里,我无法找到 docker 存储该容器的数据的位置,docker cp
即使在容器 exit 之后也可用于命令。我搜索/var/lib/docker
了目录,但没有运气。我正在使用 centos7.2 和 docker 的devicemapper
存储驱动程序。有人知道吗?
2 回答
首先,容器带有 3 样东西
1) cgroups 2) 命名空间 3) 文件系统
从镜像中生成的每个容器都由这三样东西组成,这意味着每个容器都有自己的文件系统。
该命令docker cp
用于将文件从主机复制到容器,反之亦然。即使容器处于停止状态或退出,此命令也有效。Docker 使用分层方法来存储图像,当我们使用该图像运行容器时,它会在其上方再创建一个可写层,该层负责处理容器内完成的所有更改。同意。
我们称该可写层为容器层。一旦你从容器中退出,这个可写层就消失了,这意味着你还没有提交更改,或者没有新的东西写入这个可写层。如果您完成了提交,您将获得新的 docker 镜像,该镜像带有这个额外的可写层和新创建的镜像。当一个容器被删除时,任何写入该容器但没有存储在数据卷中的数据将与该容器一起被删除。
docker cp
即使退出容器状态,命令也可以工作,这意味着它确实存储在主机上的某个位置。现在,另一点不是数据卷,它是我们可以直接挂载到容器中的目录或文件系统。因此,容器内的数据由存储驱动程序管理。在 CentOSdevicemapper
中,它存储图像和层包含在 Thinpool 中,并通过将它们安装在/var/lib/docker/devicemapper/
. 该/var/lib/devicemapper/mnt/
目录包含每个存在的映像和容器层的挂载点。镜像层挂载点是空的,但容器的挂载点会显示容器的文件系统,因为它从容器中显示出来。它使用快照机制,其中每个图像层都是其下层的快照。
数据位于我们请求 cp 命令的容器的父映像的块级别。由于容器是图像的快照,它没有块,但它有一个指针,指向它确实存在的最近的父图像上的块,它从那里读取相应的块并复制它,这将是可用的为我们的docker cp
命令。并且,如果容器退出,请求将直接转到相应父图像的块以及可用于复制的文件的位置。
希望你理解术语。现在,您可以通过对层和容器进行试验来测试它。一切顺利。
docker 容器在退出时不会被删除,除非您使用--rm
选项. 相反,您可以docker cp
在容器退出后将文件复制到容器或从容器复制文件:
$ docker run --name run1 alpine sh -c "date > /tmp/test.txt"
$ docker cp run1:/tmp/test.txt test.txt
$ cat test.txt
Fri Oct 6 19:23:09 UTC 2017
你问这些文件存储在哪里,所以我们需要做一些挖掘。所有的 docker 数据文件似乎都/var/lib/docker
在overlay2
.
$ sudo ls -lt /var/lib/docker/100000.100000/overlay2
total 180
drwx------ 5 100000 100000 4096 Oct 6 12:23 bda6a77ed8fad218f738f32a149d4f9f9e46b103675b8b8f990f48e3339fd315
drwx------ 2 100000 100000 4096 Oct 6 12:23 l
drwx------ 5 100000 100000 4096 Oct 6 12:23 bda6a77ed8fad218f738f32a149d4f9f9e46b103675b8b8f990f48e3339fd315-init
drwx------ 3 100000 100000 4096 Oct 6 10:30 9c2aa6553beac112794143531e7760add2c94733898ae0674c5da30c3feb9451
...
那里还有更多文件夹,但最近的一个可能包含我们正在寻找的内容。该diff
文件夹似乎包含在图像和容器之间更改的所有文件。如果我在那里查看,我会找到我创建的文件。
$ sudo ls -l /var/lib/docker/100000.100000/overlay2/bda6a77ed8fad218f738f32a149d4f9f9e46b103675b8b8f990f48e3339fd315/diff
total 4
drwxrwxrwt 2 100000 100000 4096 Oct 6 12:23 tmp
$ sudo ls -l /var/lib/docker/100000.100000/overlay2/bda6a77ed8fad218f738f32a149d4f9f9e46b103675b8b8f990f48e3339fd315/diff/tmp
total 4
-rw-r--r-- 1 100000 100000 29 Oct 6 12:23 test.txt
$ sudo cat /var/lib/docker/100000.100000/overlay2/bda6a77ed8fad218f738f32a149d4f9f9e46b103675b8b8f990f48e3339fd315/diff/tmp/test.txt
Fri Oct 6 19:23:09 UTC 2017
$
docker cp
只是为我做所有的挖掘工作。容易得多。我使用的是 docker 17.09.0-ce,如果这个内部结构在不同版本之间发生变化,我不会感到惊讶。