【问题标题】:Can't run multiple mongodb docker container with same shared volume无法运行具有相同共享卷的多个 mongodb docker 容器
【发布时间】:2018-10-05 07:42:20
【问题描述】:

我想用 docker compose 运行两个 mongo docker 容器。 mongo 容器与 docker 主机具有相同的共享卷。当我用 docker compose 运行它时,只有一个 mongo 容器正在工作,而另一个正在关闭,因为它说

DBPathInUse:无法锁定锁定文件:/data/db/mongod.lock (未知错误)。另一个 mongod 实例已经在 /data/db 目录,正在终止

这是我的 docker compose 文件

version: '3'
services:
  frontend:
    image: fernandomaxwell/frontend
    ports:
     - "3007:3007"
    networks:
      main:
      database_frontend:

  backend:
    image: fernandomaxwell/backend
    ports:
     - "2007:2007"
    networks:
      main:
      database_backend:

  mongo_backend:
    image: mongo
    volumes:
     - "/var/lib/mongodb:/data/db"
    ports:
     - "27017:27017"
    networks:
      database_backend:

  mongo_frontend:
    image: mongo
    volumes:
     - "/var/lib/mongodb:/data/db"
    ports:
     - "27018:27017"
    networks:
      database_frontend:

networks:
  main:
  database_backend:
  database_frontend:

有办法解决这个问题吗?

【问题讨论】:

    标签: mongodb docker docker-compose


    【解决方案1】:

    问题出在这里:

    mongo 容器与 docker 主机具有相同的共享卷

    您不能在同一个数据目录上运行两个 mongo 实例。这会导致数据损坏和奇怪的问题,因此 mongo-db 明确禁止这样做(另请参阅this 问题)

    为什么要这样做?通常,您会为您的 mongo 实例提供两个不同的卷,如下所示:

    version: '3'
    services:
      frontend:
        image: fernandomaxwell/frontend
        ports:
         - "3007:3007"
        networks:
          main:
          database_frontend:
    
      backend:
        image: fernandomaxwell/backend
        ports:
         - "2007:2007"
        networks:
          main:
          database_backend:
    
      mongo_backend:
        image: mongo
        volumes:
         - "/var/lib/mongodb-back:/data/db"
        ports:
         - "27017:27017"
        networks:
          database_backend:
    
      mongo_frontend:
        image: mongo
        volumes:
         - "/var/lib/mongodb-front:/data/db"
        ports:
         - "27018:27017"
        networks:
          database_frontend:
    
    networks:
      main:
      database_backend:
      database_frontend:
    

    此外,您应该考虑使用命名卷,而不是主机路径。这样做你不需要在启动 compose-file 之前在主机上创建目录。要使用命名卷,只需将卷声明从 "/var/lib/mongodb-back:/data/db" 更改为 "mongodb-back:/data/db"

    【讨论】:

    • 嗯,我需要这样做,因为我已经在 docker 主机中有 mongo 数据,我想在我的 mongo 服务中使用这些数据。如果我使用您的建议,然后尝试从我的 mongo 服务访问 mongo,我的数据库将变为空。
    • 好吧,我认为在这种情况下你不应该定义两个不同的数据库。如果您有效地共享数据文件夹,那么无论如何它只是一个数据库。因此,只需在您的 compose 文件中定义一个 mongo-db 并在前端和后端引用它。
    • 嗯好的,我明白了。感谢您的帮助。
    • 当我想要多个即时拥有相同数据时该怎么办。因此,当 1 个失败时,另一个可以存储数据。可以使用replicaset来完成,但是为什么不在这里呢?
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2018-10-28
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多