Como resolvo adequadamente o IP de outro contêiner em um Docker Swarm? (DNS)

2

Estou jogando com a implantação de serviços em um Docker Swarm. Estou tendo problemas para permitir que um contêiner se conecte consistentemente a um contêiner em um nó diferente.

Digamos que eu esteja criando um pool GlusterFS; Eu preciso abrir um terminal em cada contêiner e adicionar o daemon gluster ao pool. Como me refiro a outros contêineres no pool? Atualmente estou usando um endereço IP, mas e se um contêiner morrer e for recriado? Tanto quanto sei, não há garantia de que o novo contêiner terá o mesmo endereço IP. Eu poderia usar o servidor DNS incorporado para se referir aos outros contêineres, mas só consigo resolver nomes de contêiner e IDs de contêiner para endereços IP, e os dois serão alterados se um contêiner morrer e for recriado, portanto, não faz sentido. / p>

Não devo conseguir resolver os nomes de host dos outros contêineres para seus endereços IP? Eu presumi que seria, mas isso não acontece.

Existe alguma solução para o meu enigma? (Eu tenho a impressão de que posso estar usando serviços totalmente errados, e que nesse caso eu deveria criar manualmente um container em cada nó.)

    
por Hubro 12.06.2017 / 09:33

1 resposta

3

Dependendo da situação exata, você precisa usar soluções diferentes:

Resolução do nome do host intra-serviço

Problema: você tem vários containers (/ réplicas) do mesmo serviço serviceX , por exemplo:

  • container a1b3d130275a com hostname serviceX.1.nq4rjbae
  • container 65040b1cada6 com hostname serviceX.2.m9wl1f1r
  • container 944704427b9e com hostname serviceX.3.3d08baql

Agora, você deseja recuperar o nome do host do segundo ( serviceX.2.m9wl1f1r ) e do terceiro ( serviceX.3.3d08baql ) contêiner do contêiner um ( serviceX.1.nq4rjbae ).

O Docker fornece uma solução chamada descoberta de contêiner usando uma consulta DNS em relação a tasks.$serviceName , por exemplo:

nslookup tasks.serviceX
[...]
Name:      tasks.serviceX
Address 1: 10.0.0.205 a1b3d130275a  (<- resolved locally by /etc/hosts)
Address 2: 10.0.0.206 serviceX.2.m9wl1f1r
Address 3: 10.0.0.207 serviceX.3.3d08baql

Também há discussões sobre tornar serviceX.{1,2,3} resolable e, portanto, criar nomes de host previsíveis.¹ ² ³ ⁴ Mas, até o momento, nenhum deles foi implementado, portanto, essa solução só funciona em tempo de execução.

Nota: A configuração do nome do host usando o recurso de modelo (como docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}} ) tornaria os nomes de host predicáveis localmente, mas eles não poderão ser resolvidos por outros contêineres.

Resolução do nome do host entre serviços

Problema: você tem vários contêineres dos diferentes serviços serviceX , serviceY . Mas apenas um contêiner por serviço, por exemplo:

  • container a1b3d130275a com hostname serviceX.1.nq4rjbae
  • container 65040b1cada6 com hostname serviceY.2.m9wl1f1r

E você deseja se conectar a um contêiner de outro serviço ( serviceX ) de um serviço ( serviceY ) e vice-versa. Você só precisa usar o parâmetro --name :

docker service create --name=serviceX serviceX
docker service create --name=serviceY serviceY

E você pode confiar que o contêiner a1b3d130275a poderá ser resolvido pelo nome do host serviceX e pelo contêiner 65040b1cada6 pelo nome do host serviceY .

Referência:

por 30.01.2018 / 18:25