2015-09-07 14 views
9

Chcę uruchomić zadanie w niektórych kontenerach dokowania na różnych hostach. Napisałem aplikację zarządzającą, która zarządza kontenerami (uruchom zadanie, zatrzymaj zadanie, uzyskaj status itd.). Po uruchomieniu kontenera wyśle ​​do menedżera żądanie http z jego adresem i portem, dzięki czemu menedżer będzie wiedział, jak zarządzać kontenerem.Jak uzyskać mapowany port na hoście z kontenera w doku?

Ponieważ na tym samym hoście może znajdować się więcej niż jeden kontener, będą one mapowane do różnych portów. Aby zarejestrować kontener na moim managerze, muszę wiedzieć, do którego portu jest przypisany każdy kontener.

Jak mogę uzyskać zamapowany port w kontenerze dokowanym?

Istnieje rozwiązanie tutaj How do I know mapped port of host from docker container?. Ale nie ma to zastosowania, jeśli uruchamiam kontener z opcją -P. Ponieważ to pytanie jest zadawane ponad rok temu, zastanawiam się, czy istnieje możliwość dodania nowej funkcji do okna dokowanego w celu rozwiązania tego problemu.

Odpowiedz

1

Gdy pojemnik jest uruchomiona, to wyśle ​​żądanie HTTP do menedżer z jego adresem i portem

To nie zadziała. Z wnętrza kontenera nie można dowiedzieć się, do którego portu hosta dokera został przyporządkowany port kontenera.

Co mogę myśleć o tym, który z nich zadziała i będzie najbliżej tego, co opisujesz, to , dzięki czemu kontener otwiera połączenie z siecią Web Manager do menedżera. Takie połączenie pozwoliłoby na dwukierunkową komunikację między Twoim menedżerem i kontenerem, a jednocześnie za pośrednictwem protokołu HTTP.


To, co próbujesz osiągnąć, nazywa się service discovery. Istnieją już narzędzia do wykrywania usług, które działają z Dockerem. Powinieneś wybrać jedną z nich zamiast próbować tworzyć własną.

Patrz na przykład:


Jeśli naprawdę chcą wprowadzić system wykrywania usług, jedna droga ma mieć Twój menedżer korzysta z polecenia docker event (lub jednego z docker client librairies). Umożliwiłoby to Twojemu menedżerowi otrzymywanie powiadomień o kreacjach/usunięciach kontenerów bez żadnych działań po stronie kontenera.

Następnie zapytaj hosta dokera, aby dowiedzieć się, które porty są odwzorowane na twoje pojemniki za pomocą docker port.

9

Można również wy docker port container_id

doc

https://docs.docker.com/reference/commandline/port/

przykłady z doc

$ docker port test 
7890/tcp -> 0.0.0.0:4321 
9876/tcp -> 0.0.0.0:1234 
$ docker port test 7890/tcp 
0.0.0.0:4321 
$ docker port test 7890/udp 
2014/06/24 11:53:36 Error: No public port '7890/udp' published for test 
$ docker port test 7890 
0.0.0.0:4321 
+1

Dziękuję, ale to nie można uruchomić w kontenerze. Czy jest możliwe, aby port wszedł do kontenera? – iuradz

2

dzielę /var/run/docker.sock do pojemnika i uzyskać informacje samodzielne

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh 

w powłoce pojemnika

env //get HOSTNAME 

curl --unix-socket /var/run/docker.sock http://localhost/containers/3c6b9e44a622/json 

3c6b9e44a622 to HOSTNAME

+0

Jedyny problem polega na tym, że jeśli twoja usługa zostanie naruszona, tworzysz nowy wektor ataku na cały system dokowania ... Myślę, że wolałbym zrobić dedykowany kontener do dokowania, aby dać ci informacje o twoim kontenerze ... ponieważ tylko twój kontener komunikowałby się z nim, a nie ze światem zewnętrznym –

Powiązane problemy