Hier sind zwei mögliche Antworten: (1) Richten Sie Ports direkt mit Docker ein und verwenden Sie Nginx / Apache, um die vhosts zu vertreten, oder (2) verwenden Sie Dokku , um Ports und vhosts für Sie zu verwalten (so habe ich gelernt, Methode 1 auszuführen).
Methode 1a (Ports direkt mit Docker zuweisen)
Schritt 1: Richten Sie nginx.conf oder Apache auf dem Host mit den gewünschten Portnummernzuweisungen ein. Dieser Webserver, der auf dem Host ausgeführt wird, übernimmt das vhost-Proxy. In Bezug auf Docker ist daran nichts Besonderes - es ist normales vhost-Hosting. Als nächstes kommt in Schritt 2 der spezielle Teil, damit Docker die richtige Host-Portnummer verwendet.
Schritt 2: Erzwingen Sie die Zuweisung von Portnummern in Docker mit "-p", um die Portzuordnungen von Docker festzulegen, und "-e", um benutzerdefinierte Umgebungsvariablen in Docker wie folgt festzulegen:
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
Methode 1b Fest codierter Anwendungsport
... wenn Ihre Anwendung einen fest codierten Port verwendet, z. B. Port 5000 (dh kann nicht wie in Methode 1a über die PORT-Umgebungsvariable konfiguriert werden), kann er über Docker wie folgt fest codiert werden:
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.
Methode 2 (lassen Sie Dokku die Ports herausfinden)
Im Moment ist Dokku eine ziemlich gute Option für die Verwaltung von Docker- Vhosts . Eine bevorstehende Option könnte die Verwendung von Flynn sein , aber ab sofort fängt Flynn gerade erst an und ist noch nicht ganz fertig. Deshalb entscheiden wir uns jetzt für Dokku: Nachdem Sie die Dokku-Installationsanweisungen für eine einzelne Domain befolgt haben, aktivieren Sie vhosts, indem Sie die Datei "VHOST" erstellen:
echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST
Wenn eine App über SSH an Dokku gesendet wird (Informationen hierzu finden Sie in den Dokku-Dokumenten), überprüft Dokku die VHOST-Datei und generiert sie für die jeweilige App (sagen wir, Sie haben "container-1" gedrückt) die folgende Datei:
/home/git/container-1/nginx.conf
Und es wird folgenden Inhalt haben:
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;
}
}
Beim Neustart des Servers stellt Dokku sicher, dass Docker die Anwendung mit dem Port startet, der dem ursprünglich bereitgestellten Port zugeordnet ist (hier 49162), anstatt zufällig einen anderen Port zuzuweisen. Um diese deterministische Zuweisung zu erreichen, speichert Dokku den ursprünglich zugewiesenen Port in /home/git/container-1/PORT
und setzt beim nächsten Start die PORT
Umgebung auf diesen Wert und ordnet die Portzuweisungen von Docker sowohl auf der Host- als auch auf der App-Seite diesem Port zu. Dies steht im Gegensatz zum ersten Start, bei dem Dokku den PORT=5000
zufälligen Port Dokku auf der VPS-Seite auf 5000 auf der App-Seite festlegt und dann herausfindet. Es ist rund (und könnte sich in Zukunft sogar ändern), aber es funktioniert!
Die Art und Weise, wie VHOST unter der Haube funktioniert, ist: Wenn Dokku einen Git-Push der App über SSH ausführt, führt er Hooks aus, in denen er lebt /var/lib/dokku/plugins/nginx-vhosts
. Diese Haken sind auch in der Dokku Quellcode befindet sich hier und sind verantwortlich für das Schreiben der nginx.conf
Dateien mit den korrekten Einstellungen vhost. Wenn Sie dieses Verzeichnis nicht haben /var/lib/dokku
, versuchen Sie es auszuführen dokku plugins-install
.