2014-11-08 8 views
9

ich zur Zeit gebaut meine eigenen Webserver/Service versucht und wollte die Dinge einzurichten wie folgt aus:Nginx als Reverse Proxy für Docker VHosts

  • Wordpress für die wichtigsten „Blog“
  • Gitlab für meine git Repositories
  • ownCloud für meine Datenspeicher

ich habe für Docker wurde mit einem netten kleinen Gitlab Laufen bekommen, die völlig in Ordnung, Mapping-Port funktioniert: 81 auf meinem Webserver mit meiner Domain.

Was mich nervt ein bisschen ist, dass Docker Bilder immer auf eine bestimmte Port-Nummer gebunden sind und somit nicht wirklich leicht zu merken, so dass ich würde gerne so etwas wie dies zu tun:

git.mydomain.com for gitlab 
mydomain.com (no subdomain) for my blog 
owncloud.mydomain.com for owncloud 

Soweit Wie ich verstanden habe, brauche ich dafür einen Reverse Proxy, für den ich mich entschieden habe, nginx zu verwenden. Also habe ich die Dinge so:

http { 
include  mime.types; 
default_type application/octet-stream; 

sendfile  on; 

keepalive_timeout 65; 

server { 
    listen  80; 
    server_name mydomain.com; 
    location/{ 
      proxy_pass http://localhost:84; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
server { 
    listen 80; 
    server_name git.mydomain.com; 

    location/{ 
     proxy_pass http://localhost:81; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 

Auf diese Weise habe ich git.mydomain.com und läuft einwandfrei, aber meine Wordpress zeigt mir nur eine leere Webseite. Mein DNS ist wie folgt eingerichtet:

Host Type MX Destination 
*  A  IP 
@  A  IP 
www CNAME @ 

Bin ich einfach zu blöd oder was geht hier vor?

+0

Führen Sie jeden Dienst in einem eigenen Container aus? In welchem ​​Container kann nginx laufen? Denken Sie daran, dass der lokale Host innerhalb des Containers nicht der lokale Host außerhalb des Containers ist. Verknüpfen Sie die Container und verwenden Sie das env, um IPs zu suchen oder die öffentliche IP des Hosts zu verwenden. –

+0

Dies ist, wenn jwilder/nginx-Proxy Ihre Gesundheit speichert und Ihnen alles gibt, was Sie brauchen. Der Proxy-Container überwacht den Docker-Daemon und konfiguriert sich jedes Mal neu, wenn ein anderer Web-App-Container auf demselben Host gestartet wird. – Devvyn

+0

mögliches Duplikat von [Zuweisen von vhosts zu Docker-Ports] (http://stackoverflow.com/questions/18497564/assigning-vhosts-to-docker-ports) – Devvyn

Antwort

1

Ihre nginx-Konfiguration sieht normal aus, aber Sie treffen localhost:xx, was falsch ist. Es sollte entweder gatewayip:xx oder besser target_private_ip:80 sein.

Eine einfache Möglichkeit, um damit umzugehen ist Ihre Container mit --link zu starten und über einen Shell-Skript, das IP zu „injizieren“: hat die „original“ nginx Config mit einem Platzhalter anstelle der IP, dann sed -i mit dem Wert aus der Umwelt.

6

Ich weiß, dass Ihre Frage speziell zu Ihrer Nginx-Proxy-Konfiguration lautet, aber ich dachte, es wäre nützlich, Ihnen this link zu geben, die Details zum Einrichten eines Nginx-Docker-Containers beschreibt, der automatisch Konfigurationen für das Reverse-Proxying dieser Docker-Container bereitstellt. Mit anderen Worten, Sie führen den Reverseproxy und dann Ihre anderen Container aus, und der Nginx-Container leitet den Datenverkehr basierend auf dem Hostnamen an die anderen Container weiter.

Grundsätzlich ziehen Sie den Proxy-Container und führen ihn mit ein paar Parametern aus, die im Befehl docker run festgelegt sind, und Sie rufen dann die anderen Container auf, die Sie proxied wollen. Sobald Sie Docker installiert und zogen das nginx-Proxy-Bild haben, verwende ich die spezifischen Befehle den Proxy zu starten:

docker run -d --name="nginx-proxy" --restart="always" -p 80:80 \ -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

Und nun die Proxy ausgeführt wird. Sie können dies überprüfen, indem Sie einen Browser auf Ihre Adresse richten, der einen Nginx 502- oder 503-Fehler zurückgeben soll. Sie werden die Fehler erhalten, weil noch nichts zu hören ist. Um andere Behälter, dann ist es super einfach, wie folgt aus:

docker run -d --name="example.com" --restart="always" \ -e "VIRTUAL_HOST=example.com" w3b1x/mywebcontainer

Das -e "VIRTUAL_HOST=example.com" alles was man braucht Ihr Nginx Proxy-Routing-Verkehr auf den Behälter zu bekommen Sie beginnen.

Ich habe diese spezielle Methode seit ich mit Docker begonnen habe und es ist wirklich praktisch für genau diese Art von Situation. Der Artikel, den ich verlinkt habe, enthält Schritt-für-Schritt-Anleitungen und alle Informationen, die Sie benötigen. Wenn Sie weitere Informationen benötigen (speziell zum Implementieren von SSL in diesem Setup), können Sie the git repository für diese Software auschecken.

+1

Ich kann dafür bürgen. Ich benutze es seit ein paar Monaten in der Produktion und es bietet mir buchstäblich eine bessere Lebensqualität aufgrund der Einfachheit, die es im Gegensatz zur manuellen Neukonfiguration des Proxy für jede App-Bereitstellung bietet. – Devvyn