¿Cómo configuro el nombre de host en docker-compose?


120

En mi docker-compose.ymlarchivo, tengo lo siguiente. Sin embargo, el contenedor no recoge el valor del nombre de host. ¿Algunas ideas?

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

Cuando verifico el nombre de host en el contenedor, no responde affy.


1
¿Qué versión de Compose estás usando?
kojiro

Respuestas:



57

Esto parece funcionar correctamente. Si pongo tu configuración en un archivo:

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

Y luego menciona las cosas:

$ 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

Y luego verifique el nombre de host dentro del contenedor, todo parece estar bien:

$ docker exec -it stack_dns_1 hostname
affy.affy.com

1
¿Qué versión de Compose estás usando?
kojiro

Este formato no funciona en la última versión de docker-compose. Los archivos YML son cosas delicadas; ¿Está seguro de que este es el formato correcto para dns?
George Stocker

3
Los archivos YML no son tan delicados. ¿Qué significa "no funciona"? Según los documentos , ambos hostnamey domainnameson docker-compose.ymlopciones válidas . Actualización: recién probado, todavía parece funcionar bien (docker-compose versión 1.4.2, docker versión 1.8.2).
larsks

¿Hay alguna forma de exponer este nombre de host fuera del entorno de Docker? Sería bueno si el host pudiera acceder a los contenedores de la ventana acoplable por su nombre de DNS.
Paul Praet

1
Eso es posible, y probablemente valga la pena su propia pregunta. Si busca "docker dns", encontrará varios resultados relevantes; primero eche un vistazo a lo que hay ahí fuera.
larsks

53

Descubrí que el nombre de host no era visible para otros contenedores al usar docker run. Esto resulta ser un problema conocido (quizás más una característica conocida), y parte de la discusión es:

Probablemente deberíamos agregar una advertencia a los documentos sobre el uso del nombre de host. Creo que rara vez es útil.

La forma correcta de asignar un nombre de host, en términos de redes de contenedores, es definir un alias así:

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

Desafortunadamente, esto todavía no funciona con docker run. La solución alternativa es asignar un nombre al contenedor:

docker-compose run --name alias1 some-service

Y alias1luego se puede hacer ping desde los otros contenedores.

ACTUALIZACIÓN: Como señala @grilix, debe usar docker-compose run --use-aliasespara hacer que los alias definidos estén disponibles.


11
Estoy atascado con el problema de que no puedo acceder al contenedor por nombre de host desde otros contenedores. Y usted es el único en todo Internet que declaró este problema ... ya ha estado buscando en Google durante 20 horas
holms

7
¡Igual que aquí! Es una locura que millones de desarrolladores parezcan usar Docker, pero nadie sabe cómo darle un nombre simple a una caja, ni siquiera los documentos oficiales. Muchas gracias :)
Sliq

1
Por si acaso, ahora podemos usar --use-aliasescon docker-compose run. Esto evitará codificar el alias en el runcomando
grilix

38

Basado en la documentación de Docker: https://docs.docker.com/compose/compose-file/#/command

Simplemente coloco hostname: <string> mi archivo docker-compose.

P.ej:

[...]

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

[...]

y el contenedor lb01 lo toma at-lb01como nombre de host.


si tiene varios contenedores en el archivo docker-compose, ¿establecería el nombre de host para cada contenedor? eso parece muy ineficiente?
vgoklani

6
Si necesita nombres conocidos para contenedores, esa es una solución viable.
Marcello Romani

9

La forma más sencilla que he encontrado es establecer el nombre del contenedor en la documentación docker-compose.ymlVer nombre_contenedor . Es aplicable a docker-compose v1 +. Funciona de contenedor a contenedor, no de la máquina host al contenedor.

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

Ahora debería poder acceder affydesde otros contenedores utilizando el nombre del contenedor. Tuve que hacer esto para varios servidores redis en un entorno de desarrollo.

NOTA La solución funciona siempre que no necesite escalar. Como entornos de desarrolladores individuales consistentes.


En Compose 3.7la única manera me dieron el nombre de host del servicio de base de datos para ser vista desde dentro de otro contenedor de servicios de la misma pila fue nombrar el servicio como el nombre de host. hostname:Falló el uso de la propiedad. El uso del entorno HOSTNAME = construct también falló.
Stephane

Otra solución que también funcionó fue usar la aliasespropiedad como se describe en la fozsolución.
Stephane

1
Esto funciona muy bien pero es un poco complicado: ahora me he dedicado a la configuración container_namey hostnameal mismo valor para lograr lo que necesito
Oliver Dungey

3

Necesitaba girar el contenedor freeipa para tener un kdc que funcionara y tuve que darle un nombre de host, de lo contrario no se ejecutaría. Lo que finalmente funcionó para mí es configurar la HOSTNAMEvariable env en compose:

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

Ahora funciona:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
Para mí, usar slim da como resultado una variable de entorno HOSTNAME que no tiene ningún efecto en el nombre de host real del contenedor
Oliver Dungey

2
Si bien esto puede haber funcionado con el contenedor que estaba usando, la directiva de entorno solo expone variables al contenedor. Aún depende del contenedor hacer algo con el valor establecido. En muchos casos, probablemente no hará nada.
MrJohnBBQ

exponer una var env no tiene nada que ver con el nombre de host del contenedor, son dos reinos separados.
Marcello Romani
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.