Вот два возможных ответа: (1) настроить порты напрямую с помощью Docker и использовать Nginx / Apache для прокси-сервера vhosts или (2) использовать Dokku для управления портами и vhosts для вас (именно так я научился использовать метод 1).
Метод 1а (прямое назначение портов с помощью докера)
Шаг 1. Настройте nginx.conf или Apache на хосте с желаемыми назначениями номеров портов. Этот веб-сервер, работающий на хосте, будет выполнять проксирование виртуального хоста. Что касается Docker, то здесь нет ничего особенного - это обычный хостинг vhost. Далее, на шаге 2, следует особая часть, чтобы заставить Docker использовать правильный номер порта хоста.
Шаг 2. Принудительно назначьте номера портов в Docker с помощью «-p», чтобы установить сопоставление портов Docker, и «-e», чтобы установить пользовательские переменные среды в Docker, как показано ниже:
port=12345
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
echo $id
echo $id > /app/files/CONTAINER
docker ps
docker logs $id
docker kill $id
Метод 1b Жестко запрограммированный порт приложения
... если ваше приложение использует жестко запрограммированный порт, например порт 5000 (т.е. не может быть настроен через переменную среды PORT, как в методе 1a), то его можно жестко запрограммировать через Docker следующим образом:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Метод 2 (пусть Докку выяснит порты)
На данный момент довольно неплохим вариантом для управления хостами Docker является Dokku . Возможным вариантом может стать использование Флинна , но на данный момент Флинн только начинает работать и еще не совсем готов. Поэтому пока мы переходим к Dokku: после выполнения инструкций по установке Dokku для одного домена включите vhosts, создав файл "VHOST":
echo yourdomain.com > /home/git/VHOST
Теперь, когда приложение отправляется через SSH в Dokku (см. Документацию Dokku, чтобы узнать, как это сделать), Dokku будет смотреть на файл VHOST и для конкретного отправленного приложения (скажем, вы нажали «контейнер-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
среды это значение, а также сопоставляет назначения портов Docker с этим портом как на стороне хоста, так и на стороне приложения. Это отличается от первого запуска, когда 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
.