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

Saq*_*Ali 19 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
Run Code Online (Sandbox Code Playgroud)

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

Cas*_*lay 22

今天的方法是Docker Networking,另一个答案简要提到.

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

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

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

  • “从那里,使用同一网络启动的容器可以通过暴露的端口相互通信”。如何?端口不是有效的 URL!你需要像“http://something/or/other:port”之类的东西,OP明确表示他想要http。什么是“某事/或/其他”? (4认同)

Man*_*ahu 8

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

  • 我们甚至可以使用 docker-compose.yaml 文件中提到的服务名称而不是 hostip,如果它们在同一网络上或者它们是链接的。这也应该可以正常工作 (2认同)

Gol*_*den 7

我认为最优雅的解决方案是创建一个软件定义的网络,但是对于这个简单的示例来说,这可能有点过头了。但是,当您考虑在生产环境中运行某些东西时,甚至可能在不同的服务器上运行,这也是要走的路。

在此之前,您可以选择链接容器。例如,当您像这样启动前端容器时:

$ docker run -p 8080:8080 --name frontend my-frontend
Run Code Online (Sandbox Code Playgroud)

您现在可以这样做:

$ docker run -p 8080:8080 --name frontend --link backend:backend my-frontend
Run Code Online (Sandbox Code Playgroud)

这里的技巧是还启动后端容器并使用该--name标志为其命名。然后,您可以在--link标记中引用此名称,并使用其名称从前端容器中访问后端(--link注意将链接的容器自动添加到/etc/hosts文件中)。

这样,您不必依赖特定的IP地址,无论它是主机的IP地址还是其他。

希望这可以帮助 :-)

  • 网络肯定不是矫kill过正。不推荐使用--link命令,因此不应再使用...网络层是必经之路。 (9认同)