Docker:容器如何在容器中没有卷的情况下保留数据?

时间:2017-10-05 17:34:44

标签: docker persistence

我正在运行在没有任何相关卷的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的情况下误解了peristence或者容器的构建可以设置某种选项来实现这个我不知道并且没有在solr Dockerfile中看到的。

1 个答案:

答案 0 :(得分:3)

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

但是,想想容器在某种程度上会抛弃心态。通常,您希望能够使用docker rm删除容器并生成包含已修改的配置文件的新实例。这就是为什么你需要一个例如这里命名的卷,它在主机上的容器生命周期中存活。

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

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