AWS 上的多容器 docker - Nginx 使用主机 /etc/hosts 解析器

the*_*tic 6 nginx containers elastic-beanstalk docker

我在 Amazon Elastic Beanstalk 上有一个多容器 docker 环境,其中包含以下Dockerrun.aws.json文件:

{ 
    "AWSEBDockerrunVersion": 2, 
    "containerDefinitions": [ 
      { 
        "name": "web", 
        "memoryReservation": 256, 
        "image": "my/nginx/repo/image",  
        "portMappings": [ 
          { 
            "hostPort": 80, 
            "containerPort": 80 
          } 
        ], 
        "links": [ 
          "api" 
        ], 
        "essential": true 
      }, 
      { 
        "name": "api", 
        "memoryReservation": 256, 
        "image": "my-api/repo", 
        "essential": true, 
        "portMappings": [ 
          { 
            "hostPort": 3000, 
            "containerPort": 80 
          } 
        ]
      } 
    ] 
  }
Run Code Online (Sandbox Code Playgroud)

最终,我希望由 nginx 服务的节点应用程序将请求解析为来自链接容器的命名地址,因此在我的web图像(节点应用程序)中,我想向http://api/some/resourcenginx发出请求并让 nginx 将其解析为 api 容器。

现在,由于 docker 由于指定的链接为 api 容器添加了一个主机条目,我希望 nginx 服务器从主机etc/hosts文件中解析地址,但是正如我发现的那样,nginx 使用它自己的解析器。在稍微研究了这个问题之后,我发现在非 Elastic Beanstalk 多容器解决方案和用户定义的网络中,解析器将由 docker on 提供127.0.0.11,但是因为目前无法在Dockerrun.aws.json,我一直在寻找不同的解决方案。该links可在容器内得到解决,ping荷兰国际集团API不工作,但是,Nginx的它自己的事情出现了。

我也读过dnsmasq,但是,我想在不安装此软件包的情况下运行它,我什至可以在这里选择吗?

Luc*_*lli 1

无法强制 nginx 使用 /etc/hosts 中的条目。

但是,您可以在 nginx 配置中使用映射 { } 来告诉 nginx 如何将主机名转换为 IP。您需要一个脚本将 /etc/hosts 转换为可在地图中使用的格式,即hostname ipvs ip hostname

这是一个示例地图:

map $container_hostname $container_ip {
    default 127.0.0.1;
    containerA X.X.X.X;
    containerB Y.Y.Y.Y;
}
Run Code Online (Sandbox Code Playgroud)

稍后在配置文件中您可以执行以下操作:

server_name   ~^(www\.)?(?<container_hostname>.+)$;

location / {
    proxy_pass http://$container_ip:80;
}
Run Code Online (Sandbox Code Playgroud)

nginx 将匹配请求server_name并将其存储在 $container_hostname 中:

http://nginx.org/en/docs/http/server_names.html#regex_names

然后它会在map中查找主机名,获取相应的IP并将其传递给proxy_pass。

有关地图的更多信息:http://nginx.org/en/docs/http/ngx_http_map_module.html