Как мне установить имя хоста в 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
larsks
источник
1
Какую версию Compose вы используете?
kojiro
Этот формат не работает в последней версии docker-compose. Файлы YML - штука привередливая; вы уверены, что это правильный формат для DNS?
Джордж Стокер
3
Файлы YML на самом деле не такие уж и привередливые. Что значит "не работает"? Согласно документам , оба hostnameи domainnameявляются допустимыми docker-compose.ymlвариантами. Обновление: только что протестировано, все еще работает нормально (docker-compose версии 1.4.2, docker версии 1.8.2).
larsks
Есть ли способ раскрыть это имя хоста за пределами среды докера? Было бы неплохо, если бы хост мог получить доступ к контейнерам докеров по их имени DNS.
Paul Praet
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чтобы сделать определенные псевдонимы доступными.

foz
источник
11
Я застрял с той проблемой, что я не могу получить доступ к контейнеру по имени хоста из других контейнеров. И вы единственный во всем Интернете, кто заявил об этой проблеме .. гуглил уже 20 часов
holms
7
Тоже самое! Безумие, что миллионы разработчиков, кажется, используют Docker, но никто не знает, как дать ящику простое имя, даже официальная документация. Большое вам спасибо :)
Sliq 06
1
На всякий случай теперь можно использовать --use-aliasesс docker-compose run. Это позволит избежать run
жесткого кодирования
38

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

Я просто вставляю hostname: <string> свой файл docker-compose.

Например:

[...]

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

[...]

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

Марчелло Романи
источник
если у вас есть несколько контейнеров в файле docker-compose, задаете ли вы имя хоста для каждого контейнера? это кажется очень неэффективным?
vgoklani
6
Если вам нужны хорошо известные имена для контейнеров, это жизнеспособное решение.
Марчелло Романи
9

Самый простой способ, который я нашел, - это просто указать имя контейнера в документации docker-compose.ymlсм. Container_name . Это применимо к 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 не имеет ничего общего с именем хоста контейнера, это две отдельные области.
Marcello Romani,