2016-07-23 24 views
9

Załóżmy, że masz dwie usługi na topologiitryb rój doker wielu usług tego samego portu

  1. API
  2. Interfejs Web

Zarówno przypuszczać, aby być uruchomiony na porcie 80.

On dokowanie roota podczas tworzenia usługi, jeśli chcesz uzyskać dostęp do niej poza klastrem, musisz odsłonić i zmapować port z usługi do węzłów (portów zewnętrznych). Ale jeśli zamapujesz port 80, aby powiedzieć, że jest to usługa API, nie możesz mapować tego samego portu dla usługi interfejsu sieciowego, ponieważ będzie on już mapowany.

Jak można to rozwiązać?

O ile widzę, ten przypadek użycia nie jest obsługiwany. Nawet jeśli chcesz mieć duży klaster roju i tam wszystkie twoje usługi i aplikacje nie będą możliwe, ponieważ to zachowanie.

Coś brakuje?

Każdy wzór, aby rozwiązać ten problem?

+0

Zmieszany z pytaniem. Nie ma nic doker specyficzne o nie można mapować 2 rzeczy do tego samego portu. Będą działać na porcie 80 w twoim kontenerze, ale mapujesz je na różne porty zewnętrzne. – johnharris85

+0

@JHarris tak, edytuję główne pytanie, aby określić porty zewnętrzne. Ale to jest problem, po zamapowaniu interfejsu API na port 80 na port zewnętrzny 80, nie można go ponownie zmapować dla interfejsu sieciowego usługi – bitgandtter

+0

Prawidłowo, jak rozwiązać ten problem bez dokowania? – johnharris85

Odpowiedz

3

używać różnych portów, jeśli muszą być publicznie wystawiony:

docker service create -p 80:80 --name web nginx

a następnie

docker service create -p 8080:80 --name api myapi

w drugim przykładzie, port publiczny 8080 map do portu kontenerowego 80. Of Oczywiście, jeśli nie muszą być publiczne port narażone, możesz zobaczyć usługi między kontenerami w tej samej sieci przy użyciu nazwy kontenera i portu kontenera.

curl http://api:80

znajdzie kontenera nazwie api i podłączyć do portu 80 przy użyciu odkrycie DNS dla kontenerów w tej samej sieci.

+0

hej @ BMitch, ale przypadek użycia nie został zrealizowany, ponieważ interfejs API jest narażony na działanie Internetu na porcie 8080, gdy zakłada się, że znajduje się na porcie 80. Jest to przypadek użycia, który próbuję ukończyć.Tak czy inaczej, jeśli chcesz mieć tylko jeden duży klaster roju i wiele różnych usług, a kilka z tych usług musi być udostępnionych na porcie 80 do Internetu – bitgandtter

+0

Podam opis rozwiązania, które zapewnia Docker. Ich obecna implementacja nie zapewnia żadnych innych opcji, które pozwoliłyby publicznie ujawnić ten sam port za pomocą mechanizmu wykrywania usług dla dwóch różnych usług. Obejście problemu polega na użyciu innego narzędzia, które udostępnia usługi przez IP zamiast portu lub serwera proxy, który interpretuje żądania i wysyła je do interfejsu API lub serwera WWW na podstawie zawartości. – BMitch

+0

@bitgandtter Nie ma sensu eksportowanie dwóch usług za pośrednictwem tego samego portu. Jedynym sposobem, w jaki system równoważenia obciążenia mógłby wysłać ruch do właściwej usługi, jest sprawdzenie nagłówka http. Wykonalne, ale z pewnością nieefektywne i bardziej złożone. W twoim przypadku użycia często używa się portu 80/443 dla części internetowej i czegoś innego (zakres> = 30000) dla interfejsu API. – Alkaline

3

Jeśli chcesz udostępnić interfejs API i interfejs sieciowy publicznie, masz dwie opcje. Albo użyć innego portu dla usług

http://my-site.com  # Web interface 
http://my-site.com:8080 # API 

lub korzystać z serwera proxy, który nasłuchuje port 80 i przekazuje wnioski do prawidłowej obsługi zgodnie ścieżce:

http://my-site.com  # Web interface 
http://my-site.com/api # API 
4

Możesz zajrzeć na Docker Flow:Proxy do wykorzystania jako Easy- skonfigurować odwrotne proxy.

ALE, uważam, jak zauważyli inni komentatorzy, tryb roota w Dockerze 1.12 ma fundamentalny problem z wieloma usługami odsłaniającymi ten sam port (np. 80 lub 8080). Sprowadza się (myślę) do magii przekierowywania sieci - co jest czwartą rzeczą na poziomie 4, co oznacza w zasadzie TCP/IP - innymi słowy, adres IP + port. Rzeczy stają się nieporządne, gdy wiele usług znajduje się na (na przykład) porcie 8080. Router sieciowy z przyjemnością dostarczy ruch przechodzący do portu 8080 wszystkim usługom, które eksponują ten sam port.

MOŻESZ izolować się od siebie nawzajem za pomocą nakładki sieciowej w trybie roju, ALE problem pojawia się, gdy musisz połączyć usługi z proxy (sieć nakładkowa) - w tym momencie wygląda na to, że coś się pomyli (i to gdzie mam teraz trudności).

Rozwiązaniem, które mam w tym momencie, jest umożliwienie usługom, które muszą być narażone na użycie portów sieciowych, unikalnych w odniesieniu do sieci zorientowanej na proxy (nakładka) (NIE muszą one być publikowane w rój!), a następnie używają czegoś podobnego do Docker Flow Proxy do obsługi ruchu przychodzącego na żądanym porcie.

Szybkie próbka Ci zacząłem (w przybliżeniu na podstawie this:

docker network create --driver overlay proxy 
    docker network create --driver overlay my-app 
    # App1 exposed port 8081 
    docker service create --network proxy --network my-app --name app1 myApp1DockerImage 
    docker service create --name proxy \ 
    -p 80:80 \ 
    -p 443:443 \ 
    -p 8080:8080 \ 
    --network proxy \ 
    -e MODE=swarm \ 
    vfarcic/docker-flow-proxy 
    #App2 exposes port 8080 
    docker service create --network proxy --network my-app --name app2 myApp2DockerImage 

wtedy skonfigurować reverseProxy jak na to documentation

. UWAGA: Teraz widzę, że jest nowy dostępny AUTO konfiguracja - Jeszcze nie próbowałem tego.

Wynik końcowy, jeśli wszystko zadziałało:

  • proxy nasłuchuje na portach 80, 443 (oraz 8080 dla jego połączenia konfiguracyjne, więc miej to od sieci publicznej!)
  • proxy przodu do odpowiedniej usługi, oparte zarówno na service domain lub service path (miałem problemy z service path)
  • usługi mogą być przekazywane wewnętrznie przez izolowaną sieć nakładkową.
  • usługi nie publikuje porty niepotrzebnie roju

[EDIT 20.10.2016]

Ignoruj ​​wszystkie rzeczy powyżej o problemach z tym samym narażone portu w tej samej sieci nakładki załączonym do pełnomocnika.

Podniosłem konfigurację otworów i zacząłem od nowa - wszystko działa zgodnie z oczekiwaniami: mogę uzyskać dostęp do wielu (różnych) usług na porcie 80, używając różnych domen, za pośrednictwem proxy przepływu dokowanego.

Używanie wspomnianej autokonfiguracji - wszystko działa jak urok.

Powiązane problemy