Come imposto il nome host in docker-compose?


120

Nel mio docker-compose.ymlfile, ho quanto segue. Tuttavia, il contenitore non rileva il valore del nome host. Qualche idea?

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

Quando controllo il nome host nel contenitore, non viene rilevato affy.


1
Quale versione di Compose stai utilizzando?
kojiro

Risposte:



57

Questo sembra funzionare correttamente. Se metto la tua configurazione in un file:

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

E poi tirare fuori le cose:

$ 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 poi controlla il nome host all'interno del contenitore, sembra tutto a posto:

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

1
Quale versione di Compose stai utilizzando?
kojiro

Questo formato non funziona nell'ultima versione di docker-compose. I file YML sono cose complicate; sei sicuro che questo sia il formato giusto per dns?
George Stocker

3
I file YML non sono poi così schizzinosi. Cosa significa "non funziona"? Secondo i documenti , entrambi hostnamee domainnamesono docker-compose.ymlopzioni valide . Aggiornamento: appena testato, sembra ancora funzionare bene (docker-compose versione 1.4.2, docker versione 1.8.2).
Larsks

C'è un modo per esporre questo nome host al di fuori dell'ambiente docker? Sarebbe bello se l'host potesse accedere ai container Docker con il loro nome DNS.
Paul Praet

1
Questo è possibile, e probabilmente vale la sua stessa domanda. Se cerchi "docker dns" troverai diversi risultati rilevanti; guarda prima cosa c'è là fuori.
Larsks

53

Ho scoperto che il nome host non era visibile ad altri contenitori durante l'utilizzo docker run. Questo risulta essere un problema noto (forse più una caratteristica nota), con una parte della discussione che è:

Probabilmente dovremmo aggiungere un avviso alla documentazione sull'utilizzo del nome host. Penso che sia raramente utile.

Il modo corretto di assegnare un nome host, in termini di networking del contenitore, è definire un alias in questo modo:

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

Purtroppo questo ancora non funziona con docker run. La soluzione alternativa consiste nell'assegnare un nome al contenitore:

docker-compose run --name alias1 some-service

E alias1può quindi essere eseguito il ping dagli altri contenitori.

AGGIORNAMENTO: come sottolinea @grilix, dovresti usare docker-compose run --use-aliasesper rendere disponibili gli alias definiti.


11
Sono bloccato con quel problema che non riesco ad accedere al contenitore tramite hosname da altri contenitori. E tu sei l'unico in tutta Internet che ha affermato questo problema ... ho già cercato su Google per 20 ore
holms

7
Anch'io! È assurdo che milioni di sviluppatori sembrino usare Docker, ma nessuno sa come dare a una scatola un nome semplice, nemmeno i documenti ufficiali. Grazie mille :)
Sliq

1
Per ogni evenienza, ora possiamo usare --use-aliasescon docker-compose run. Ciò eviterà di codificare l'alias sul runcomando
grilix

38

Basato sulla documentazione di Docker: https://docs.docker.com/compose/compose-file/#/command

Ho semplicemente inserito il hostname: <string> mio file docker-compose.

Per esempio:

[...]

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

[...]

e il contenitore lb01 prende at-lb01come nome host.


se hai più contenitori nel file docker-compose, imposteresti il ​​nome host per ogni contenitore? sembra molto inefficiente?
vgoklani

6
Se hai bisogno di nomi noti per i contenitori, questa è una soluzione praticabile.
Marcello Romani

9

Il modo più semplice che ho trovato è semplicemente impostare il nome del contenitore nella documentazione docker-compose.ymlVedere container_name . È applicabile a docker-compose v1 +. Funziona da contenitore a contenitore, non dalla macchina host al contenitore.

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

Ora dovresti essere in grado di accedere affyda altri contenitori utilizzando il nome del contenitore. Ho dovuto farlo per più server Redis in un ambiente di sviluppo.

NOTA La soluzione funziona finché non è necessario ridimensionare. Ad esempio ambienti di sviluppo individuali coerenti.


In Compose 3.7l'unico modo ho ottenuto il nome host servizio di database per essere visto dal di dentro un altro contenitore servizio dello stesso stack è stato per il nome del servizio come il nome dell'host. Utilizzo della hostname:proprietà non riuscito. Anche l'utilizzo dell'ambiente HOSTNAME = costrutto non è riuscito.
Stephane

Un'altra soluzione che ha funzionato, è stata quella di utilizzare la aliasesproprietà come descritto nella fozsoluzione.
Stephane

1
Funziona benissimo ma è un po 'disordinato - ora ho preso l'impostazione container_namee hostnamelo stesso valore per ottenere ciò di cui ho bisogno
Oliver Dungey

3

Avevo bisogno di far girare il container freeipa per avere un kdc funzionante e dovevo dargli un nome host altrimenti non funzionava. Quello che alla fine ha funzionato per me è l'impostazione della HOSTNAMEvariabile env in compose:

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

Ora funziona:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
Per me, l'utilizzo di slim, si traduce in una variabile d'ambiente HOSTNAME che non ha alcun effetto sul nome host effettivo del contenitore
Oliver Dungey

2
Sebbene ciò possa aver funzionato con il contenitore che stavi utilizzando, la direttiva di ambiente espone solo le variabili al contenitore. Sta ancora al contenitore fare qualcosa con il valore impostato. In molti casi probabilmente non farà nulla.
MrJohnBBQ

esporre un env var non ha nulla a che fare con il nome host del contenitore, sono due ambiti separati.
Marcello Romani
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.