【问题标题】:How to get Docker containers to talk to each other while running on my local host?如何让 Docker 容器在我的本地主机上运行时相互通信?
【发布时间】:2016-12-12 03:31:20
【问题描述】:

我的 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

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

【问题讨论】:

  • 您可以使用套接字,容器将像任何其他服务器一样通过端口进行通信。否则,您可以将它们link 一起使用,这允许单独的容器作为一个容器。

标签: docker


【解决方案1】:

今天的方法是Docker Networking

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

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

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

【讨论】:

  • 嗨,“and _default appended”是什么意思?提前谢谢!
  • @YifanAi 这意味着如果你的工作目录是 ~/myproject,当你运行 docker-compose up 时,docker 将创建一个名为 myproject_default 的桥。您可以通过运行docker network ls 来检查它
  • 如果“后端”服务器是数据库。您不想将其暴露给公共互联网,而是使用桥接网络。对吗?
【解决方案2】:

有多种方法可以做到这一点,最简单的答案是使用 码头工人组成。您可以使用 Docker-compose 来允许多个服务运行一个服务器。

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

docker run -p 3306:3306 mysql
docker run -p 8088:80 nginx 

现在您可以通过以下方式进行交流:

http://hostip:3306 
http://hostip:8088 

现在您可以使用 hostIP 与容器通信。

【讨论】:

  • 我们甚至可以使用 docker-compose.yaml 文件中提到的服务名称来代替 hostip,如果它们在同一个网络上或者它们是链接的。这也应该可以正常工作
【解决方案3】:

我认为最优雅的解决方案是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 地址,无论是主机的地址还是其他地址。

【讨论】:

  • 网络当然不是矫枉过正。 --link 命令已弃用,不应再使用...网络层是要走的路。
  • 不是矫枉过正,而是开发操作配置,而 docker 是(曾经是?)伟大的开发工具......
【解决方案4】:

在Mac的Docker首选项中的资源>网络中复制Docker子网中的IP地址: Docker preferences screenshot

从截图链接可以看出,ip地址是

192.168.65.0

您只需将容器配置文件中的“localhost”替换为“192.168.65.1”(即选择的 IP 地址 + 1)。

您可以启动您的容器,并且应该为本地开发/测试设置。

更多细节可以看我的文章: Connect Docker containers the easy way

【讨论】:

  • +1 是什么意思。
猜你喜欢
  • 2021-11-21
  • 2017-12-04
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多