Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb mongo docker容器无法访问本地主机数据_Mongodb_Docker_Docker Compose - Fatal编程技术网

Mongodb mongo docker容器无法访问本地主机数据

Mongodb mongo docker容器无法访问本地主机数据,mongodb,docker,docker-compose,Mongodb,Docker,Docker Compose,我开始为一个应用程序构建一个POC,它在本地主机上托管的mongodb中生成了很多有用的数据。我使用mongoshell和MongoDb Compass连接到该数据 最近,我将monolith应用程序拆分为一组微服务,并将docker引入其中。还添加了docker compose中的mongo作为依赖项。所有的微服务和mongo容器都能够启动并运行逻辑 但是,应用程序找不到任何旧数据的引用,因为托管mongodb容器缺少localhost集合。它的行为就像一个新的数据库。关于ipBinding,

我开始为一个应用程序构建一个POC,它在本地主机上托管的mongodb中生成了很多有用的数据。我使用mongoshell和MongoDb Compass连接到该数据

最近,我将monolith应用程序拆分为一组微服务,并将docker引入其中。还添加了docker compose中的mongo作为依赖项。所有的微服务和mongo容器都能够启动并运行逻辑

但是,应用程序找不到任何旧数据的引用,因为托管mongodb容器缺少localhost集合。它的行为就像一个新的数据库。关于ipBinding,我没有做任何更改

应用程序中的mongodb连接文件指向mongodb容器(以前是
mongodb://localhost:27017/${dbName}

docker compose:

version: '3'
services:
  mongo:
    image: 'mongo'
    ports:
       - "27017:27017"

  some-api:
    build: ./some-api
    ports:
      - 8005:8105
Mongodb连接文件:

        const url = `mongodb://mongo:27017/${dbName}`;

        const client = await MongoClient.connect(url, { useNewUrlParser: true });
因此,我需要3个问题的帮助:

  • mongo容器如何使用本地主机数据或指向该数据
  • 当docker容器关闭并且在localhost mongo服务器上仍然可以看到时,我应该如何保存从docker容器生成的数据
  • 由于mongo容器在Ip上运行,我可以在容器启动并运行后使用该Ip使用mongo Compass连接它吗

  • 谢谢

    默认情况下,mongo容器不使用本地主机数据(容器化的价值在于所有内容都是独立的),但您可以使用将其链接到数据。您必须知道本地mongo文件的位置,以及它们在容器操作系统中的位置,并且可能需要在本地和容器中使用相同的存储引擎

    您的docker compose将如下所示:

    version: '3'
    services:
      mongo:
        image: 'mongo'
        volumes:
          - "/local/path/to/mongo/files/:/container/path/to/mongo/files/"
        ports:
          - "27017:27017"
    
      some-api:
        build: ./some-api
        ports:
          - 8005:8105
    

    所有容器都是与主机服务器隔离的世界,因此它们无法访问主机中的任何数据

    您可以使用链接卷()绕过此操作,您可能还需要检查mongo映像文档(备注:转到“数据存储位置”部分)


    创建卷后,您可以将其指向旧数据,但请小心,您需要使用相同版本的mongo,这样您的数据就不会损坏。

    在使用docker的MongoDB时,您需要考虑数据持久性。在某些情况下,您可能不关心在删除容器时是否删除了数据。在其他情况下,您可能希望删除容器并启动一个新容器,但保留旧数据。如果是这种情况,则需要永久性存储。您通常不能使用Docker专用IP地址。@DavidMaze您的意思是我不能使用Docker专用IP地址使用compass登录?不。特别注意,它在其他主机上不起作用,在非Linux主机上也不起作用。您必须发布一个端口并使用该端口和主机的IP地址,或者在同一主机的Docker环境中使用容器间DNS系统。我在我的计算机上检查了mongodb的本地存储,它位于/data/db。不确定容器路径。但我将卷添加为
    -“/data/db:/data/db”
    ,重新构建并重新启动容器。如果我将shell带到mongo容器并检查它,它仍然不会显示本地主机集合。
    /data/db
    /data/db
    不同,因此您可能需要使用
    /data/db/:/data/db
    。Mongo在Docker hub中的条目有一些关于存储的附加信息,这些信息可能会派上用场:我将卷添加为
    “/data/db:/data/db”
    。但那没用。所以我想手动复制这些数据。一旦数据被复制到container mongo服务器,它应该在关闭和重新启动之间保持不变,对吧,我的意思是,如果我删除容器、该映像,然后重新构建并重新启动,我仍然应该访问该数据?如果它是一个卷,它将在整个容器中保持不变。