Jak ustawić nazwę hosta w docker-compose?

120

W moich docker-compose.ymlaktach mam następujące informacje. Jednak kontener nie pobiera wartości nazwy hosta. Jakieś pomysły?

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

Kiedy sprawdzam nazwę hosta w kontenerze, nie odbiera affy.

David Medinets
źródło
1
Z jakiej wersji Compose korzystasz?
kojiro

Odpowiedzi:

57

To wydaje się działać poprawnie. Jeśli umieszczę twoją konfigurację w pliku:

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

A potem przywołaj:

$ 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

A potem sprawdź nazwę hosta w kontenerze, wszystko wydaje się być w porządku:

$ docker exec -it stack_dns_1 hostname
affy.affy.com
larsks
źródło
1
Z jakiej wersji Compose korzystasz?
kojiro
Ten format nie działa w najnowszej wersji docker-compose. Pliki YML są skomplikowane; czy na pewno jest to właściwy format dns?
George Stocker
3
Pliki YML nie są tak naprawdę skomplikowane. Co oznacza „nie działa”? Zgodnie z dokumentacją obie opcje hostnamei domainnamesą poprawnymi docker-compose.ymlopcjami. Aktualizacja: właśnie przetestowana, nadal wydaje się działać dobrze (wersja docker-compose 1.4.2, wersja docker 1.8.2).
larsks
Czy istnieje sposób na ujawnienie tej nazwy hosta poza środowiskiem Dockera? Byłoby miło, gdyby host mógł uzyskać dostęp do kontenerów dockera za pomocą ich nazwy dns.
Paul Praet,
1
Jest to możliwe i prawdopodobnie warte własnego pytania. Jeśli wyszukujesz „docker dns”, znajdziesz kilka odpowiednich wyników; najpierw zobacz, co tam jest.
larsks
53

Okazało się, że nazwa hosta nie była widoczna dla innych kontenerów podczas używania docker run. Okazuje się, że jest to znany problem (być może bardziej znany element), a część dyskusji dotyczy:

Prawdopodobnie powinniśmy dodać ostrzeżenie do dokumentacji o używaniu nazwy hosta. Myślę, że rzadko jest to przydatne.

Prawidłowym sposobem przypisania nazwy hosta - w kontekście sieci kontenerów - jest zdefiniowanie takiego aliasu :

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

Niestety to nadal nie działa docker run. Sposób obejścia problemu polega na przypisaniu kontenerowi nazwy:

docker-compose run --name alias1 some-service

I alias1może być następnie ping od innych pojemników.

AKTUALIZACJA: Jak wskazuje @grilix, należy użyć, docker-compose run --use-aliasesaby udostępnić zdefiniowane aliasy.

foz
źródło
11
Utknąłem z tym problemem, że nie mogę uzyskać dostępu do kontenera przez nazwę węża z innych kontenerów. I jesteś jedyną osobą w całym internecie, która zgłosiła ten problem ... googlowałeś już od 20 godzin
holms
7
To samo tutaj! To szaleństwo, że miliony programistów używają Dockera, ale nikt nie wie, jak nadać pudełku prostą nazwę, nawet oficjalna dokumentacja. Dziękuję bardzo :)
Sliq
1
Na wszelki wypadek teraz możemy użyć --use-aliasesz docker-compose run. Pozwoli to uniknąć zakodowania aliasu w runpoleceniu
grilix
38

Na podstawie dokumentacji Dockera: https://docs.docker.com/compose/compose-file/#/command

Po prostu hostname: <string> wstawiłem mój plik docker-compose.

Na przykład:

[...]

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

[...]

a kontener lb01 odbiera at-lb01jako nazwę hosta.

Marcello Romani
źródło
jeśli masz wiele kontenerów w pliku Docker-Compose, czy ustawisz nazwę hosta dla każdego kontenera? to wydaje się bardzo nieefektywne?
vgoklani,
6
Jeśli potrzebujesz dobrze znanych nazw kontenerów, jest to opłacalne rozwiązanie.
Marcello Romani
9

Najprostszym sposobem, jaki znalazłem, jest ustawienie nazwy kontenera w dokumentacji docker-compose.ymlZobacz nazwę kontenera . Ma zastosowanie do docker-compose v1 +. Działa dla kontenera do kontenera, a nie z maszyny hosta do kontenera.

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

Teraz powinieneś mieć dostęp affyz innych kontenerów przy użyciu nazwy kontenera. Musiałem to zrobić dla wielu serwerów redis w środowisku programistycznym.

UWAGA Rozwiązanie działa tak długo, jak długo nie ma potrzeby skalowania. Takich jak spójne indywidualne środowiska programistów.

KJ
źródło
W Compose 3.7jedynym sposobem mam hosta usługi bazy danych należy rozpatrywać od wewnątrz innego pojemnika usług tego samego stosu było nazwać usługę jako nazwę hosta. Korzystanie z hostname:właściwości nie powiodło się. Użycie konstrukcji środowiska HOSTNAME = również nie powiodło się.
Stephane
Innym rozwiązaniem, które również się sprawdziło, było wykorzystanie aliasesnieruchomości zgodnie z opisem w fozrozwiązaniu.
Stephane
1
To działa świetnie, ale jest trochę niechlujne - zabrałem się teraz do ustawiania container_namei hostnamedo tej samej wartości, aby osiągnąć to, czego potrzebuję
Oliver Dungey
3

Musiałem uruchomić kontener freeipa, aby mieć działające kdc i nadać mu nazwę hosta, w przeciwnym razie nie będzie działać. To, co ostatecznie zadziałało, to ustawienie HOSTNAMEzmiennej env w komponowaniu:

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

Teraz działa:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test
Roy Golan
źródło
2
Dla mnie użycie slim powoduje powstanie zmiennej środowiskowej HOSTNAME, która nie ma żadnego wpływu na rzeczywistą nazwę hosta kontenera
Oliver Dungey
2
Chociaż mogło to zadziałać z używanym kontenerem, dyrektywa środowiska udostępnia zmienne tylko w kontenerze. Nadal zależy od kontenera, czy coś zrobi z ustawioną wartością. W wielu przypadkach prawdopodobnie nic nie da.
MrJohnBBQ
ujawnianie env var nie ma nic wspólnego z nazwą hosta kontenera, są to dwie oddzielne dziedziny.
Marcello Romani