将请求从一个docker容器发送到另一个

时间:2015-02-17 20:57:21

标签: node.js ubuntu docker

我试图将一些现有服务器移动到Docker容器中。我有两个:一个app服务器和一个api服务器,但是用node.js开发。我让他们都在ubuntu vm中工作,并且可以从vm之外的两个应用程序中运行,这很棒。

每个服务器都拥有自己的域名。应用服务器使用域应用,api服务器使用 api 域,我知道这很聪明。在本地我将两个域都添加到我的hosts文件中,指向分配给ubuntu vm的ip。

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

是否有一种简单的方法可以让该请求不出去并尝试解析 api 域,但让它指向api容器?

2 个答案:

答案 0 :(得分:3)

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

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

然后在app容器中,主机名api将映射到api容器。您还将拥有一组可用的环境变量,用于描述链接容器上的公开端口。例如,如果你的" api"容器暴露端口80,变量看起来像:

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

链接选项有一些缺点:

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

如果您在多主机环境中运行,可以通过您选择的业务流程工具解决这两个特定问题。

答案 1 :(得分:0)

链接功能( - link)是一项传统功能。

您应该始终更喜欢使用Docker网络驱动程序而非链接。

示例:运行Redis容器,Redis绑定到localhost,然后运行redis-cli命令并通过localhost接口连接到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

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

How do you force Visual Studio to regenerate the .designer files for aspx/ascx files?

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