通过本地主机连接到容器:Docker vs Kubernetes

时间:2020-06-15 23:44:56

标签: mongodb docker docker-compose

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

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

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

为了使容器彼此通信,通常需要创建一个新的docker网络并将这两个容器连接到该网络(例如,将两台计算机分别连接到两个网络交换机)。因此,尝试使用localhost与另一个容器进行通信不起作用,因为它们被视为两个不同的实体。

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

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

答案 1 :(得分:1)

原因是,虽然可以从主机网络访问每个docker容器,但它们只能通过其本地IP地址彼此访问。 “ 内部 docker不再意味着它对我们外部 docker的作用,因为DNS不会将“ localhost”解析为docker内部的主机。

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

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

有关更多详细信息,请查看以下链接: