Как назначить доменные имена для контейнеров в Docker?
В последнее время я читаю много о том, как настроить и запустить стек докеров. Но одна из вещей, которые я всегда упускаю, заключается в том, как настроить, чтобы определенные контейнеры отвечали на доступ через их доменное имя, а не только их имя контейнера, используя docker dns.
Я имею в виду, что у меня есть микросервис, доступный извне, например: users.mycompany.com, он перейдет в контейнер микросервиса, который обрабатывает пользователей api
Затем, когда я пытаюсь получить доступ к client-list.mycompany.com, он перейдет в контейнер микросервиса, который обрабатывает списки клиентов
Конечно, используя docker dns, я могу получить к ним доступ и связать их с сетью докеров, но это действительно работает только для того, чтобы получить доступ к контейнеру в контейнер, но не к контейнеру в Интернете.
Кто-нибудь знает, как я должен это делать? Или лучший способ установить это.
Ответы
Ответ 1
Итак, вам нужно использовать концепцию публикации портов, чтобы порт из вашего контейнера был доступен через порт с вашего хоста. Используя это, вы можете настроить простой proxy_pass из Nginx, который будет перенаправлять users.mycompany.com
на myhost:1337
(при условии, что вы опубликовали свой порт на 1337
)
Итак, если вы хотите сделать это, вам нужно настроить свой контейнер для предоставления определенного порта, используя:
docker run -d -p 5000:5000 training/webapp # publish image port 5000 to host port 5000
Затем вы можете с вашего хоста свернуть ваш localhost:5000
чтобы получить доступ к контейнеру.
curl -X GET localhost:5000
Если вы хотите настроить доменное имя впереди, вам понадобится экземпляр веб-сервера, который позволит вам proxy_pass имя вашего хоста в ваш контейнер.
то есть в Nginx:
server {
listen 80;
server_name users.mycompany.com;
location / {
proxy_pass http://localhost:5000;
}
}
Я бы посоветовал вам следовать этому руководству и, возможно, проверить справку по запуску Docker.
Ответ 2
Насколько я знаю, Docker не предоставляет эту функцию из коробки. Но, безусловно, здесь есть несколько обходных путей. Фактически вам нужно развернуть DNS на вашем хосте, который будет различать контейнеры и разрешать их доменные имена в динамических IP-адресах. Так что вы можете попробовать:
-
Разверните некоторые из DNS-решений с поддержкой Docker (я предлагаю вам использовать SkyDNSv1/SkyDock);
-
Настройте свой хост для работы с этим DNS (по умолчанию SkyDNS сообщает контейнерам друг друга по имени, но хост не знает об этом);
-
Запустите ваши контейнеры с явным --hostname
(вы, вероятно, будете использовать схему container_name.image_name.dev.skydns.local
)
Вы можете пропустить шаг # 2 и запустить браузер внутри контейнера. Он обнаружит контейнер веб-приложения по имени хоста.