Node.js 从一个docker容器向另一个容器发送请求

Node.js 从一个docker容器向另一个容器发送请求,node.js,ubuntu,docker,Node.js,Ubuntu,Docker,我正在尝试将一些现有服务器移动到docker容器中。我有两个:一个应用服务器和一个api服务器,但都是用node.js开发的。我让他们都在ubuntu虚拟机中工作,并且可以从虚拟机外部访问这两个应用程序,这很好 每台服务器都有自己的域。应用服务器使用域app,api服务器使用api域,我知道。在本地,我将这两个域添加到我的主机文件中,以指向分配给ubuntu vm的ip 我遇到的唯一问题是,有一个从应用服务器发送的请求需要路由到api服务器。尝试编辑应用服务器容器(通过Dockerfile)和u

我正在尝试将一些现有服务器移动到docker容器中。我有两个:一个应用服务器和一个api服务器,但都是用node.js开发的。我让他们都在ubuntu虚拟机中工作,并且可以从虚拟机外部访问这两个应用程序,这很好

每台服务器都有自己的域。应用服务器使用域app,api服务器使用api域,我知道。在本地,我将这两个域添加到我的主机文件中,以指向分配给ubuntu vm的ip

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


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

一种典型的解决方案是使用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”容器

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

链接功能(--link)是一个遗留功能。

与链接相比,您应该更喜欢使用Docker网络驱动程序。

示例:运行Redis绑定到localhost的Redis容器,然后运行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
详见文档

环境变量不再是连接到链接服务的推荐方法。(仅当您使用旧版1 Compose文件格式时,才会填充环境变量),而是使用链接名称(默认情况下,链接服务的名称)作为要连接的主机名--链接是一项传统功能。您应该总是更喜欢使用Docker网络驱动程序而不是链接