Wie setze ich den Hostnamen in Docker-Compose?

120

In meiner docker-compose.ymlDatei habe ich Folgendes. Der Container nimmt jedoch den Hostnamenwert nicht auf. Irgendwelche Ideen?

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

Wenn ich den Hostnamen im Container überprüfe, wird er nicht erfasst affy.

David Medinets
quelle
1
Welche Version von Compose verwenden Sie?
Kojiro

Antworten:

2

Ab Docker-Compose Version 3 können Sie einfach ein hostnameFeld verwenden:

version: '3'
services:
  dns:
    hostname: 'your-name'
unwahrscheinlich
quelle
57

Dies scheint richtig zu funktionieren. Wenn ich Ihre Konfiguration in eine Datei lege:

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

Und dann bringen Sie die Dinge zur Sprache:

$ 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

Und dann überprüfen Sie den Hostnamen im Container, alles scheint in Ordnung zu sein:

$ docker exec -it stack_dns_1 hostname
affy.affy.com
Larsks
quelle
1
Welche Version von Compose verwenden Sie?
Kojiro
Dieses Format funktioniert in der neuesten Version von Docker-Compose nicht. YML-Dateien sind heikle Dinge; Sind Sie sicher, dass dies das richtige Format für DNS ist?
George Stocker
3
YML-Dateien sind nicht wirklich so pingelig. Was bedeutet "funktioniert nicht"? Laut den Dokumenten sind beide hostnameund domainnamegültige docker-compose.ymlOptionen. Update: gerade getestet, scheint immer noch gut zu funktionieren (Docker-Compose-Version 1.4.2, Docker-Version 1.8.2).
Larsks
Gibt es eine Möglichkeit, diesen Hostnamen außerhalb der Docker-Umgebung verfügbar zu machen? Es wäre schön, wenn der Host über seinen DNS-Namen auf die Docker-Container zugreifen könnte.
Paul Praet
1
Das ist möglich und wahrscheinlich eine eigene Frage wert. Wenn Sie nach "Docker-DNS" suchen, finden Sie mehrere relevante Ergebnisse. Schauen Sie sich zuerst an, was da draußen ist.
Larsks
53

Ich habe festgestellt, dass der Hostname bei der Verwendung für andere Container nicht sichtbar war docker run. Dies stellt sich als bekanntes Problem heraus (möglicherweise eher als bekanntes Merkmal), wobei ein Teil der Diskussion Folgendes ist:

Wir sollten den Dokumenten wahrscheinlich eine Warnung zur Verwendung des Hostnamens hinzufügen. Ich denke, es ist selten nützlich.

Die richtige Art, einen Hostnamen zuzuweisen - in Bezug auf das Containernetzwerk - besteht darin , einen Alias wie folgt zu definieren :

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

Leider funktioniert das immer noch nicht docker run. Die Problemumgehung besteht darin, dem Container einen Namen zuzuweisen:

docker-compose run --name alias1 some-service

Und alias1kann dann aus den anderen Containern gepingt werden.

foz
quelle
10
Ich habe das Problem, dass ich von anderen Containern aus nicht mit dem Namen auf den Container zugreifen kann. Und du bist der einzige im ganzen Internet, der dieses Problem angegeben hat.
Ich habe
7
Hier gilt das gleiche! Es ist verrückt, dass Millionen von Entwicklern Docker zu verwenden scheinen, aber niemand weiß, wie man einer Box einen einfachen Namen gibt, nicht einmal die offiziellen Dokumente. Vielen Dank :)
Sliq
1
Nur für den Fall, jetzt können wir --use-aliasesmit verwenden docker-compose run. Dadurch wird vermieden , die alias hartzucodieren auf dem runBefehl
grilix
38

Basierend auf der Docker-Dokumentation: https://docs.docker.com/compose/compose-file/#/command

Ich habe einfach hostname: <string> meine Docker-Compose-Datei eingefügt.

Z.B:

[...]

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

[...]

und Container lb01 wird at-lb01als Hostname übernommen.

Marcello Romani
quelle
Wenn Sie mehrere Container in der Docker-Compose-Datei haben, würden Sie den Hostnamen für jeden Container festlegen? das scheint sehr ineffizient?
Vgoklani
6
Wenn Sie bekannte Namen für Container benötigen, ist dies eine praktikable Lösung.
Marcello Romani
9

Der einfachste Weg, den ich gefunden habe, besteht darin, einfach den Containernamen in der Dokumentation docker-compose.ymlSiehe Containername festzulegen. Es gilt für Docker-Compose v1 +. Es funktioniert von Container zu Container, nicht von Host-Computer zu Container.

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

Jetzt sollten Sie affyüber den Containernamen von anderen Containern aus zugreifen können . Ich musste dies für mehrere Redis-Server in einer Entwicklungsumgebung tun.

HINWEIS Die Lösung funktioniert so lange, wie Sie nicht skalieren müssen. Wie konsistente individuelle Entwicklerumgebungen.

KJ
quelle
In Compose 3.7dem einzigen Weg , habe ich den Datenbankdienst Hostnamen aus einem anderen Service - Containern aus dem gleichen Stapel zu sehen war , den Dienst als Hostname zu nennen. Die Verwendung der hostname:Eigenschaft ist fehlgeschlagen. Die Verwendung der Umgebung HOSTNAME = Konstrukt ist ebenfalls fehlgeschlagen.
Stephane
Eine andere Lösung, die ebenfalls funktionierte, bestand darin, die aliasesin der fozLösung beschriebene Eigenschaft zu verwenden .
Stephane
1
Dies funktioniert gut , ist aber ein bisschen chaotisch - ich nun auf Einstellung genommen haben container_nameund hostnameauf den gleichen Wert , was zu erreichen Ich brauche
Oliver Dungey
3

Ich musste den Freeipa-Container drehen , um einen funktionierenden KDC zu haben, und musste ihm einen Hostnamen geben, sonst würde er nicht ausgeführt. Was letztendlich für mich funktioniert hat, ist das Setzen der HOSTNAMEenv-Variablen in compose:

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

Jetzt geht es:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test
Roy Golan
quelle
2
Für mich führt die Verwendung von slim zu einer HOSTNAME-Umgebungsvariablen, die überhaupt keinen Einfluss auf den tatsächlichen Hostnamen des Containers hat
Oliver Dungey,
2
Während dies möglicherweise mit dem von Ihnen verwendeten Container funktioniert hat, macht die Umgebungsanweisung nur Variablen für den Container verfügbar. Es liegt immer noch am Container, etwas mit dem eingestellten Wert zu tun. In vielen Fällen wird es wahrscheinlich nichts tun.
MrJohnBBQ
Das Offenlegen einer env var hat nichts mit dem Hostnamen des Containers zu tun. Es handelt sich um zwei separate Bereiche.
Marcello Romani