docker cp命令是如何工作的
命令docker cp
用于将文件从主机复制到容器,反之亦然。 即使容器处于停止状态或退出,此命令仍然有效。 Docker使用分层的方法来存储图像,当我们使用这个图像运行容器时,它会在上面创建一个更多的可写层,它负责处理容器内所做的所有更改。 一旦我们离开容器,这个可写层就消失了。 在这里,我无法知道,docker在哪里存储docker cp
命令可用的那个容器的数据,甚至在容器退出之后。 我搜索/var/lib/docker
目录,但没有运气。 我正在使用docker的devicemapper
存储驱动程序centos7.2。 有没有人有任何想法?
首先,容器有三件事
1)cgroups 2)命名空间3)文件系统
从图像中产生的每个容器都是由这3种东西组成的,这意味着每个容器都有自己的文件系统。
命令docker cp
用于将文件从主机复制到容器,反之亦然。 即使容器处于停止状态或退出,此命令仍然有效。 Docker使用分层的方法来存储图像,当我们使用这个图像运行容器时,它会在上面创建一个更多的可写层,它负责处理容器内所做的所有更改。 同意。
我们把这个可写层称为容器层 。 一旦从容器中退出,这个可写层就消失了,这意味着你没有提交更改或者没有任何东西被写入到这个可写层中。 如果你已经完成了提交,你将得到新的docker镜像,这个镜像带有新创建的镜像。 当一个容器被删除时,写入容器的任何未存储在数据卷中的数据将与容器一起被删除。
即使在容器状态退出时, docker cp
命令也可以工作,这意味着它不会存储在主机的某个地方。 另一点,这不是一个数据卷 ,它是一个目录或文件系统,我们可以直接挂载到容器中。 因此,容器内的数据由存储驱动程序管理。 在CentOS中,其存储图像和图层的devicemapper
包含在thinpool中,并通过将它们挂载在/var/lib/docker/devicemapper/
的子目录下而将其展示给容器。 /var/lib/devicemapper/mnt/
目录为存在的每个图像和容器层包含一个安装点。 图像层挂载点是空的,但容器的挂载点显示容器的文件系统,从容器中显示。 它使用快照机制,其中每个图像层是其下面图层的快照。
数据驻留在我们请求cp命令的容器的父映像的块级别。 由于容器是图像的快照,它没有该块,但它有一个指向最靠近的父图像上存在的块的指针,并从那里读取相应的块并将其复制为我们的docker cp
命令。 而且,如果容器退出,请求将直接进入相应父图像的块,并从可用于复制的文件的位置开始。
希望你能理解这个术语。 现在,您可以通过尝试使用图层和容器来测试它。 祝一切顺利。
码头容器在退出时不会被删除,除非您使用--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,如果内部结构从版本变为版本,我不会感到惊讶。