【问题标题】:mongo docker container cannot access localhost datamongo docker 容器无法访问本地主机数据
【发布时间】:2019-10-24 16:38:54
【问题描述】:

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

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

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

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

码头工人撰写:

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 个问题的帮助:

  1. mongo 容器如何使用本地主机数据或指向该数据?
  2. 当容器关闭时,我应该如何保存从 docker 容器生成的数据,并且仍然可以在 localhost mongo 服务器上看到这些数据?
  3. 由于 mongo 容器在一个 IP 上运行,一旦容器启动并运行,我可以使用该 ip 使用 Mongo Compass 连接它吗?

谢谢!

【问题讨论】:

  • 在使用 MongoDB 和 docker 时,您需要考虑数据持久性。在某些情况下,您可能不关心在删除容器时是否删除了数据。在其他情况下,您可能希望删除容器并启动一个新容器,但保留旧数据。如果是这种情况,则需要持久存储。
  • 您一般不能使用 Docker 私有 IP 地址。
  • @DavidMaze 你的意思是我不能使用docker私有IP地址使用指南针登录?
  • 没有。特别值得注意的是,它不适用于其他主机,也不适用于非 Linux 主机。您必须发布一个端口并使用该端口和主机的 IP 地址,或者在同一主机的 Docker 环境中使用容器间 DNS 系统。

标签: mongodb docker docker-compose


【解决方案1】:

mongo 容器默认不使用你的本地主机数据(容器化的价值是一切都是分开的),但你可以使用docker volumes 将它链接到数据。您必须知道本地 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

【讨论】:

  • 我检查了我机器上 mongodb 的本地存储,它位于 /data/db。不确定容器路径。但我将卷添加为- "./data/db:/data/db" ,重建并重新启动容器。如果我将外壳带到 mongo 容器并检查它仍然不显示 localhost 集合。
  • ./data/db/data/db 不同,因此您可能需要使用/data/db/:/data/db。 Mongo 在 Docker 中心的条目有一些关于存储的附加信息可能会派上用场:hub.docker.com/_/mongo
【解决方案2】:

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

您可以使用链接卷 (https://docs.docker.com/compose/compose-file/#volumes) 绕过此问题,您可能还需要查看 mongo 映像文档(https://hub.docker.com/_/mongo PS.:转到“存储数据的位置”部分)

创建卷后,您可以将其指向旧数据,但请注意,您需要使用相同版本的 mongo,以免损坏数据。

【讨论】:

  • 我将音量添加为"./data/db:/data/db"。但这没有用。所以我想手动复制这些数据。一旦数据被复制到容器 mongo 服务器,它应该在关闭和重新启动之间持续存在,对,我的意思是如果我删除容器,那个图像然后重新构建 + 重新启动,我仍然应该得到那个数据?
  • 如果它是一个卷,它将在容器重新创建过程中持续存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2021-11-21
相关资源
最近更新 更多