Docker: 容器如何在容器中没有卷的情况下持久化数据?

Docker: How a container persists data without volumes in the container?

我是 运行 在 docker-compose 环境中使用的官方 solr 6.6 容器,没有任何相关卷。 如果我修改 运行 solr 容器,数据在重启后仍然存在。 我没有看到任何挂载的卷,它适用于普通的 solr 容器:

docker run --name solr_test -d -p 8983:8983 -t library/solr:6.6
docker exec -it solr_test /bin/bash -c 'echo woot > /opt/solr/server/solr/testfile'
docker stop solr_test
docker start solr_test
docker exec -it solr_test cat /opt/solr/server/solr/testfile

以上示例打印 'woot'。我以为容器不会保留任何数据? documentation 还提到 solr 核心保留在容器中。 我发现,关于容器持久性,我需要像提到的那样自己添加卷 here。 所以我很困惑:容器是否存储容器内更改的数据? solr 容器如何实现这种行为?我看到的唯一选择是,在 docker 的情况下我误解了持久性,或者容器的构建可以设置某种选项来实现这一点,我不知道也没有在 solr Dockerfile 中看到。

这是预期的行为。 只要您不删除容器,您在容器内创建的数据就会一直存在。

但是以某种方式思考容器的丢弃心态。通常,您希望能够使用 docker rm 删除容器并生成一个包含修改后的配置文件的新实例。这就是为什么你需要一个例如此处命名的卷,它在您的主机上的容器生命周期中存活。

Dockerfile,因为你在问题中提到了它,实际上只定义了图像。当您调用 docker run 时,您会从中创建一个容器。完全按照图像中的定义。一个没有任何修改的新实例。

当您在您的容器上调用 docker commit 时,您会对其进行快照(包括您对文件所做的更改)并从中创建一个新图像。他们以这种方式实现数据持久化。 您引用的文档详细解释了这一点。