2015-06-20 9 views
14

State esaminando l'utilizzo di Docker per un progetto di servizio REST. Una domanda che ho è se potremmo usare Docker per eseguire più versioni del servizio sullo stesso host/porta.È possibile eseguire più contenitori Docker utilizzando lo stesso host/porta?

Ad esempio, voglio avere un endpoint su {myserver}: 8080/v1/e un altro su {myserver}: 8080/v2 /.

Se è rilevante, si tratta di Java: 8 immagini Docker basate su un java jar nel framework REST di Spring Boot.

Ciò è possibile con i contenitori Docker?

+2

questo è un problema XY. questo è possibile senza contenitori che utilizzano un proxy (ad esempio nginx). i contenitori sono irrilevanti qui; puoi eseguire i servizi di back-end in contenitori ... o no. – dnozay

+0

È una domanda interessante, perché Docker potrebbe aver integrato una piccola funzione proxy per le rotte. Immagina qualcosa di simile: un contenitore con Apache, l'altro con Node.js che funziona su entrambi: 80 senza bisogno di un proxy ... –

risposta

4

Questa è una domanda sul modo in cui le porte TCP funzionano come il funzionamento della finestra mobile. Allo stesso modo in cui due applicazioni non possono collegarsi alla stessa porta TCP, non possono nemmeno due contenitori di finestra mobile.

As @Sergei Rodionov indica che SO_REUSEPORT può essere utilizzato per consentire a più processi di condividere la stessa porta TCP (e questo può essere specificato all'avvio dell'applicazione java). Non penso che funzionerà attraverso i contenitori.

+0

Cosa succede se il socket iniziale è associato all'opzione SO_REUSEPORT? –

+0

Mi sembra che SO_REUSEPORT sia pensato per essere utilizzato per processi sulla stessa macchina. Pensi che funzionerebbe attraverso i contenitori? –

+0

@RobertMoskal Per Nginx la seguente soluzione di nginx-proxy con docker-gen potrebbe aiutare: github.com/jwilder/nginx-proxy Fondamentalmente si aggiunge un proxy nell'ambiente docker e si lascia gestire le richieste sulla porta host e inoltrarlo a il contenitore appropriato –

7

È possibile eseguire entrambi i contenitori utilizzando diverse porte host e utilizzare un haproxy/nginx/varnish (nativo o all'interno di un altro contenitore) che ascolta la porta host e reindirizza al contenitore corretto in base all'URL.

+1

Per Nginx la seguente soluzione di nginx-proxy con docker-gen potrebbe aiutare: https://github.com/jwilder/nginx-proxy Fondamentalmente aggiungi un proxy nell'ambiente di docker e lascia che gestisca le richieste sul tuo host porta e inoltrarla al contenitore appropriato –

5

Sì, questo è possibile fino a quando si utilizzano indirizzi di rete diversi per ciascuna porta duplicata che si sta ascoltando.

Per esempio, il vostro ospite ha le seguenti indirizzi IP assegnati: 192.168.11.223 10.88.88.12

Si potrebbe avere due contenitori separati sia in ascolto su: 192.168.11.223:80 10.88.88.12: 80

Se si guarda la sintassi per la marcia finestra mobile:

-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

Sì, è possibile, a patto che i contenitori siano utilizzando diversi indirizzi IP. puoi controllare l'indirizzo IP dei contenitori usando il comando di sotto.

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID> 
Problemi correlati