Ось два можливих відповіді: (1) порти установки безпосередньо з Докер і використовувати Nginx / Apache для проксі в ВХости, або (2) використання Докку для управління портами і ВХости для вас (який , як я навчився робити метод 1).
Спосіб 1а (безпосередньо призначити порти за допомогою докера)
Крок 1: Налаштуйте nginx.conf або Apache на хості з необхідними номерами портів. Цей веб-сервер, що працює на хості, буде виконувати проксі-сервер vhost. Щодо 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, як у способі 1а), тоді його можна кодувати через Docker наступним чином:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Спосіб 2 (нехай Докку з’ясує порти)
На даний момент, дуже хороший варіант для управління Docker ВХости є Докку . Найближчим варіантом може бути використання Flynn , але на даний момент Flynn тільки починає працювати і не зовсім готовий. Тому зараз ми йдемо з Dokku: дотримуючись інструкцій з встановлення Dokku, для одного домену увімкніть vhosts, створивши файл "VHOST":
echo yourdomain.com > /home/git/VHOST
Тепер, коли додаток передається через SSH до Dokku (див. Документи 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
оточення на це значення, а також відображає призначення портів 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
.