我的docker数据专用容器是空的

我最担心的情况发生了:我的数据专用的docker容器突然变空了。

这不是严肃的:这是一个开发机器,我有备份。 但我最担心这一点,因为我知道我对Docker的理解仍然存在漏洞。

我已经阅读了这个答案如下:

Docker容器将保留在磁盘上, 直到用docker rm显式删除它们

以下是我感兴趣的容器(来自docker ps命令):

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 478e59ecd218 dockerlocal_mongo_instance "/entrypoint.sh mongo" About an hour ago Exited (137) 12 minutes ago dockerlocal_mongo_instance_1 0ca49f6629cb tianon/true "/true" 3 hours ago Exited (0) About an hour ago dockerlocal_mongo_data_1 

我有1)一个引用数据专用容器的mongo容器,以及2)仅数据容器本身。 我最近在mongo dockerlocal_mongo_instance_1容器上运行了dockerlocal_mongo_instance_1 docker rm ,这个容器引用了data-only容器。

我可以从docker ps命令的输出(见上面)中看到,它表示只有数据的容器是在“3小时前”创build的。 但是我在2个星期前创造了它。 不知何故,我原来的一个走了。 我的问题是如何发生这种情况? 还有什么其他的可能性?

我已经检查了我的bash命令历史logging, docker rm命令只在mongo容器上运行,而不是在data-only容器上运行 – 由于显而易见的原因,我一直非常小心不要触及。

任何人都可以解释这一点吗? 我一定误解了一些根本的东西。

我将不胜感激任何其他可能的情况下,可能会导致数据容器被抛弃,并以这种方式重新创build。

Docker撰写.yml文件(相关位):

 mongo_data: image: tianon/true volumes: - /data/db mongo_instance: build: mongodb volumes_from: - mongo_data ports: - "27017:27017" environment: - MONGODB_USER=$S_USER_NAME - MONGODB_PASS=$S_USER_PASSWORD # command: --auth 

有几件事情你需要了解。

  • 数据容器不需要,也不应该运行。 它实际上只是可以从其他容器引用的一组卷的名称空间。 就你而言,每次启动应用程序时,数据容器都会启动,运行正常,然后closures。 如果你只是创build一个容器而不再运行它会更好。
  • Docker Compose定义组成应用程序的正在运行的服务。 它有很多与决定何时重新创build容器或重新使用现有的逻辑有关的逻辑,在某个阶段决定重新创build数据容器(我不确定为什么在这种情况下)。 你只能把东西放在Compose中,不需要被持久化。 另外请注意,Compose将尝试将旧容器中的卷复制到新容器中,如果您不期待,可能会造成混淆。

在你的情况下,解决的办法是在Compose外部定义数据容器,例如:

 docker run --name mongo_data mongodb echo "Data Container" 

这将运行echo命令,然后立即退出。 然后可以从Compose yaml中删除mongo_data条目。 请注意,我有意使用了mongodb图像而不是tianon/true ; 作为一个数据容器不运行,它不会占用任何额外的空间和使用mongodb图像确保文件权限等是正确的。

如果你曾经运行docker-compose rm (或者更糟糕的是docker-compose rm -f ),那么你将会删除docker-compose.yml中定义的所有现存容器。 需要注意的是,即使你只打算用mongo_instance容器docker-compose up mongo_instancemongo_data容器也会被创build,因为mongo_instance依赖于mongo_data ,所以当mongo_instance在周围的时候, mongo_instance docker-compose rm同时删除容器。

对我来说最后的答案是忘记使用docker数据容器,只需在mongo容器上设置一个正常的卷。

 mongo_instance: build: mongodb volume: - /data/db:/data/db ports: - "27017:27017" environment: - MONGODB_USER=$S_USER_NAME - MONGODB_PASS=$S_USER_PASSWORD 

为什么?

  1. 在我看来,使用Docker Compose的主要原因是因为它的可移植性。 您可以轻松地在一个地方运行所有的docker命令,这意味着一个简单的安装。 因此,如果使用docker数据容器意味着将数据容器的创build从.yml文件中移出来,我就会使所有事情变得复杂 – 我首先需要创build数据容器,然后运行docker compose:我宁愿上传我的.yml文件并运行它。
  2. 在调用docker-compose之前,我自己创build数据容器时发现问题。 build议您在创build数据容器时重用自己的映像,而不要使用像tianon / true这样的小型第三方映像。 但是,我可能能够使用的图像只在运行docker-compose时创build,而我还没有运行它 – 鸡和鸡蛋的情况。
  3. 我尝试使用tianon / true(和其他)创build一个数据容器,而且我总是遇到权限问题。

所以我已经删除了数据容器,并在mongo_instance上使用了一个卷参数。 我希望这也解决了我原来的问题…