2017-10-05 200 views
0

我正在运行docker-compose环境中使用的官方solr 6.6容器,没有任何相关卷。 如果我修改正在运行的solr容器,则数据会在重新启动后存活。 我没有看到任何安装的卷和它适用于普通的Solr容器:Docker:容器如何在容器中没有卷的情况下保存数据?

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 

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

+0

我可以帮你解答吗? –

+0

是的 - 很多thx,我从来没有使用码头提交,但知道它存在,主要是作为一个应用程序丢弃环境容器的想法 –

回答

2

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

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

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

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

+1

很好的答案。需要补充的是,exec只会在_running_ conatainer上执行命令。开始不是删除,如果您愿意的话,它是一个“暂停”,因此任何数据仍然有效并且容器不会被删除。当你调用start时,同一个容器被恢复 - 它不是一个新的容器创建。开始只能在已经创建的容器上调用,而不是图像 - 因为它永远不会创建图像 - 这就是运行的目的,它会从图像创建一个新的容器。所以start/stop/exec用于现有的(创建的)容器,运行创建一个新的容器。 –

+0

也许还有一个问题,我没有找到一个答案,在一个短的搜索:是否有一些选项的码头写作或码头开始迫使容器从图像开始启动 - 我知道我可以删除容器,但这会在处理撰写文件时需要额外的特殊知识。我正在考虑一些可能使用文件缓存的apache/php应用程序,我希望这个缓存可以作为例子在(重新)开始时为空。 –

+0

调查docker system prune删除网络,卷和图像以及docker up --build从Dockerfile重建它 –

相关问题