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
a1b3d130275acom hostnameserviceX.1.nq4rjbae - container
65040b1cada6com hostnameserviceX.2.m9wl1f1r - container
944704427b9ecom hostnameserviceX.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
a1b3d130275acom hostnameserviceX.1.nq4rjbae - container
65040b1cada6com hostnameserviceY.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:
- ¹ Docker - Problema - Não é possível acessar contêineres por nome de host com o driver de sobreposição do Docker no Swarm Mode
- ² nome-da-tarefa como um alias de rede para o contêiner de apoio
- ³ Defina o esquema para mapear recursos de serviço no DNS
- ⁴ Tornar o modelo de suporte de alias da rede de serviços