2015-06-20 17 views
14

Szukałem w użyciu Docker do projektu usługi REST. Mam jedno pytanie, czy możemy użyć Dockera do uruchomienia wielu wersji usługi na tym samym hoście/porcie.Czy wiele kontenerów Docker może działać przy użyciu tego samego hosta/portu?

Na przykład chcę mieć punkt końcowy na {myserver}: 8080/v1/i inny na {myserver}: 8080/v2 /.

Jeśli jest to w ogóle istotne, będą to obrazy Docker oparte na Java: 8, skonstruowane za pomocą słownika Java na platformie REST Spring Boot.

Czy jest to możliwe w przypadku kontenerów Docker?

+2

jest to problem XY. jest to możliwe bez kontenerów używających proxy (np. nginx). kontenery są tutaj nieistotne; możesz uruchomić usługi backendu w kontenerach ... lub nie. – dnozay

+0

To interesujące pytanie, ponieważ Docker mógł zintegrować funkcję małego proxy dla tras. Wyobraź sobie coś takiego: jeden kontener z Apache, drugi z Node.js pracujący zarówno na: 80 bez potrzeby proxy ... –

Odpowiedz

4

Jest to równie ważne pytanie na temat sposobu działania portów TCP w sposobie działania docker. W ten sam sposób, w jaki dwie aplikacje nie mogą połączyć się z tym samym portem TCP, nie można też dwóch kontenerów doków.

As @Sergei Rodionov wskazuje, że SO_REUSEPORT może być użyty, aby umożliwić wielu procesom współużytkowanie tego samego portu TCP (i można to określić podczas uruchamiania aplikacji java). Nie sądzę, żeby to działało w kontenerach.

+0

Co jeśli początkowe gniazdo jest związane z opcją SO_REUSEPORT? –

+0

Wydaje mi się, że SO_REUSEPORT ma być używany do procesów na tym samym komputerze. Czy uważasz, że działałoby to w kontenerach? –

+0

@RobertMoskal Dla Nginx może pomóc następujące rozwiązanie nginx-proxy z docker-gen: github.com/jwilder/nginx-proxy Zasadniczo dodajesz proxy w swoim środowisku dokowanym i pozwalasz obsłużyć żądania na porcie hosta i przekazujesz je do odpowiedni kontener –

7

Można uruchamiać oba kontenery przy użyciu różnych portów hosta i używać haproxy/nginx/varnish (natywnego lub w innym kontenerze) nasłuchując portu hosta i przekierowując do właściwego kontenera na podstawie adresu URL.

+1

Dla Nginx może pomóc następujące rozwiązanie nginx-proxy z docker-gen: https://github.com/jwilder/nginx-proxy Zasadniczo dodajesz proxy w swoim środowisku dokowanym i pozwalasz mu obsłużyć żądania na twoim hoście port i przesłać go do odpowiedniego kontenera –

5

Tak, jest to możliwe pod warunkiem, że używasz różnych adresów sieciowych dla każdego odsłuchiwanego portu duplikatów.

Na przykład, gospodarz ma następujące adresy IP przypisane do niego: 192.168.11.223 10.88.88.12

Można mieć dwa oddzielne pojemniki zarówno nasłuchuje na: 192.168.11.223:80 10.88.88.12: 80

Jeśli spojrzeć na składni dla biegu Döcker:

-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

tak, to jest możliwe tak długo, jak pojemniki są przy użyciu innego adresu IP. możesz sprawdzić adres IP kontenerów, używając poniższego polecenia.

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID> 
Powiązane problemy