我的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
请提供参考资料,说明如何实现这一目标。
答案 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地址还是其他任何地址。
希望这会有所帮助: - )