Como faço para definir o nome do host em docker-compose?

120

Em meu docker-compose.ymlarquivo, tenho o seguinte. No entanto, o contêiner não coleta o valor do nome do host. Alguma ideia?

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock

Quando eu verifico o nome do host no contêiner, ele não pega affy.

David Medinets
fonte
1
Qual versão do Compose você está usando?
kojiro

Respostas:

3

A partir da versão 3 do docker-compose , você pode apenas usar um hostnamecampo:

version: '3'
services:
  dns:
    hostname: 'your-name'
improvável
fonte
57

Isso parece funcionar corretamente. Se eu colocar sua configuração em um arquivo:

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF

E então traga as coisas à tona:

$ docker-compose -f compose.yml up
Creating tmp_dns_1...
Attaching to tmp_dns_1
dns_1 | 2015-04-28T17:47:45.423387 [dockerdns] table.add tmp_dns_1.docker -> 172.17.0.5

E então verifique o nome do host dentro do contêiner, tudo parece estar bem:

$ docker exec -it stack_dns_1 hostname
affy.affy.com
larsks
fonte
1
Qual versão do Compose você está usando?
kojiro
Este formato não funciona na versão mais recente do docker-compose. Arquivos YML são coisas complicadas; tem certeza de que este é o formato correto para dns?
George Stocker
3
Os arquivos YML não são tão exigentes. O que significa "não funciona"? De acordo com os documentos , hostnamee domainnamesão docker-compose.ymlopções válidas . Atualização: acabei de testar, ainda parece funcionar bem (docker-compose versão 1.4.2, docker versão 1.8.2).
larsks
Existe alguma maneira de expor esse nome de host fora do ambiente do docker? Seria bom se o host pudesse acessar os contêineres do docker por seu nome de DNS.
Paul Praet
1
Isso é possível e provavelmente vale a pena questionar. Se você pesquisar por "docker dns", encontrará vários resultados relevantes; dê uma olhada no que está lá primeiro.
larsks,
53

Descobri que o nome do host não era visível para outros contêineres durante o uso docker run. Este é um problema conhecido (talvez mais um recurso conhecido), com parte da discussão sendo:

Provavelmente deveríamos adicionar um aviso aos documentos sobre o uso do nome do host. Acho que raramente é útil.

A maneira correta de atribuir um nome de host - em termos de rede de contêiner - é definir um alias como:

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias2

Infelizmente, isso ainda não funciona com docker run. A solução alternativa é atribuir um nome ao contêiner:

docker-compose run --name alias1 some-service

E alias1pode ser executado o ping de outros contêineres.

ATUALIZAÇÃO: como @grilix aponta, você deve usar docker-compose run --use-aliasespara disponibilizar os aliases definidos.

Foz
fonte
11
Estou preso com o problema de que não consigo acessar o container por hosname de outros containers. E você é o único em toda a Internet que declarou esse problema .. já está pesquisando no Google há 20 horas
holms
7
O mesmo aqui! É uma loucura que milhões de desenvolvedores pareçam usar o Docker, mas ninguém sabe como dar um nome simples a uma caixa, nem mesmo os documentos oficiais. Muito obrigado :)
Sliq
1
Apenas no caso, agora podemos usar --use-aliasescom docker-compose run. Isso evitará a codificação do alias no runcomando
grilix
38

Com base na documentação do docker: https://docs.docker.com/compose/compose-file/#/command

Simplesmente coloco hostname: <string> em meu arquivo docker-compose.

Por exemplo:

[...]

lb01:
  hostname: at-lb01
  image: at-client-base:v1

[...]

e o contêiner lb01 é selecionado at-lb01como o nome do host.

Marcello Romani
fonte
se você tiver vários contêineres no arquivo docker-compose, definiria o nome do host para cada contêiner? isso parece muito ineficiente?
vgoklani
6
Se você precisa de nomes bem conhecidos para contêineres, essa é uma solução viável.
Marcello Romani,
9

A maneira mais simples que encontrei é apenas definir o nome do contêiner na documentação docker-compose.ymlVer container_name . É aplicável a docker-compose v1 +. Funciona de contêiner para contêiner, não da máquina host para o contêiner.

services:
  dns:
    image: phensley/docker-dns
    container_name: affy

Agora você deve conseguir acessar affyde outros contêineres usando o nome do contêiner. Tive que fazer isso para vários servidores redis em um ambiente de desenvolvimento.

OBSERVAÇÃO A solução funciona desde que você não precise escalar. Como ambientes de desenvolvedor individuais consistentes.

KJ
fonte
A Compose 3.7única maneira de obter o nome do host do serviço de banco de dados de dentro de outro contêiner de serviço da mesma pilha foi nomear o serviço como o nome do host. O uso da hostname:propriedade falhou. O uso do ambiente HOSTNAME = também falhou.
Stéphane de
Outra solução que também funcionou foi usar a aliasespropriedade conforme descrito na fozsolução.
Stephane
1
Isso funciona muito bem, mas é um pouco confuso - agora comecei a definir container_namee hostnameao mesmo valor para alcançar o que preciso
Oliver Dungey
3

Eu precisava girar o contêiner freeipa para ter um kdc funcionando e tive que dar a ele um nome de host, caso contrário ele não funcionaria. O que funcionou para mim foi definir a HOSTNAMEvariável env em compose:

version: 2
services:
  freeipa:
    environment:
      - HOSTNAME=ipa.example.test

Agora está funcionando:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test
Roy Golan
fonte
2
Para mim, usando slim, isso resulta em uma variável de ambiente HOSTNAME que não tem nenhum efeito no nome do host real do contêiner
Oliver Dungey
2
Embora isso possa ter funcionado com o contêiner que você estava usando, a diretiva de ambiente expõe apenas variáveis ​​para o contêiner. Ainda depende do contêiner fazer algo com o valor definido. Em muitos casos, provavelmente não fará nada.
MrJohnBBQ
expor um env var não tem nada a ver com o nome do host do contêiner, eles são dois domínios separados.
Marcello Romani