当前位置: 首页 > 知识库问答 >
问题:

我的 Docker 纯数据容器为空

储毅
2023-03-14

我最担心的情况发生了:我的纯数据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)纯数据容器本身。我最近在引用纯数据容器的mongodockerlocal_mongo_instance_1容器上运行了几次docker rm。

我可以从< code>docker ps命令(见上文)的输出中看到,它说纯数据容器是“3小时前”创建的。但是我在两周前创建了它。不知何故,我原来的那个不见了。我的问题是这怎么可能发生?还有哪些可能性?

我检查了我的bash命令历史,并且< code>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个答案

荆乐
2023-03-14

最后,我的答案是忘记使用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(和其他工具)创建数据容器,但总是遇到权限问题

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

滕成双
2023-03-14

如果您曾经运行docker-compose-rm(或者更糟的是,docker-copose-rm-f>),那么会删除 docker-compose-up-mongo_instance启动 mongo_instancecontainer,也会创建 mongo_instance依赖于 ,因此在 0.05 mongo_nstancedocker-compose-ompose-rm

富钧
2023-03-14

有几件事你需要明白。

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

在您的情况下,解决方案是在Compose之外定义数据容器,例如:

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

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

 类似资料:
  • 本文向大家介绍Docker 仅数据容器,包括了Docker 仅数据容器的使用技巧和注意事项,需要的朋友参考一下 示例 仅数据容器已过时,现在被视为反模式! 在过去的日子里,在使用Docker的volume子命令之前以及在可以创建命名卷之前,当在任何容器中都不再有对它们的引用时,Docker删除了这些卷。仅数据容器已过时,因为Docker现在可以通过各种docker volume子命令创建命名卷以及

  • 我在本地机器上运行这个命令docker run-d--name SonarQube-p9000:9000-p9092:9092 SonarQube 这将从dockerhub获取分支的映像,然后创建映像的容器。现在我想对文件进行一些更改,但容器中没有编辑器。我尝试使用apt-get安装vi,但它说我需要是根用户才能执行命令,当我编写sudo时,它说找不到命令。如何在容器中安装编辑器? 我运行这个命令

  • 我在我的项目中使用postgres docker映像。对于初始化,我使用以下命令来创建和初始化我的数据库(表、视图、数据…) 复制sql_dump.sql /docker-entrypoint-initdb.d 容器停止和删除后是否可以保留这些数据?例如,当我运行postgres的图像时,它将使用这些数据创建数据库,而每次容器启动时都没有加载脚本。只需加载第一次运行创建的数据。 我做了一些研究,发

  • 但是这个问题的答案并没有解决我的用例。 我有一个MySQL数据库,在生产中有5TB的数据。对于开发,我只需要大约500MB的数据。作为我的应用程序构建的一部分运行的集成测试需要访问MySQL数据库。目前,该数据库正在Jenkins上创建,并且通过构建过程将数据注入其中。这很慢。 我想用Docker替换这个过程的这一部分。我的想法是,我将拥有一个运行MySQL的Docker容器,并且已经将500MB

  • 我使用docker撰写启动一个mysql da和一个springstart应用程序。 这是我的docker-compose.yml 这是我的application.properties 在这里,我创建了jdbi: 不管我怎么做,我都无法让集装箱在码头内相互交谈。如果我单独启动sql,我可以在主机中看到连接(在datagrip中)。如果我从容器中运行java程序,它会看到主机中的数据库。即使我运行d

  • 在将Django docker容器连接到Postgres数据库时,我收到以下错误。 下面是运行容器的Dockerfile pg_hba.conf->宿主all all 0.0.0.0/0 md5 我已经读到上面的以下细节打开数据库上的连接。