从一个docker集装箱发送请求到另一个

我正试图将一些现有的服务器放置在docker集装箱内。 我有两个:一个应用服务器和一个API服务器,但用node.js开发。 我有他们都在一个Ubuntu的虚拟机内工作,可以从外面的两个应用程序,这是伟大的。

每个服务器都有自己的域。 应用服务器使用域应用程序 ,API服务器使用api域,我知道聪明。 在本地我添加了两个域到我的hosts文件,指向分配给Ubuntu vm的ip。

我遇到的唯一问题是从应用服务器发送的需要路由到api服务器的请求。 试图编辑应用程序服务器容器(通过Dockerfile)和ubuntu vm的主机文件,但请求失败。

有没有一种简单的方法来获得该请求不出去,并尝试解决的API域,但得到它指向的API容器?

一个典型的解决scheme是使用Docker的--link选项来链接容器。 也就是说,如果你这样做:

 docker run -d --name api myapi docker run -d --name app --link api:api myapp 

然后在app容器中,主机名api将映射到api容器。 您还将有一组可用的环境variables来描述链接容器上的暴露端口。 例如,如果你的“api”容器暴露了端口80,那么这个variables看起来像:

 API_PORT_80_TCP=tcp://172.17.0.10:80 API_PORT_80_TCP_PORT=80 API_PORT_80_TCP_PROTO=tcp API_PORT=tcp://172.17.0.10:80 API_NAME=/app/api API_PORT_80_TCP_ADDR=172.17.0.10 

链接选项有一些缺点:

  • 这仅适用于托pipe在同一物理主机上的容器
  • 如果你重新启动“api”容器,你也必须重启“app”容器。

如果您在多主机环境中运行,那么这两个特定的问题都可以通过您select的编排工具来解决。

链接function( – 链接)是一个遗留function。

您应该总是喜欢使用Dockernetworking驱动程序进行链接。

例如 :运行带有Redis绑定到本地主机的Redis容器,然后运行redis-cli命令并通过本地主机接口连接到Redis服务器。

 $ docker run -d --name redis example/redis --bind 127.0.0.1 $ # use the redis container's network stack to access localhost $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1 

有关详细信息,请参阅文档。

https://docs.docker.com/compose/link-env-deprecated/

https://docs.docker.com/engine/reference/run/#network-settings