Can';t使用相同的共享卷运行多个mongodb docker容器

Can';t使用相同的共享卷运行多个mongodb docker容器,mongodb,docker,docker-compose,Mongodb,Docker,Docker Compose,我想用docker compose运行两个mongo docker容器。mongo容器与docker主机具有相同的共享卷。当我用docker compose运行它时,只有一个mongo容器正在工作,而另一个正在关闭,因为它说 DBPathInUse:无法锁定锁定文件:/data/db/mongod.lock (未知错误)。另一个mongod实例已在上运行 /data/db目录,正在终止 这是我的docker文件 version: '3' services: frontend: ima

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

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

这是我的docker文件

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:
有什么办法解决这个问题吗?

问题在于:

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

不能在同一数据目录上运行两个mongo实例。这将导致数据损坏和奇怪的问题,所以mongo db明确禁止这样做(另请参见此处的问题)

你为什么要这样做?通常,您会为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:

另外,您应该考虑使用命名卷,而不是主机路径。这样做,您不需要在启动撰写文件之前在主机上创建目录。要使用命名卷,只需将卷声明从

“/var/lib/mongodb back:/data/db”
更改为
“mongodb back:/data/db”

嗯,我需要这样做,因为我在docker主机中已经有了mongo数据,我想在我的mongo服务中使用该数据。如果我使用您的建议,然后尝试从我的mongo服务访问mongo,我的数据库将变为空。好的,我认为在这种情况下,您不应该定义两个不同的数据库。如果您共享数据文件夹,它实际上只是一个数据库。所以只需在您的compose文件中定义一个mongo db,并在前端和后端引用它。嗯,好的,我明白了。谢谢你的帮助。当我想让多个即时用户拥有相同的数据时,该怎么办。因此,当1失败时,另一个可以存储数据。它可以使用replicaset来完成,但为什么不在这里呢?