通过卷的docker持久存储

时间:2020-03-31 04:02:12

标签: docker storage persistence docker-volume

所有读物都在说我们可以通过VOLUME控件(例如herehere)创建docker持久性存储。

但是,我的Dockerfile中有以下内容:

VOLUME      ["/home", "/root"]

,但是什么都没有保留(我尝试过touch abc,当我退出并再次返回时,文件不存在)。

我看到official usage没有其他特殊控件或处理方法,但是即使apt-cacher-ng服务容器已停止,它也可以提供持久存储。

那怎么可能?我已经检查了以下内容,但仍然没有任何线索:

最后,如here所述:

第一种机制将为请求基于主机的持久性的容器创建一个隐式存储沙箱。 ...关键要理解的是,存储在沙箱中的数据对其他容器(请求存储容器的容器除外)不可用。

如何使永久存储有效?为什么apt-cacher-ng服务容器即使停止并重新启动也能保持其持久性存储,所以每次更改都被擦除? 我在这里看不到的“其他特殊控制或处理方法” 是什么?

请说明简单的Dockerfile(而不是docker-compose.yml)。

1 个答案:

答案 0 :(得分:1)

问题在于,使用docker run时,VOLUME指令会创建一个外部存储,而该特定文件夹没有使用“ mount”选项。换句话说,每次您为该图像创建一个容器时,docker都会创建一个带有随机标签的新卷,但是由于您没有给这些卷取一个名称,因此新容器无法重用现有的已生成卷。

例如

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

如果仅使用以下命令构建并运行此Docker映像,则给出此Dockerfile:

echo "There are currently $(docker volume ls | wc -l) volumes"

docker build -t my_volume_test:latest .
docker run --name another_test my_volume_test:latest

echo "There are currently $(docker volume ls | wc -l) volumes"

您将看到计算机上存在的卷数量增加了。该容器现在正在使用一个卷来存储数据,但该特定卷没有名称或标签,因此仅绑定到该特定容器。如果删除并重新创建该容器,则docker将生成一个具有随机名称的新卷,除非您设法挂载先前创建的卷。

如果您想使其变得简单,我建议先创建该卷并安装它。例如

docker rm -f another_test
docker volume create my-vol

docker run \
    --name another_test \
    --mount source=my-vol,target=/myvol \
    my_volume_test:latest

# alternative
docker rm -f another_test
docker run \
    --name another_test \
    -v my-vol:/myvol \
    my_volume_test:latest

在这种情况下,您可以创建和删除任意数量的容器,但它们都将使用相同的卷。

检查VOLUME referenceUse volumes以获得更多信息。