首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >` `docker cp`命令的工作原理

` `docker cp`命令的工作原理
EN

Stack Overflow用户
提问于 2017-07-24 01:19:30
回答 2查看 1.5K关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2017-07-24 05:10:28

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

1) cgroups 2)命名空间3)文件系统

从镜像中产生的每个容器都由这3个部分组成,这意味着每个容器都有自己的文件系统。

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

一旦您退出容器,这个可写的层就消失了,这意味着您还没有提交更改,或者没有新的东西被写入到这个可写的层中。如果你已经完成了提交,你将得到新的docker镜像,这个附加的可写层带有新创建的镜像。删除容器时,任何未存储在数据卷中的写入容器的数据都将随容器一起删除。

即使容器状态已退出,docker cp命令也会起作用,这意味着它确实存储在主机上的某个地方。现在,还有一点,这不是数据卷,它是我们可以直接挂载到容器中的目录或文件系统。因此,容器内的数据由存储驱动程序管理。在CentOS中,它的存储图像和层的devicemapper包含在精简池中,并通过在/var/lib/docker/devicemapper/的子目录下挂载它们来将它们公开给容器。/var/lib/devicemapper/mnt/目录包含存在的每个映像和容器层的挂载点。映像层挂载点是空的,但是容器的挂载点显示了容器内部的文件系统。它使用快照机制,其中每个图像层都是其下一层的快照。

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

希望你能理解这个术语。万事如意。

票数 3
EN

Stack Overflow用户

发布于 2017-10-07 03:35:44

除非您使用--rm option,否则停靠容器退出时不会被删除。相反,您可以在容器退出后使用docker cp将文件复制到容器中或从容器中复制文件:

代码语言:javascript
运行
复制
$ 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文件夹下找到了一些东西。

代码语言:javascript
运行
复制
$ 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文件夹似乎包含了在图像和容器之间更改的所有文件。如果我往里面看,我找到了我创建的文件。

代码语言:javascript
运行
复制
$ 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,如果这个内部结构在不同版本之间发生变化,我不会感到惊讶。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45267872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档