如何在我的本地主机上运行时让Docker容器相互通信?

时间:2016-12-12 03:31:21

标签: docker

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

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

我对后端进行了Docker化,使其在Docker容器中完全自包含并暴露了端口8000.我将此端口本地映射到4026.

现在我需要Dockerize前端。但是,如果我在本地主机上运行这两个docker容器,我怎样才能让FE向BE发送HTTP请求? 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

请提供参考资料,说明如何实现这一目标。

3 个答案:

答案 0 :(得分:17)

这样做的方法是Docker Networking,这是另一个简单提及的答案。

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

如果您按照上面提到的那样使用Docker Compose,当您运行名称与项目文件夹相匹配且附加docker-compose up的{​​{1}}时,它将为您创建桥接网络。 Compose文件中定义的每个图像都将自动在此网络中启动。

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

答案 1 :(得分:6)

有多种方法可以做到这一点,最简单的答案就是使用 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与容器进行通信。

答案 2 :(得分:4)

我认为最优雅的解决方案是create a software defined network,但对于这个简单的例子,它可能有点矫枉过正。然而,当你考虑在生产中运行时,甚至可能在不同的服务器上运行时,这是可行的方法。

在此之前,您可以选择链接容器。例如,当你曾经像这样开始你的前端容器时:

$ 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地址,无论是主持人的IP地址还是其他任何地址。

希望这会有所帮助: - )