如何让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地址,无论是主机的还是其他的。
希望这可以帮助 :-)