Как назначить доменные имена контейнерам в docker

Я много читаю в эти дни о том, как настроить и запустить стек docker. Но одна из вещей, которую я всегда упускаю, - это как настроить, чтобы определенные контейнеры отвечали на доступ через свое доменное имя, а не только имя контейнера с помощью Docker dns.

Я имею в виду, что, скажем, у меня есть микросервис, который доступен извне, например: users.mycompany.com, он пойдет до конца к контейнеру микросервиса который регулирует потребителей в API

затем, когда я пытаюсь получить доступ к customer-list.mycompany.com он будет идти до контейнера микрослужб, который обрабатывает списки клиентов

конечно, используя Docker dns, я могу получить к ним доступ и связать их в сеть docker, но это действительно работает только для доступа к контейнеру к контейнеру, но не к интернету к контейнеру.

кто-нибудь знает, как я должен это делать? Или лучший способ это устроить.

2 ответов


Итак, вам нужно использовать концепцию публикации портов, чтобы порт из вашего контейнера был доступен через порт с вашего хоста. Используя это, вы можете настроить простой 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

вы можете затем от вашего хоста curl ваше имя 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 запустить ссылку


насколько я знаю, Docker не предоставляет эту функцию из коробки. Но наверняка есть несколько обходных путей. На самом деле вам нужно развернуть DNS на вашем хосте, который будет различать контейнеры и разрешать их доменные имена в динамических IPs. Поэтому вы можете попробовать:

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

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

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

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