Як встановити ім'я хоста в docker-compose?


120

У своєму docker-compose.ymlфайлі я маю таке. Однак контейнер не набирає значення імені хоста. Якісь ідеї?

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

Коли я перевіряю ім'я хоста в контейнері, воно не збирається affy.


1
Яку версію Compose ви використовуєте?
kojiro

Відповіді:



57

Здається, це працює правильно. Якщо я помістив ваш конфігурацію у файл:

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

А потім піднесіть речі:

$ 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

Потім перевірте ім'я хоста всередині контейнера, і все здається нормально:

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

1
Яку версію Compose ви використовуєте?
kojiro

Цей формат не працює в останній версії docker-compose. Файли YML - це вигадливі речі; Ви впевнені, що це правильний формат для dns?
Джордж Стокер

3
Файли YML насправді не такі вибагливі. Що означає "не працює"? Згідно з документами , обидва hostnameі domainnameє дійсними docker-compose.ymlваріантами. Оновлення: щойно тестоване, все ще здається, що він працює добре (версія докера 1.4.2, версія докера 1.8.2).
larsks

Чи є спосіб викрити це ім'я хоста поза середовищем докера? Було б добре, якби хост міг отримати доступ до контейнерів docker за своїм ім'ям dns.
Пол Прает

1
Це можливо, і, мабуть, варто це власне питання. Якщо ви шукаєте "docker dns", ви знайдете кілька відповідних результатів; погляньте, що там спочатку.
larsks

53

Я виявив, що ім'я хоста не було видимим для інших контейнерів під час використання docker run. Це виявляється відомим питанням (можливо, більш відомою особливістю), частиною дискусії є:

Ми, мабуть, повинні додати документацію попередження про використання імені хоста. Я думаю, що це рідко корисно.

Правильний спосіб призначення імені хоста - з точки зору мережі контейнерів - це визначити псевдонім на зразок такого:

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

На жаль, це все ще не працює docker run. Вирішення завдання полягає у призначенні імені контейнера:

docker-compose run --name alias1 some-service

А alias1потім може пінгнути з інших контейнерів.

ОНОВЛЕННЯ: Як вказує @grilix, вам слід використовувати docker-compose run --use-aliasesдоступні визначені псевдоніми.


11
Я застряг у тій проблемі, що я не можу отримати доступ до контейнера за назвою hosname з інших контейнерів. І ти єдиний в цілому Інтернеті, який заявив про цю проблему .. гуглив уже 20 годин
триває

7
Те ж саме! Це божевільно, що, здається, мільйони розробників використовують Docker, але ніхто не знає, як дати коробці просте ім’я, навіть офіційні документи. Дякую тобі :)
Sliq

1
На будь-якому разі, тепер ми можемо використовувати --use-aliasesз docker-compose run. Це дозволить уникнути жорсткого кодування псевдоніма в runкоманді
grilix

38

На основі документації докера: https://docs.docker.com/compose/compose-file/#/command

Я просто поміщаю hostname: <string> у свій докер-композиційний файл.

Наприклад:

[...]

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

[...]

і контейнер lb01 вибирає at-lb01як ім'я хоста.


якщо у файлі docker-compose є кілька контейнерів, ви б встановили ім'я хоста для кожного контейнера? що здається дуже неефективним?
вгоклані

6
Якщо вам потрібні відомі назви контейнерів, це прийнятне рішення.
Marcello Romani

9

Найпростіший спосіб, який я знайшов - це просто встановити ім’я контейнера в документації docker-compose.ymlДив . Він застосований до docker-compose v1 +. Він працює від контейнера до контейнера, а не від приймаючої машини до контейнера.

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

Тепер ви повинні мати доступ affyдо інших контейнерів, використовуючи ім'я контейнера. Мені довелося це зробити для декількох серверів redis у середовищі розробки.

ПРИМІТКА Рішення працює до тих пір, поки вам не потрібно масштабувати. Такі, як консистенція окремих середовищ розробника.


В Compose 3.7єдиному шляху я отримав ім'я хоста служби бази даних видно з іншої служби контейнера одного і того ж пакету повинен був назвати службу в якості імені хоста. Помилка використання hostname:ресурсу. Не вдалося також використовувати середовище HOSTNAME = конструкція.
Стефан

Іншим рішенням, яке також працювало, було використання aliasesвластивості, як описано в fozрішенні.
Стефан

1
Це чудово, але трохи заплутано - я зараз взявся за налаштування container_nameі hostnameз такою ж цінністю, щоб досягти того, що мені потрібно
Олівер Данге,

3

Мені потрібно було обертати контейнер freeipa, щоб мати робочий kdc, і я повинен був дати йому ім'я хоста, інакше він не запустився. Що в кінцевому підсумку для мене спрацювало, це встановлення HOSTNAMEзмінної env у складі compose:

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

Зараз працює:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
Для мене, використовуючи slim, це призводить до змінної середовища HOSTNAME, яка взагалі не впливає на власне ім’я хоста контейнера
Олівер Данге,

2
Хоча це, можливо, працювало з контейнером, який ви використовували, директива оточення виставляє змінні лише контейнер. Все ще залежить від контейнера, щоб зробити щось із встановленим значенням. У багатьох випадках це, ймовірно, нічого не зробить.
MrJohnBBQ

викриття env var не має нічого спільного з іменем хоста контейнера, це дві окремі області.
Марчелло Романі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.