Перенаправление портов в 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,

Пример:

  1. Создайте новый контейнер nginx-proxy

    docker run -d -p 80:80 --net shared_hosting -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
    
  2. Создайте контейнер для каждого сайта. Например:

    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
    
  3. Вы должны убедиться, что ваши хосты настроены в DNS так, чтобы они указывали на сервер, на котором работает докер-контейнер. В этом примере я добавлю /etc/hosts файл:

    echo "127.0.0.1 hello1.domain.com drupal.domain.com" >> /etc/hosts
    
  4. Перейдите на http://hello1.domain.com/ а затем на http://drupal.domain.com/ и увидите, что они оба используют порт 80, но предоставляют разные страницы.

Важное замечание об этом сервисе. Как вы заметили, я добавил --net аргумент, это потому, что все контейнеры, которые вы хотите стать частью общего хостинга (прокси и веб-сайты) должны быть в одной виртуальной сети (это может быть определено аргументом --net или же --network к docker run команда), особенно когда вы используете docker-compose создавать докеры, потому что docker-compose создает свою собственную виртуальную сеть, что делает один контейнер недоступным для другого, поэтому убедитесь, что сеть явно определена в docker-compose.yml файл.

Надеюсь, поможет.

Я использовал лак в качестве док-контейнера, который работал как мой обратный прокси

это в индексе докера

https://index.docker.io/u/sysdia/docker-varnish/

Я знаю, что это старый вопрос, но натолкнулся на него и хотел указать, что есть гораздо более чистые способы сделать то, что было запрошено. Поскольку вы используете AWS, каждое из двух имен хостов может указывать на собственный балансировщик нагрузки (ELB) в Route53. Затем вы можете развернуть свой контейнер в ECS, например, прослушивая оба порта. Каждый из этих балансировщиков нагрузки может перенаправлять трафик на соответствующий порт прослушивания. Теперь вы выполнили то, что хотели, и если ваш трафик станет слишком тяжелым или несбалансированным, вы можете легко разделить задачи на два разных кластера ECS, чтобы они могли масштабироваться независимо.

Другие вопросы по тегам