2016-07-07 22 views
1

Mit der neuen aufregenden Docker Swarm in 1.12 scheint es durchaus möglich, mehrere Anwendungen in einem Cluster von Servern bereitzustellen.Kann ich zwei separate Anwendungen auf Port 80 und verschiedene Hostnamen in Docker Swarm ausführen?

Ich bin auf der Suche nach einer Möglichkeit, zwei separate Anwendungen oder Anwendungseinstiegspunkte auf demselben Port und demselben Cluster bereitzustellen. Beachten Sie Folgendes:

web.myservice.com:80 -> Swarm ->  Service[web] -> web.1 
                 -> web.2 
                 -> web.3 

backend.myservice.com:80 -> Swarm -> Service[backend] -> backend.1 
                 -> backend.2 
                 -> backend.3 

Wo der Schwarm in diesem Fall nur in einem Cluster von mehreren Hosts, Freilegung Port 80. Ich nehme an, Sie verschiedene Ports und Balancern eingerichtet haben Last aussetzen könnte auf diese anderen Hafen proxy_pass, aber Ich würde sagen, es wäre großartig, eine Möglichkeit zu haben, nur Hostname: Port im Cluster offenzulegen. Wenn also eine Anfrage über einen Hostnamen und einen Port eingeht, wird sie weitergeleitet. Wenn Sie mehrere Hosts oder einen Port benötigen, können Sie mehrere bereitstellen.

Dies könnte verfügbar sein, und deshalb stelle ich diese Frage. Vielleicht kann es mit einer erweiterten Konfiguration eines HAProxy oder Nginx repliziert werden. Ich habe ziemlich viel experimentiert und fand es ziemlich schwer, dies erweiterbar zu machen. Bitte beraten Sie zu dem Thema, wenn Sie irgendwelche Kommentare oder Vorschläge haben!

- Marcus

Antwort

1

Wenn Sie einen Port veröffentlichen, bindet es an die Netzwerk-Schnittstelle des Knotens. Sie können dies möglicherweise mithilfe von Platzierungseinschränkungen durchführen, um sicherzustellen, dass sich Aufgaben von beiden Diensten nie auf demselben Knoten befinden. Ich denke jedoch, dass es am besten ist, einen Nginx-Dienst für den Proxyverkehr bereitzustellen.

Swarm DNS-Einträge für Ihre Dienste macht, damit Sie sie leicht mit Namen, ein einfaches nginx Beispiel erreichen wäre:

http { 
... 
    server { 
    server_name web.myservice.com; 

    location/{ 
     proxy_pass http://web:8080; 
     proxy_redirect default; 
    } 
    } 

    server { 
    server_name backend.myservice.com; 

    location/{ 
     proxy_pass http://backend:8080; 
     proxy_redirect default; 
    } 
    } 
}