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.


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

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.


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.


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.