【问题标题】:Connecting Robo 3T to Docker MongoDB container将 Robo 3T 连接到 Docker MongoDB 容器
【发布时间】:2019-08-27 11:45:21
【问题描述】:

作为尝试解决休眠 OGM 连接问题的一部分,我想看看我是否从 Robo 3T 连接。

我构建了我的 MongoDB 映像并开始运行它。

码头工人ps:

MacBook-Pro:GoStopHandle NOTiFY$ docker ps CONTAINER ID IMAGE
命令创建的状态端口 名称 0375a68b9988 gostophandlemongodb:latest
“docker-entrypoint.s…” 5 秒前 上升 4 秒
0.0.0.0:32844->27017/tcp goStopHandleMongo

容器的IP地址是:

docker 检查 -f '{{范围 .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 0375a68b9988 172.17.0.2

我已经进入了 'mongo' shell:

docker exec -it goStopHandleMongo mongo 管理员

我添加了用户名和密码:

> db.createUser(
...   {
...     user: "NOTiFY",
...     pwd: "MyPassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
...   }
... )
Successfully added user: {
    "user" : "NOTiFY",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        },
        "readWriteAnyDatabase"
    ]
}

然后我在 Robo 3T 中创建一个连接:

然后我设置“身份验证”:

当我尝试连接时,我得到:

有什么建议吗?

【问题讨论】:

    标签: mongodb docker robo3t


    【解决方案1】:

    直到我不得不重新启动我的 Mac,我才意识到我仍然有一个本地 MongoDB 实例在运行,因此我没有连接到我的 MongoDB Docker 实例,而是我的本地(安装了 Brew)实例。

    一旦我看到 @Artjom Zabelin 回答 here 和“不要忘记将端口映射到主机端口”

    docker run --name some-mongo -p 27017:27017 -d mongo
    

    它连接到运行我的容器的 MongoDB。

    @Frank Yucheng Gu 是正确的,我需要'localhost'。

    【讨论】:

    • 惊讶地发现-p 27017:27017 是必需的。谢谢!
    【解决方案2】:

    要连接,您只需在 Robo3T 上与localhost:27017 连接即可。

    问题源于容器的内部 IP 与其外部 IP 之间的混淆。内部 IP 是容器在​​ docker 网络中的地址,它与您的主机网络隔离(除非明确桥接)。当您执行docker inspect 命令时,您在 docker 网络上获取了容器的 IP。

    您的容器正在监听 docker 网络中的 0.0.0.0:32844,并通过端口映射到端口 27017 暴露给主机。因此,如果您在 docker 网络中有另一个容器,您应该访问172.17.0.2:32844 为您服务。但是,如果您在 docker 网络之外有任何东西,您应该使用 localhost:27017[your host IP]:27017 访问您的 mongodb。

    希望这会有所帮助!

    【讨论】:

    • 谢谢。果然,我已经停止了我的“本地主机”版本的 MongoDB,我可以在 Robo 3T 中使用 127.0.0.1 进行连接,并且可以运行使用 Mongo DB 的本地 JBoss WildFly 实例。这也行得通。那么我的 Docker 容器是否使用(原始)“data/db”文件夹中的集合?我以为我必须在 Docker 文件中“添加”一个文件夹?我是否正确假设如果我想从我的 WildFly Docker 容器连接到 MongoDB Docker 容器我​​需要使用“172.17.0.2:32844”? TIA
    • 很难说没有看到您的 Dockerfile 和有关文件夹使用的 docker run 命令。是的,您是正确的,您可以使用 IP:Port 从另一个容器连接到您的 MongoDB。但是,如果您正在运行多个容器服务,则应考虑使用 docker-compose 在本地编排它们。问题是IP地址可能会发生变化,并且可能会导致问题发生。如果您使用 docker-compose 创建了堆栈,则可以使用服务名称和端口来引用您的容器,而不是使用非持久 IP。
    • 非常感谢。创建 Docker 容器相当新。会看 docker-compose。
    • 感谢这个答案。我一直在摸不着头脑,为什么我无法使用 robo3t 连接到它。就我而言,我的本地 mongo 服务器在默认 27017 下运行,因此我将其转发到 27018:27017。所以我能够在 robo3t 中连接到 localhost:27018
    【解决方案3】:

    就我而言,我在 Mac OSX 上运行 docker,而 docker 使用的是我的主机 IP 地址,因此docker inspect CONTAINER_ID --format '{{ .NetworkSettings.IPAddress }}' 会给我一个空字符串。 Mac OSX 和 Windows 上的 Docker 主机地址是 host.docker.internal。因此,在将 robo 3t 上的主机地址设置为 host.docker.internal

    后,我能够连接到在 docker 中运行的 mongodb 实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2018-05-01
      • 2019-08-15
      • 2021-02-01
      相关资源
      最近更新 更多