Как назначить доменные имена для контейнеров в 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-адресах. Так что вы можете попробовать:

  1. Разверните некоторые из DNS-решений с поддержкой Docker (я предлагаю вам использовать SkyDNSv1/SkyDock);

  2. Настройте свой хост для работы с этим DNS (по умолчанию SkyDNS сообщает контейнерам друг друга по имени, но хост не знает об этом);

  3. Запустите ваши контейнеры с явным --hostname (вы, вероятно, будете использовать схему container_name.image_name.dev.skydns.local)

Вы можете пропустить шаг # 2 и запустить браузер внутри контейнера. Он обнаружит контейнер веб-приложения по имени хоста.