Перенаправление портов в Docker-контейнеры по имени хоста
Я хочу настроить обслуживание нескольких сайтов с одного сервера:
1. http://www.example.org => node.js-www (running on port (50000)
2. http://files.example.org => node.js-files (running on port 50001)
До сих пор я обнаружил, что докер делает перенаправление портов при использовании статических ips.
Реально ли использовать докер для перенаправления портов через имя хоста?
Я использую бесплатный Amazon Amazon EC2.
Спасибо бо
РЕДАКТИРОВАТЬ: я хочу иметь несколько узлов приложений, работающих на одном порту, но обслуживающих другое имя хоста.
3 ответа
Насколько я знаю, в Docker нет такой встроенной функциональности, как и должно быть. Чтобы выполнить то, что вы пытаетесь сделать, вам, вероятно, понадобится какой-то обратный прокси-сервер, поэтому подойдут node.js или nginx. Bouncy может быть хорошим вариантом: https://github.com/substack/bouncy
На GitHub есть отличный докерский проект, который jwilder называет nginx-proxy. Это позволяет вам создать контейнер докера, который выполняет обратный прокси-сервер, сопоставляя только свой порт 80/443 с хостом, а не с другими контейнерами. Затем все, что вам нужно сделать, - это создать для каждого нового веб-контейнера новую переменную среды. VIRTUAL_HOST=some.domain.com
,
Пример:
Создайте новый контейнер nginx-proxy
docker run -d -p 80:80 --net shared_hosting -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Создайте контейнер для каждого сайта. Например:
docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=hello1.domain.com tutum/hello-world docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=drupal.domain.com drupal
Вы должны убедиться, что ваши хосты настроены в DNS так, чтобы они указывали на сервер, на котором работает докер-контейнер. В этом примере я добавлю
/etc/hosts
файл:echo "127.0.0.1 hello1.domain.com drupal.domain.com" >> /etc/hosts
Перейдите на http://hello1.domain.com/ а затем на http://drupal.domain.com/ и увидите, что они оба используют порт 80, но предоставляют разные страницы.
Важное замечание об этом сервисе. Как вы заметили, я добавил --net
аргумент, это потому, что все контейнеры, которые вы хотите стать частью общего хостинга (прокси и веб-сайты) должны быть в одной виртуальной сети (это может быть определено аргументом --net
или же --network
к docker run
команда), особенно когда вы используете docker-compose
создавать докеры, потому что docker-compose
создает свою собственную виртуальную сеть, что делает один контейнер недоступным для другого, поэтому убедитесь, что сеть явно определена в docker-compose.yml
файл.
Надеюсь, поможет.
Я использовал лак в качестве док-контейнера, который работал как мой обратный прокси
это в индексе докера
Я знаю, что это старый вопрос, но натолкнулся на него и хотел указать, что есть гораздо более чистые способы сделать то, что было запрошено. Поскольку вы используете AWS, каждое из двух имен хостов может указывать на собственный балансировщик нагрузки (ELB) в Route53. Затем вы можете развернуть свой контейнер в ECS, например, прослушивая оба порта. Каждый из этих балансировщиков нагрузки может перенаправлять трафик на соответствующий порт прослушивания. Теперь вы выполнили то, что хотели, и если ваш трафик станет слишком тяжелым или несбалансированным, вы можете легко разделить задачи на два разных кластера ECS, чтобы они могли масштабироваться независимо.