我的docker仅数据容器为空

时间:2015-12-23 17:00:26

标签: docker

我最担心的情况是:我的仅限数据的docker容器突然变空。

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

我已在this answer中读到以下内容:

  

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

我有一个mongo容器,它引用了仅数据容器,以及2)仅数据容器本身。我最近在mongo docker rm容器上运行了dockerlocal_mongo_instance_1几次,该容器引用了仅数据容器。

我可以从docker ps命令(见上文)的输出中看到,它表示仅在3小时前创建了仅数据容器'。但是我在大约两周前创建了它。不知怎的,我原来的一个已经走了。我的问题是这怎么可能发生?还有哪些其他可能性?

我已经检查了我的bash命令历史记录,docker rm命令只在mongo容器上运行,而不是在仅数据容器上运行 - 出于显而易见的原因,我一直非常小心不要触摸。

任何人都可以对此有所了解吗?我一定是误解了一些基本的东西。

对于任何其他可能导致数据容器以这种方式被删除和重新创建的情况,我将不胜感激。

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

3 个答案:

答案 0 :(得分:1)

您需要了解一些事情。

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

在您的情况下,解决方案是在Compose例如:

之外定义数据容器
docker run --name mongo_data mongodb echo "Data Container"

这将运行echo命令,然后立即退出。然后,您可以从Compose yaml中删除mongo_data条目。请注意,我故意使用mongodb图片而不是tianon/true;由于数据容器未运行,因此不会占用任何额外空间,并且使用mongodb图像可确保文件权限等正确无误。

答案 1 :(得分:0)

如果您曾经docker-compose rm(或者更糟docker-compose rm -f),则会删除docker-compose.yml中定义的所有现存容器。请注意,即使您只想使用mongo_instance启动docker-compose up mongo_instance容器,也会创建mongo_data容器,因为mongo_instance取决于mongo_datadocker-compose rm周围进行mongo_instance时会删除两个容器。

答案 2 :(得分:0)

最后我的答案是忘记使用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数据容器意味着将数据容器的创建移出.yml文件,那我将使一切变得复杂 - 我首先必须创建数据容器,然后运行docker compose:我更愿意只上传我的.yml文件并运行它。
  2. 无论如何,在调用docker-compose之前,我发现了自己创建数据容器的问题。建议您在创建数据容器时重用自己的图像,而不是使用像tianon / true这样的小型第三方图像。但是我的图像,我可以使用,只有在我运行docker-compose并且我还没有运行它时才会创建 - 鸡和蛋的情况。
  3. 我尝试使用tianon / true(和其他人)创建数据容器,我总是遇到权限问题。
  4. 所以我删除了数据容器并在mongo_instance上使用了volume参数。我希望这也解决了我原来的问题......