提问者:小点点

Docker容器的输出被移除后,还能恢复吗


我刚刚开始学习Docker的工作,我目前的信念是,如果有人使用rm选项运行Docker容器 - 即

docker run -rm mycontainer python3 ./mycode.py --logging='true'

然后,当容器关闭时,产生的任何输出都会消失。但是,我刚刚遇到了一些代码文档,上面写着:

“--rm:在执行结束时删除容器。注意 - 由于输出存储在卷中,因此它会持续到容器的生命周期之后”

这是什么意思?

它来自的原始命令具有以下形式:

docker run -it --name p2p -d --rm \
       --mount type=bind,source=/home/me/scripts,target=/scripts \
       --mount source=data,target=/data \
       --mount source=output,target=/output \
       --gpus device=GPU-5jhfjhjhjg-jhg-jgjgjh \
       my_docker_container \
       python3 mycode.py --logging='true' <lots of other flags>

“输出存储在卷中”是什么意思?我如何找到这个卷?


共2个答案

匿名用户

Docker卷基本上只是主机上的目录,通常在/var/lib/docker/overlay下。在OS X上访问/var/lib/docker有点棘手。

您可以运行docker卷ls列出卷,并docker卷检查

看起来您实际上并没有使用命令装载卷,但我偶尔会幸运地在/var/lib/docker下找到尚未删除/垃圾收集等的数据。

匿名用户

卷是将数据持久化到容器生存期之后的主要方法,也是在容器之间共享数据的主要方法,因此,如果卷是可写的,则一个容器所做的更改对另一个容器可见。

可以把它想象成网络上两台计算机共享的网络文件存储,而它们完全没有自己的硬盘。现在,如果计算机要关闭并重新启动,它本身就没有硬盘来获取持久数据,但是因为网络文件存储,它可以看到另一台机器对内容的最新更新。卷和容器也是如此。

docker卷的来源可以是持久磁盘存储的任何逻辑抽象,无论是windows驱动器还是linux挂载点。在容器上挂载卷时,您基本上是在容器内创建一个指向外部逻辑存储的linux挂载点,以便它看到主机看到的内容,反之亦然。例如,在您分享的示例中,容器将主机挂载点 /home/me/scripts/内容视为属于 /scripts.事实上,如果您进入容器的bash shell并在容器内 /scripts的任何文件上运行rm,它将导致 /home/me/scripts/内容也被删除,但实际上,主机和容器指向的是同样的事情。

卷对于在容器中运行数据库至关重要,因为容器本身是短暂的,当它死亡时,所有内容都会丢失。但是,拥有卷意味着,如果使用指向数据库数据所在的主机文件系统的相同卷挂载再次启动数据库容器,则数据库状态保持不变。

我所说的大部分内容都是为了获得卷的基本概念,而不是完全准确 - 我希望你明白我在说什么。这是一篇很棒的文章,深入探讨了 docker 卷。它已经坚持了 5 年,但这个概念仍然成立。