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 hostnameserviceX.1.nq4rjbae
- container
65040b1cada6
com hostnameserviceX.2.m9wl1f1r
- container
944704427b9e
com 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
a1b3d130275a
com hostnameserviceX.1.nq4rjbae
- container
65040b1cada6
com 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