Назначение vhosts на порты Docker

У меня есть подстановочный DNS, настроенный так, чтобы все веб-запросы к пользовательскому домену (* .foo) соответствовали IP-адресу хоста Docker. Если у меня есть несколько контейнеров, на которых запущены экземпляры Apache (или Nginx), каждый контейнер сопоставляет порт Apache (80) с каким-либо внешним входящим портом.

Я хотел бы сделать запрос на container-1.foo, который уже сопоставлен с правильным IP-адресом (хоста Docker) через мой настраиваемый DNS-сервер, но прокси-запрос на порт 80 по умолчанию для правильный внешний порт Docker таким образом, чтобы правильный экземпляр Apache из указанного контейнера мог отвечать на основе пользовательского домена. Аналогично, container-2.foo будет прокси-сервер для Apache второго контейнера и т. Д.

Есть ли заранее разработанное решение для этого, лучше всего мне запустить прокси-сервер Nginx на хосте Docker или я должен написать прокси-узел node.js с возможностью управления контейнерами Docker (start /stop /reuild) через интернет) или ...? Какие у меня есть варианты, которые сделали бы использование контейнеров Docker более естественным событием, а не чем-то с посторонними портами и жонглированием контейнеров?

81 голос | спросил ringmaster 29 AM000000120000001731 2013, 00:27:17

3 ответа


0

Этот ответ может быть немного запоздалым, но взгляните на Изображение Docker Джейси Уайлдера с прокси-сервером nginx . Когда вы запускаете Docker-контейнер этого образа, вы получаете сервер nginx, настроенный в качестве обратного прокси-сервера для других ваших контейнеров без настройки для обслуживания.

Просто запустите другие контейнеры с переменной среды VIRTUAL_HOST, и nginx-proxy обнаружит их порт ip: и обновит конфигурацию nginx для вы.

Допустим, ваш DNS настроен так, что *.test.local сопоставляется с IP-адресом вашего хоста Docker, а затем просто запустите следующие контейнеры чтобы быстро запустить демо-версию:

 # start the reverse proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

# start a first container for http://tutum.test.local
docker run -d -e "VIRTUAL_HOST=tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -e "VIRTUAL_HOST=deis.test.local" deis/helloworld
ответил Thomasleveil 1 J0000006Europe/Moscow 2014, 05:15:20
0

Вот два возможных ответа: (1) настроить порты напрямую с помощью Docker и использовать Nginx /Apache для прокси-сервера vhosts, или (2) использовать Dokku для управления портами и vhosts для вас (именно так я научился делать метод 1).

Метод 1a (прямое назначение портов с помощью докера)

Шаг 1. Настройте на хосте nginx.conf или Apache с необходимыми номерами портов. Этот веб-сервер, работающий на хосте, будет выполнять проксирование vhost. В этом нет ничего особенного в отношении Docker - это обычный хостинг. Затем на шаге 2 появится специальная часть, чтобы заставить Docker использовать правильный номер порта хоста.

Шаг 2. Принудительное назначение номеров портов в Docker с помощью «-p» для установки сопоставления портов в Docker и «-e» для установки пользовательских переменных среды в Docker следующим образом:

 port=12345 # <-- the vhost port setting used in nginx/apache
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
# -p :$port will establish a mapping of 12345->12345 from outside docker to
# inside of docker.
# Then, the application must observe the PORT environment variable
# to launch itself on that port; This is set by -e PORT=$port.

# Additional goodies:
echo $id # <-- the running id of your container
echo $id > /app/files/CONTAINER # <-- remember Docker id for this instance
docker ps # <-- check that the app is running
docker logs $id # <-- look at the output of the running instance
docker kill $id # <-- to kill the app

Метод 1b Жестко закодированный порт приложения

... если ваше приложение использует жестко заданный порт, например, порт 5000 (т.е. его нельзя настроить с помощью переменной среды PORT, как в методе 1a), то он может быть жестко закодирован через Docker следующим образом:

 publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
# -p $publicPort:5000 will map port 12345 outside of Docker to port 5000 inside
# of Docker. Therefore, nginx/apache must be configured to vhost proxy to 12345,
# and the application within Docker must be listening on 5000.

Способ 2 (пусть Докку определит порты)

В настоящее время довольно хорошим вариантом для управления виртуальными приложениями Docker является Dokku . Предстоящий вариант может заключаться в использовании Flynn , но на данный момент Flynn только начинает работу и не совсем готова. Поэтому мы пока остановимся на Dokku: после выполнения инструкций по установке Dokku для отдельного домена включите vhosts, создав файл "VHOST":

 echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST

Теперь, когда приложение отправляется через Dokku через SSH (подробности о том, как это сделать, см. в документации Dokku), Dokku проверяет файл VHOST и конкретное приложение (например, вы выдвинули «container-1»), он сгенерирует следующий файл:

/home/git/container-1/nginx.conf

И он будет иметь следующее содержимое:

upstream container-1 { server 127.0.0.1:49162; }
server {
  listen      80;
  server_name container-1.yourdomain.com;
  location    / {
    proxy_pass  http://container-1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Когда сервер перезагружается, Dokku гарантирует, что Docker запустит приложение с портом, сопоставленным с первоначально развернутым портом (здесь 49162), вместо случайного назначения другого порта. Для достижения этого детерминированного назначения Dokku сохраняет первоначально назначенный порт в /home/git/container-1/PORT и при следующем запуске устанавливает PORT к этому значению, а также сопоставляет назначения портов докера с этим портом как на стороне хоста, так и на стороне приложения. Это противоположно первому запуску, когда Dokku установит PORT=5000, а затем выяснит, какой случайный порт Dokku отображает на стороне VPS до 5000 на сторона приложения. Это примерно (и может даже измениться в будущем), но это работает!

Как работает VHOST, после выполнения git push приложения через SSH Dokku будет выполнять хуки, которые живут в /var/lib/dokku/plugins/nginx-vhosts. Эти хуки также находятся в исходном коде Dokku здесь и являются отвечает за запись файлов nginx.conf с правильными настройками vhost. Если у вас нет этого каталога в /var/lib/dokku, попробуйте запустить dokku plugins-install.

ответил David Baird 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 04 Sep 2013 23:41:54 +0400 2013, 23:41:54
0

С помощью docker вы хотите, чтобы внутренние ips оставались нормальными (например, 80), и выясните, как подключить случайные порты.

Один из способов справиться с ними - обратный прокси-сервер, такой как hipache. Направьте свой DNS на него, и затем вы сможете перенастроить прокси, когда ваши контейнеры будут подниматься и опускаться. Взгляните на http://txt.fliglio.com/2013/09 /protyping-web-stuff-with-docker / чтобы узнать, как это может работать.

Если вы ищете что-то более надежное, вы можете взглянуть на «обнаружение службы». (посмотрите на обнаружение службы с помощью докера: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/)

ответил ben schwartz 15 SunEurope/Moscow2013-12-15T03:20:03+04:00Europe/Moscow12bEurope/MoscowSun, 15 Dec 2013 03:20:03 +0400 2013, 03:20:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132