Подтвердить что ты не робот

Как вы можете сделать контейнер докеров использовать файл хоста/etc/hosts?

Я хочу сделать так, чтобы контейнер docker, который я использовал, использовал те же настройки /etc/hosts, что и на хост-машине, с которой я работал. Есть ли способ сделать это?

Я знаю, что есть опция --add-host с запуском docker, но это не совсем то, что я хочу, потому что файл хоста /etc/hosts может быть разными на разных машинах, поэтому мне не очень удобно записывать точные IP-адреса с помощью --add-host.

4b9b3361

Ответ 1

Используйте --network=host в команде docker run. Это говорит Docker, чтобы контейнер использовал стек сети хоста. Вы можете узнать больше здесь.

Ответ 2

Добавить стандартный файл хоста -

docker run -it ubuntu cat /etc/hosts

Добавить сопоставление для сервера 'foo' -

docker run -it --add-host foo:10.0.0.3 ubuntu cat /etc/hosts

Добавить сопоставления для нескольких серверов

docker run -it --add-host foo:10.0.0.3 --add-host bar:10.7.3.21 ubuntu cat /etc/hosts

Ссылка - http://jasani.org/2014/11/19/docker-now-supports-adding-host-mappings/

Ответ 3

Добавьте это к вашей команде запуска:

-v /etc/hosts:/etc/hosts

Ответ 4

Если доверенные пользователи запускают ваши контейнеры, вы можете использовать функцию оболочки для простого "копирования" нужных вам записей /etc/hosts:

add_host_opt() { awk "/\\<${1}\\>/ {print \"--add-host $1:\" \$1}" /etc/hosts; }

Затем вы можете сделать:

docker run $(add_host_opt host.name) ubuntu cat /etc/hosts

Таким образом, вам не нужно жестко кодировать IP-адреса.

Ответ 5

Если вы используете docker-compose.yml, соответствующее свойство:

services:
  xxx:
    network_mode: "host"

Источник

Ответ 6

Хост-машина /etc/hosts не может быть смонтирована в контейнер. Но вы можете смонтировать папку в контейнер. И вам нужен контейнер dnsmasq.

  1. Новая папка на хост-машине

    mkdir -p ~/new_hosts/
    
    ln  /etc/hosts ~/new_hosts/hosts
    
  2. смонтировать ~/new_hosts/в контейнер

    docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
    
  3. Config dnsmasq использует /new_hosts/hosts для разрешения имени.

  4. Измените свой DNS-сервер контейнера, используйте IP-адрес контейнера dnsmasq.

Если вы измените /etc/hosts на хост-машине, изменится контейнер dnsmasq /new_hosts/hosts.

Я нашел проблему:

Файл в контейнере dnsmasq /new_hosts/hosts может измениться. Но новые хосты не могут быть разрешены. Потому что dnsmasq использует inotify прослушивания изменения inotify Когда вы изменяете файл на хост-компьютере. dnsmasq не может получить сигнал, поэтому он не обновляется. конфигурации. Поэтому вам может понадобиться написать процесс-демон, чтобы прочитать /new_hosts/hosts в другой файл eveytime. И изменить конфигурацию dnsmasq чтобы использовать новый файл.

Ответ 7

Если вы используете виртуальную машину для запуска контейнеров докеров, если есть хосты (виртуальные машины и т.д.), о которых вы должны знать ваши контейнеры, в зависимости от того, какое программное обеспечение VM вы используете, вам нужно будет убедиться, что есть записи на хост-машине (размещение виртуальной машины) для любых машин, которые вы хотите, чтобы контейнеры могли разрешить. Это связано с тем, что виртуальные машины и контейнеры будут иметь IP-адрес хост-машины (виртуальных машин) в файле resolv.conf

Ответ 8

IMO, передавая опцию --network=host во время работы докеры, является лучшим вариантом, предложенным d3ming по другим параметрам, как предложено другими ответами:

  • Любые изменения в хосте /etc/hosts немедленно доступны для контейнер, который, вероятно, вы хотите, если у вас есть такой требование на первом месте.
  • Вероятно, не рекомендуется использовать параметр -v для монтирования хоста /etc/hosts, поскольку любое непреднамеренное изменение контейнером испортит конфигурацию хостов.