如何让Docker容器在本地主机上运行时彼此交谈?

我有一个完全本地运行在我的MacBook上的Web应用程序。

Webapp有一个前端(Angular / Javascript)和一个后端(Python / Django),它实现了一个RESTful API。

我已经Docker化后端,以便它完全自包含在一个Docker容器中,并公开端口8000.我将这个端口本地映射到4026。

现在我需要Dockerize前端。 但是,如果我有我的本地主机上运行这两个docker集装箱,我怎么能让FE发送HTTP请求到BE? FE容器将不知道任何外部存在的东西。 对?

这是我如何运行FE:

$ http-server Starting up http-server, serving ./ Available on: http://127.0.0.1:8080 http://192.168.1.16:8080 Hit CTRL-C to stop the server 

请提供参考资料,解释如何实现这一点。

今天的方法是Docker Networking ,简单地提到了另一个答案。

简短版本是,您可以运行docker network ls来获取您的networking列表。 默认情况下,你应该有一个被称为bridge 。 你可以创build一个新的或使用这个 – 创build你的容器时传递--net=bridge 。 从那里,在同一networking上启动的容器可以通过暴露的端口相互通信。

如上所述,如果您使用Docker Compose ,那么当您运行docker-compose up时,会为您创build一个桥接networking,其名称与项目的文件夹匹配,并附加_default 。 在撰写文件中定义的每个图像将自动在该networking中启动。

所有这一切,我猜你的前端是一个Web服务器,只是提供了HTML / JS / CSS和这些页面访问后端服务。 如果这是准确的,那么在这种情况下,你并不需要容器到容器的通信,因为连接源于客户端系统,所以都需要暴露给主机。

他们有多种方式来做到这一点,最简单的答案是使用Docker-Compose 。 使用Docker-Compose,您可以集成多个服务来运行服务器。

如果您不使用Docker-Compose并运行单个容器,而是将两个服务端口与主机公开在一起,然后在如下链接上使用这些服务:

docker run -p 3306:3306 mysql

docker run -p 8088:80 nginx

现在你可以沟通了:

http://hostip:3306 http://hostip:8088等现在你可以使用hostIP与容器进行通信。

我认为最优雅的解决scheme是创build一个软件定义的networking ,但是对于这个简单的例子,这可能有点矫枉过正。 尽pipe如此,当你考虑在生产环境中运行的时候,甚至是在不同的服务器上运行时,这是要走的路。

在此之前,您可以select链接容器。 例如,当你用这个开始你的前端容器时:

 $ docker run -p 8080:8080 --name frontend my-frontend 

你现在可以这样做:

 $ docker run -p 8080:8080 --name frontend --link backend:backend my-frontend 

这里的技巧是也启动后端容器,并使用--name标志给它一个名字。 然后,可以在--link标志中引用该名称,并使用其名称访问后端容器中的后端( --link负责自动将链接的容器添加到/etc/hosts文件中)。

这样你就不必依赖一个特定的IP地址,无论是主机的还是其他的。

希望这可以帮助 :-)