2015-09-07 16 views
9

Voglio eseguire un'attività in alcuni contenitori di finestra mobile su host diversi. E ho scritto un'app manager per gestire i container (avviare attività, interrompere attività, ottenere lo stato, ecc ...). Una volta avviato un container, invierà una richiesta http al gestore con il suo indirizzo e la sua porta, in modo che il gestore sappia come gestire il contenitore.Come ottenere la porta mappata sull'host da un contenitore finestra mobile?

Poiché potrebbero essere presenti più contenitori in esecuzione su uno stesso host, questi verranno mappati su porte diverse. Per registrare un container sul mio manager, devo sapere su quale porta è mappato ogni container.

Come è possibile ottenere la porta mappata all'interno di in un contenitore mobile?

C'è una soluzione qui How do I know mapped port of host from docker container?. Ma non è applicabile se eseguo il contenitore con -P. Poiché questa domanda è stata presentata più di 1 anno fa, mi chiedo forse che sia stata aggiunta una nuova funzione alla finestra mobile per risolvere questo problema.

risposta

1

Una volta che un contenitore viene avviato, invierà una richiesta HTTP il manager con il suo indirizzo e la sua porta

Questo non funzionerà. Dall'interno di un contenitore non è possibile capire a quale porta host del docker viene mappata una porta del contenitore.

Quello che posso pensare su quale dovrebbe funzionare e essere il più vicino a ciò che viene descritto è facendo in modo che il contenitore apra una connessione websocket al gestore. Tale connessione consentirebbe due modalità di comunicazione tra il tuo gestore e il contenitore mentre si trova ancora su HTTP.


Quello che stai cercando di ottenere è chiamato service discovery. Esistono già strumenti per l'individuazione dei servizi che funzionano con Docker. Dovresti sceglierne uno invece di provare a crearne uno tuo.

si veda ad esempio:


Se davvero si vuole implementare il sistema di rilevamento dei servizi, un modo per andare è quello di avere il tuo manager usa il comando docker event (o uno degli docker client librairies). Ciò consentirebbe al tuo manager di ricevere notifiche sulle creazioni/eliminazioni dei contenitori senza nulla da fare sul lato del contenitore.

Quindi interrogare l'host della finestra di dialogo per individuare le porte mappate sui contenitori con docker port.

9

È possibile anche docker port container_id

DOC

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

esempi dal 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

Grazie, ma questo non può essere eseguito all'interno di un contenitore. È possibile ottenere il porto all'interno di un container? – iuradz

2

condivido /var/run/docker.sock al contenitore e ottenere informazioni di auto

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

nel guscio di contenimento

env //get HOSTNAME 

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

il 3c6b9e44a622 è il vostro HOSTNAME

+0

L'unico problema qui è che se il tuo servizio viene compromesso stai creando un nuovo vettore di attacco all'intero sistema docker ... Penso che preferirei creare un contenitore docker dedicato per darti informazioni per il tuo contenitore ... perché solo il tuo il contenitore avrebbe comunicato con esso, non fuori dal mondo –

Problemi correlati