Ответ 1
Используйте --network=host
в команде docker run. Это говорит Docker, чтобы контейнер использовал стек сети хоста. Вы можете узнать больше здесь.
Я хочу сделать так, чтобы контейнер docker, который я использовал, использовал те же настройки /etc/hosts
, что и на хост-машине, с которой я работал. Есть ли способ сделать это?
Я знаю, что есть опция --add-host
с запуском docker, но это не совсем то, что я хочу, потому что файл хоста /etc/hosts
может быть разными на разных машинах, поэтому мне не очень удобно записывать точные IP-адреса с помощью --add-host
.
Используйте --network=host
в команде docker run. Это говорит Docker, чтобы контейнер использовал стек сети хоста. Вы можете узнать больше здесь.
Добавить стандартный файл хоста -
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/
Добавьте это к вашей команде запуска:
-v /etc/hosts:/etc/hosts
Если доверенные пользователи запускают ваши контейнеры, вы можете использовать функцию оболочки для простого "копирования" нужных вам записей /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-адреса.
Если вы используете docker-compose.yml
, соответствующее свойство:
services:
xxx:
network_mode: "host"
Хост-машина /etc/hosts
не может быть смонтирована в контейнер. Но вы можете смонтировать папку в контейнер. И вам нужен контейнер dnsmasq.
Новая папка на хост-машине
mkdir -p ~/new_hosts/
ln /etc/hosts ~/new_hosts/hosts
смонтировать ~/new_hosts/в контейнер
docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
Config dnsmasq использует /new_hosts/hosts
для разрешения имени.
Измените свой DNS-сервер контейнера, используйте IP-адрес контейнера dnsmasq.
Если вы измените /etc/hosts
на хост-машине, изменится контейнер dnsmasq /new_hosts/hosts
.
Я нашел проблему:
Файл в контейнере dnsmasq
/new_hosts/hosts
может измениться. Но новые хосты не могут быть разрешены. Потому чтоdnsmasq
используетinotify
прослушивания измененияinotify
Когда вы изменяете файл на хост-компьютере.dnsmasq
не может получить сигнал, поэтому он не обновляется. конфигурации. Поэтому вам может понадобиться написать процесс-демон, чтобы прочитать/new_hosts/hosts
в другой файл eveytime. И изменить конфигурациюdnsmasq
чтобы использовать новый файл.
Если вы используете виртуальную машину для запуска контейнеров докеров, если есть хосты (виртуальные машины и т.д.), о которых вы должны знать ваши контейнеры, в зависимости от того, какое программное обеспечение VM вы используете, вам нужно будет убедиться, что есть записи на хост-машине (размещение виртуальной машины) для любых машин, которые вы хотите, чтобы контейнеры могли разрешить. Это связано с тем, что виртуальные машины и контейнеры будут иметь IP-адрес хост-машины (виртуальных машин) в файле resolv.conf
IMO, передавая опцию --network=host
во время работы докеры, является лучшим вариантом, предложенным d3ming
по другим параметрам, как предложено другими ответами: