Janela de encaixe de vários contêineres no AWS - Nginx usa máquina host / etc / hosts resolver

6

Eu tenho um ambiente docker de vários contêineres no Amazon Elastic Beanstalk com o seguinte arquivo 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 
          } 
        ]
      } 
    ] 
  }

Por fim, quero que o aplicativo de nó veiculado pelo nginx resolva solicitações para endereços nomeados de contêineres vinculados, portanto, no meu web image (aplicativo do nó), gostaria de fazer uma solicitação para http://api/some/resource e deixar o nginx resolver isso para o contêiner api.

Agora, como o docker adiciona uma entrada de host para o contêiner api devido ao link especificado, eu quero que o servidor nginx resolva endereços do arquivo hosts etc/hosts , mas conforme descobri, o nginx usa seu próprio resolvedor. Depois de pesquisar um pouco sobre o problema, descobri que em soluções com vários contêineres que não são do Elastic Beanstalk e com redes definidas pelo usuário, o resolvedor seria fornecido pela janela de encaixe em 127.0.0.11 , mas como atualmente não é possível definir usuários definidos pelo usuário redes no Dockerrun.aws.json , continuo procurando uma solução diferente. O links pode ser resolvido dentro do contêiner, ping ing api funciona, no entanto, nginx faz sua própria coisa lá.

Eu também li sobre dnsmasq , no entanto, eu queria fazer isso sem instalar este pacote, eu ainda tenho uma escolha aqui?

    
por the_critic 11.06.2017 / 13:54

2 respostas

1

Não há como forçar o nginx a usar as entradas de / etc / hosts.

No entanto, você pode usar um mapa {} em sua configuração do nginx para informar ao nginx como converter nomes de host em IPs. Você precisaria de um script para converter seu / etc / hosts em um formato que possa ser usado em um mapa, por exemplo, hostname ip vs ip hostname .

Aqui está um mapa de exemplo:

map $container_hostname $container_ip {
    default 127.0.0.1;
    containerA X.X.X.X;
    containerB Y.Y.Y.Y;
}

Mais tarde, no arquivo de configuração, você pode fazer:

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

location / {
    proxy_pass http://$container_ip:80;
}

O nginx corresponderá ao server_name solicitado e armazenará em $ container_hostname:

link

Em seguida, ele procurará o nome do host no mapa, obterá o IP correspondente e passará para proxy_pass.

Mais informações no mapa: link

    
por 18.04.2018 / 19:25
0

Não há nginx - não há problema. Basta substituí-lo por um balanceador de carga do aplicativo . E quanto aos pedidos dentro dos contêineres vinculados? Eles vão diretamente para os contêineres conectados de qualquer maneira, ignorando o nginx, então é inútil aqui. Você pode usar a porta 80 dentro dos contêineres e colocá-los em diferentes portas do host para conectar o balanceador de carga.

    
por 19.04.2018 / 22:34