Представьте, что у меня есть такая настройка:
1.0.0.1
; Частное имя хоста: machine1.internal.domain
2.0.0.1
; Общедоступное имя хоста: machine1.example.com
1.0.0.2
; Частное имя хоста: machine2.internal.domain
2.0.0.2
; Общедоступное имя хоста: machine2.example.com
Эти 2 машины находятся в DMZ.
Machine1 необходимо подключиться к machine2, используя внутреннее имя хоста. Важно одно: мы не хотим, чтобы трафик между ними выходил за пределы DMZ.
И имя хоста machine2.internal.domain
жестко запрограммировано в приложении, работающем на машине № 1.
Без установки Dockerized:
machine2.internal.домен
, все уже хорошо. / etc / hosts
в machine1: machine2.internal.domain 1.0.0.2
При настройке Dockerized я знаю, что когда разрешение имен не работает, контейнер Docker не может связаться с машиной2, поскольку он не наследует записи в / etc / hosts
хост-машины.
Как я могу это сделать вещь работает лучше всего? ... для обоих случаев: разрешение DNS работает и не работает.
Я рассмотрел следующие варианты для случая 2:
docker run --add-host machine2.internal.domain: 1.0.0.2 ...
machine2.internal.domain
дважды: один раз в / etc / hosts
и один раз в Docker выполнить команду docker blabla --net = host
Если у вас есть внутренний DNS-сервер, вы можете запустить ваше докерное приложение с опцией --dns=[].
Установите ваш внутренний DNS-сервер в качестве переадресатора на реальный DNS, когда поиск имени не удается, так что любые внутренние имена будут использовать внутренний адрес.
Другая опция - записать пользовательский файл hosts в ваш образ докера, что нормально, если они исправлены, но не всегда идеально.
Третий способ - это рассмотреть использование чего-то вроде парашютов. Если ваши докер-хосты работают под управлением CoreOS или если у вас есть кластер etcd2, который тоже будет работать.
На сегодняшний день лучший вариант - это чтобы ваши хосты работали через какой-нибудь механизм обнаружения, где что-то есть, и не полагались на DNS. Однако, обычно требуется что-то вроде etcd2 или Consul
.