“docker cp”命令的工作原理

“docker cp”命令的工作原理,docker,centos,cp,device-mapper,Docker,Centos,Cp,Device Mapper,命令docker cp用于将文件从主机复制到容器,反之亦然。即使容器处于停止状态或已退出,此命令也有效。Docker使用分层方法存储图像,当我们使用此图像运行容器时,它会在其上方创建一个可写层,负责容器内部的所有更改。一旦我们从容器中退出,这个可写层就消失了。在这里,我无法找到docker在哪里存储该容器的数据,即使在容器退出后,docker cp命令也可以使用该容器。我搜索了/var/lib/docker目录,但没有找到运气。我将centos7.2与docker的devicemapper存储驱

命令
docker cp
用于将文件从主机复制到容器,反之亦然。即使容器处于停止状态或已退出,此命令也有效。Docker使用分层方法存储图像,当我们使用此图像运行容器时,它会在其上方创建一个可写层,负责容器内部的所有更改。一旦我们从容器中退出,这个可写层就消失了。在这里,我无法找到docker在哪里存储该容器的数据,即使在容器退出后,
docker cp
命令也可以使用该容器。我搜索了
/var/lib/docker
目录,但没有找到运气。我将centos7.2与docker的
devicemapper
存储驱动程序一起使用。有人知道吗?

第一件事是,容器有3件东西

1) cGroup 2) 名称空间 3) 文件系统

从映像生成的每个容器都由这三个部分组成,这意味着每个容器都有自己的文件系统

命令
docker cp
用于将文件从主机复制到容器,反之亦然。即使容器处于停止状态或已退出,此命令也有效。Docker使用分层方法存储图像,当我们使用此图像运行容器时,它会在其上方创建一个可写层,负责容器内部的所有更改。同意

我们把那个可写层称为容器层。一旦您退出容器,这个可写层就消失了,这意味着您没有提交更改,或者没有任何内容被新写入这个可写层。如果您完成了提交,您将获得新的docker映像,该映像带有新创建映像的附加可写层。删除容器时,未存储在数据卷中的写入容器的任何数据都将与容器一起删除

docker cp
命令即使在容器状态退出时也能工作,这意味着它确实存储在主机上的某个位置。现在,另一点是,这不是一个数据卷,它是一个目录或文件系统,我们可以直接装载到一个容器中。因此,容器中的数据由存储驱动程序管理。在CentOS中,它的
devicemapper
存储thinpool中包含的图像和层,并通过将它们安装在
/var/lib/docker/devicemapper/
的子目录下,将它们暴露到容器中。
/var/lib/deviceapper/mnt/
目录包含存在的每个映像和容器层的装入点。映像层装入点为空,但容器的装入点显示容器中出现的文件系统。它使用快照机制,其中每个图像层都是其下一层的快照

数据驻留在我们请求cp命令的容器的父映像的块级别。由于容器是图像的快照,因此它没有块,但它有一个指向最近父图像上的块的指针,该块确实存在,它从那里读取相应的块并复制它,这将可用于我们的
docker cp
命令。并且,如果容器退出,请求将直接转到相应父映像的块,并从中可以复制文件


希望你能理解这个术语。现在,您可以通过试验层和容器来测试它。祝您一切顺利。

docker容器退出时不会被删除,除非您使用。相反,您可以在容器退出后使用
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,如果内部结构在不同版本之间发生变化,我不会感到惊讶。

这很好。但docker cp命令即使在容器处于停止状态时也能工作。根据我的理解,当我们停止容器时,您的可写层已经消失,这意味着您创建的任何文件都不再可访问。那么,
docker cp
命令如何找到所需的文件?目的是,是否有docker发送结果的其他位置。