Pretendo dividir meu servidor monolítico em vários pequenos contêineres docker, mas ainda não encontrei uma boa solução para a "comunicação entre contêineres". Este é o meu cenário-alvo:
Eu sei como vincular contêineres e como expor portas, mas nenhuma dessas soluções me satisfaz.
Existe alguma solução para se comunicar via hostnames (nomes de contêineres) entre os contêineres como em uma rede de servidor tradicional?
networking
docker
Patrick Gotthard
fonte
fonte
Respostas:
Editar: depois do Docker 1.9, o
docker network
comando (veja abaixo https://stackoverflow.com/a/35184695/977939 ) é a maneira recomendada de fazer isso.Minha solução é configurar um dnsmasq no host para que o registro DNS seja atualizado automaticamente: os registros "A" têm os nomes dos contêineres e apontam para os endereços IP dos contêineres automaticamente (a cada 10 segundos). O script de atualização automática é colado aqui:
Certifique-se de que seu serviço dnsmasq esteja disponível em
docker0
. Em seguida, inicie seu contêiner--dns HOST_ADDRESS
para usar este serviço mini dns.Referência: http://docs.blowb.org/setup-host/dnsmasq.html
fonte
O novo recurso de rede permite que você se conecte a contêineres pelo nome, portanto, se você criar uma nova rede, qualquer contêiner conectado a essa rede pode alcançar outros contêineres pelo nome. Exemplo:
1) Crie uma nova rede
2) Conecte os contêineres à rede
ou
3) Fazer ping do contêiner por nome
Consulte esta seção da documentação;
Nota: Ao contrário do legado,
links
a nova rede não criará variáveis de ambiente, nem compartilhará variáveis de ambiente com outros contêineres.Este recurso atualmente não oferece suporte a aliases
fonte
docker-compose down,up,restart
?bridge
rede padrão por causa da compatibilidade com versões anteriores, mas sim, eu concordo, definitivamente deveria ser habilitado por padrão!Isso deve ser o que
--link
é para , pelo menos para a parte hostname.Com docker 1.10 e PR 19242 , isso seria:
(veja a última seção abaixo)
Isso é o que Atualizando os
/etc/hosts
detalhes do arquivoPor exemplo, inicie um servidor LDAP:
E defina uma imagem para testar esse servidor LDAP:
Você pode expor o '
openldap
' contêiner como 'internalopenldap
' dentro da imagem de teste com --link:Então, se você digitar 'lds', esse alias funcionará:
Isso iria devolver as pessoas. O significado
internalopenldap
é alcançado corretamente a partir daldaptest
imagem.Obviamente, o docker 1.7 será adicionado
libnetwork
, o que fornece uma implementação Go nativa para conectar contêineres. Veja a postagem do blog .Introduziu uma arquitetura mais completa, com o Container Network Model (CNM)
Isso atualizará a Docker CLI com novos comandos “network” e documentará como o
-net
sinalizador “ ” é usado para atribuir contêineres às redes.docker 1.10 tem um novo alias com escopo de rede da seção , agora oficialmente documentado em
network connect
:fonte
EDIT : Não é mais uma tecnologia de ponta: http://blog.docker.com/2016/02/docker-1-10/
Resposta Original Lutei
contra isso a noite toda. Se você não tem medo de sangramento, a versão mais recente do mecanismo Docker e do Docker compor implementam libnetwork.
Com o arquivo de configuração correto (que precisa ser colocado na versão 2), você criará serviços que todos verão uns aos outros. E, bônus, você também pode escaloná-los com docker-compose (você pode escalar qualquer serviço que desejar que não vincule a porta no host)
Aqui está um arquivo de exemplo
E a referência para esta nova versão do arquivo de composição: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
fonte
Pelo que eu sei, usando apenas o Docker, isso não é possível. Você precisa de algum DNS para mapear o ip: s do contêiner para nomes de host.
Se você quiser uma solução fora da caixa. Uma solução é usar, por exemplo, Kontena . Ele vem com a tecnologia de sobreposição de rede da Weave e essa tecnologia é usada para criar redes LAN privadas virtuais para cada serviço e cada serviço pode ser alcançado
service_name.kontena.local-address
.Aqui está um exemplo simples de arquivo YAML do aplicativo Wordpress onde o serviço Wordpress se conecta ao servidor MySQL com o endereço wordpress-mysql.kontena.local:
fonte