【问题标题】:Connecting to a container via localhost: Docker vs Kubernetes通过 localhost 连接到容器:Docker vs Kubernetes
【发布时间】:2020-10-05 11:40:48
【问题描述】:

我是云技术的新手,正在尝试学习 docker 和 kubernetes。我最近对一个使用 mongodb 进行持久性的 Spring Boot 应用程序进行了 docker 化。首先,我使用 docker run 命令启动了一个 mongodb 容器并映射了端口 27017(spring 数据用于 mongo db 的默认端口),然后在 intellij 上本地启动应用程序,一切正常。然后我创建了一个 docker compose 文件并将这两个文件放在一起,但它不起作用(mongodb 连接异常)。最终,我不得不将springboot正在寻找的mongodb主机设置为由docker启动的mongodb容器的主机(两者都在docker-compose文件中定义)作为环境变量,然后它就可以工作了。

我的问题是为什么应用程序可以从容器外部(在 intellij 上运行)通过 localhost 连接到 mongodb,而不是从内部?

提前致谢!

【问题讨论】:

    标签: mongodb docker docker-compose


    【解决方案1】:

    原因是虽然每个 docker 容器都可以从主机的网络访问,但它们只能通过它们的本地 ip 地址相互访问。 “localhost” inside docker 不再意味着它对我们 outside docker 所做的事情,因为 DNS 不会将 'localhost' 解析到 docker 内部的主机。

    确定每个容器的单独 IP 地址只是为了建立它们之间的通信有点麻烦,因此请改用用户定义的网络。引用 docker 的话:

    用户定义的网桥提供自动 DNS 解析 容器。

    查看这些链接了解更多详情:

    【讨论】:

      【解决方案2】:

      Docker 在您的机器中管理自己的网络。当您启动两个容器时,它们实际上与世界其他地方隔离,更重要的是,它们彼此隔离。就好像他们在不同的机器上运行一样

      为了让容器相互通信,您通常需要创建一个新的 docker 网络并将两个容器连接到该网络(例如连接两台机器和一个网络交换机)。因此,尝试使用 localhost 与另一个容器对话是行不通的,因为它们被视为两个不同的实体。

      Docker-compose 使整个过程更简单,因为它会自动创建 docker 网络并将 docker-compose.yml 中定义的所有容器附加到该 docker 网络。您可以在运行docker-compose 之前和之后执行docker network inspect,您将看到新网络出现。当您执行 docker-compose down 时,容器会自动与该网络分离并删除该网络。

      Here 是一些关于 docker 网络的文档

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-15
        • 2015-05-22
        • 2021-06-07
        • 2017-04-25
        • 2019-02-16
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多