2015-06-20 15 views
14

Sie haben die Verwendung von Docker für ein REST-Service-Projekt untersucht. Eine Frage, die ich habe, ist, ob wir mit Docker mehrere Versionen des Dienstes auf demselben Host/Port ausführen können.Können mehrere Docker-Container mit demselben Host/Port ausgeführt werden?

Zum Beispiel möchte ich einen Endpunkt bei {myserver}: 8080/v1/und einen anderen bei {myserver}: 8080/v2/haben.

Wenn es überhaupt relevant ist, wären dies Java: 8 basierte Docker-Images, die mit einem Java-Jar auf dem Spring Boot-REST-Framework erstellt wurden.

Ist dies mit Docker-Containern möglich?

+2

Dies ist ein XY-Problem. Dies ist möglich ohne Container, die einen Proxy verwenden (z. B. nginx). Container sind hier irrelevant; Sie können die Backend-Dienste in Containern ausführen ... oder nicht. – dnozay

+0

Es ist eine interessante Frage schwierig, weil Docker ein kleines Proxy-Feature für Routen integriert haben könnte. Stellen Sie sich etwas vor: ein Container mit Apache, der andere mit Node.js, der beide arbeitet: 80 ohne Notwendigkeit eines Proxy ... –

Antwort

4

Dies ist ebenso eine Frage über die Art und Weise, wie tcp-Ports funktionieren, so wie Docker funktioniert. So wie zwei Anwendungen nicht an denselben TCP-Port gebunden werden können, können auch zwei Andock-Container nicht verwendet werden.

Wie @Sergei Rodionov darauf hinweist, kann SO_REUSEPORT verwendet werden, damit mehrere Prozesse denselben TCP-Port gemeinsam nutzen können (und dies kann beim Start Ihrer Java-Anwendung angegeben werden). Ich denke nicht, dass dies über Container hinweg funktioniert.

+0

Was ist, wenn der anfängliche Socket mit der Option SO_REUSEPORT gebunden ist? –

+0

Es scheint mir, dass SO_REUSEPORT für Prozesse auf der gleichen Maschine verwendet werden soll. Glauben Sie, dass es über Container hinweg funktioniert? –

+0

@RobertMoskal Für Nginx könnte die folgende nginx-proxy-Lösung mit docker-gen helfen: github.com/jwilder/nginx-proxy Sie fügen grundsätzlich einen Proxy in Ihre Docker-Umgebung ein und lassen ihn die Anfragen auf Ihrem Host-Port behandeln und weiterleiten der passende Container –

7

Sie können beide Container mit verschiedenen Host-Ports ausführen und einen haproxy/nginx/varnisn (nativ oder in einem anderen Container) verwenden, der den Host-Port abhört und basierend auf der URL zum richtigen Container umleitet.

+1

Für Nginx könnte die folgende nginx-proxy-Lösung mit docker-gen helfen: https://github.com/jwilder/nginx-proxy Sie fügen grundsätzlich einen Proxy in Ihre Docker-Umgebung ein und lassen ihn die Anfragen auf Ihrem Host behandeln portieren und an den entsprechenden Container weiterleiten –

5

Ja, dies ist möglich, solange Sie für jeden doppelten Port, den Sie hören, unterschiedliche Netzwerkadressen verwenden.

Zum Beispiel, Ihr Gastgeber hat folgende IPs zugewiesen: 192.168.11.223 10.88.88.12

Sie könnten zwei getrennte Behälter haben beide hören auf: 192.168.11.223:80 10.88.88.12: 80

Wenn man sich die Syntax für docker Lauf aussehen:

-p=[]  : Publish a container᾿s port or a range of ports to the host 
      format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort 
      Both hostPort and containerPort can be specified as a range of ports. 
      When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`) 
      (use 'docker port' to see the actual mapping) 
1

ja, es möglich ist, solange Behälter unterschiedliche IP-Adresse verwenden. Sie können die IP-Adresse der Container mit dem Befehl unten überprüfen.

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID> 
Verwandte Themen