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

新手上路,请多包涵

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

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

我已经对后端进行了 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

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

原文由 Saqib Ali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
2 个回答

今天做到这一点的方法是 Docker Networking

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

如果您使用前面提到的 Docker Compose ,它将在您运行 docker-compose up 时为您创建一个桥接网络,名称与您的项目文件夹匹配并附加 _default 。 Compose 文件中定义的每个图像都会自动在此网络中启动。

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

原文由 CashIsClay 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Manoj Sahu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进