Oto dwie możliwe odpowiedzi: (1) skonfiguruj porty bezpośrednio za pomocą Dockera i użyj Nginx / Apache do proxy dla vhostów lub (2) użyj Dokku do zarządzania portami i vhostami za ciebie (tak nauczyłem się robić metodę 1).
Metoda 1a (bezpośrednie przypisanie portów za pomocą platformy Docker)
Krok 1: Skonfiguruj nginx.conf lub Apache na hoście, ustawiając żądane numery portów. Ten serwer WWW, działający na hoście, będzie wykonywał proxy vhost. W przypadku Dockera nie ma w tym nic specjalnego - to normalny hosting vhost. Następnie, w kroku 2, pojawi się specjalna część, aby Docker używał prawidłowego numeru portu hosta.
Krok 2: Wymuś przypisanie numerów portów w Dockerze za pomocą „-p”, aby ustawić mapowania portów Dockera, i „-e”, aby ustawić niestandardowe zmienne środowiskowe w Dockerze, w następujący sposób:
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
Metoda 1b Zakodowany na stałe port aplikacji
... jeśli Twoja aplikacja korzysta z portu zakodowanego na stałe, na przykład portu 5000 (tj. nie można go skonfigurować za pomocą zmiennej środowiskowej PORT, jak w metodzie 1a), można ją zakodować na stałe za pomocą Dockera w następujący sposób:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Metoda 2 (pozwól Dokku ustalić porty)
W tej chwili całkiem dobrą opcją do zarządzania vhostami Dockera jest Dokku . Nadchodzącą opcją może być użycie Flynna , ale w tej chwili Flynn dopiero się zaczyna i nie jest jeszcze gotowy. Dlatego na razie idziemy z Dokku: po wykonaniu instrukcji instalacji Dokku dla pojedynczej domeny włącz vhosty, tworząc plik „VHOST”:
echo yourdomain.com > /home/git/VHOST
Teraz, gdy aplikacja zostanie przesłana przez SSH do Dokku (zobacz dokumentację Dokku, aby dowiedzieć się, jak to zrobić), Dokku przejrzy plik VHOST i poda konkretną przekazaną aplikację (powiedzmy, że przekazałeś „container-1”), wygeneruje następujący plik:
/home/git/container-1/nginx.conf
Będzie miał następującą zawartość:
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;
}
}
Po ponownym uruchomieniu serwera Dokku zapewni, że Docker uruchomi aplikację z portem mapowanym na pierwotnie wdrożony port (tutaj 49162), zamiast losowo przypisać inny port. Aby osiągnąć to deterministyczne przypisanie, Dokku zapisuje początkowo przypisany port do /home/git/container-1/PORT
i przy następnym uruchomieniu ustawia PORT
środowisko na tę wartość, a także mapuje przypisania portów Dockera tak, aby były tym portem zarówno po stronie hosta, jak i po stronie aplikacji. Jest to przeciwieństwo pierwszego uruchomienia, kiedy dokku ustawiPORT=5000
a następnie wymyśli dowolne losowe mapy portu Dokku po stronie VPS do 5000 po stronie aplikacji. Jest okrężna (i może się nawet zmienić w przyszłości), ale działa!
Sposób działania VHOST pod maską jest następujący: po wykonaniu git push aplikacji przez SSH, Dokku wykona haczyki, które żyją /var/lib/dokku/plugins/nginx-vhosts
. Te haki są również znajduje się w kodzie źródłowym Dokku tutaj i są odpowiedzialne za pisanie nginx.conf
pliki z poprawnymi ustawieniami vhosta. Jeśli nie masz tego katalogu /var/lib/dokku
, spróbuj uruchomić dokku plugins-install
.