2016-06-29 52 views
46

Ho due docker-compose.yml file separati in due cartelle diverse:comunicazione tra più progetti docker-composizione

  • ~/front/docker-compose.yml
  • ~/api/finestra mobile-compose.yml

Come posso fare in modo che un contenitore in front può inviare richieste di un contenitore in api?

so che --default-gateway opzione può essere impostata usando docker run per un singolo contenitore, in modo che un indirizzo IP specifico può essere assegnato a questo contenitore, ma sembra che questa opzione non è disponibile quando si utilizza docker-compose.

Attualmente ho finito per fare un docker inspect my_api_container_id e guardare il gateway nell'output. Funziona, ma il problema è che questo IP è attribuito casualmente, quindi non posso fare affidamento su di esso.

Un'altra forma di questa domanda potrebbe quindi essere:

  • Posso attribuire un indirizzo IP fisso ad un particolare contenitore utilizzando finestra mobile-comporre?

Ma alla fine quello che sto cercando dopo è:

  • Come possono due diversi progetti docker-composizione comunicare tra loro?
+0

Ho appena esaminato questo oggi di nuovo. Gli sviluppatori hanno finalmente ceduto e consentito la denominazione di rete arbitraria. Utilizzando la versione 3.5 del file di composizione è possibile specificare un nome per la rete predefinita sotto la chiave "reti". Questo creerà una rete nominata senza il solito prefisso del nome del progetto, se non esiste. – cstrutton

risposta

62

È sufficiente accertarsi che i contenitori con cui si desidera parlare si trovino sulla stessa rete. Le reti sono un costrutto docker di prima classe e non specifiche per la composizione.

# front/docker-compose.yml 
version: '2' 
services: 
    front: 
    ... 
    networks: 
     - some-net 
networks: 
    some-net: 
    driver: bridge 

...

# api/docker-compose.yml 
version: '2' 
services: 
    api: 
    ... 
    networks: 
     - front_some-net 
networks: 
    front_some-net: 
    external: true 

Essi possono quindi comunicare tra loro utilizzando il nome del servizio. Da front puoi fare ping api e viceversa.

+0

Per curiosità, nessun elemento mappato alla porta host (localhost), sarà visibile a tutti i contenitori? –

+0

E una volta assicurati di essere nella stessa rete, come suggerisci, cosa fare allora? Il contenitore 'front' può avere un' link' per 'api' container per esempio? – Jivan

+0

@JHarris bene, se faccio ciò che suggerisci, inizio ('up') ~/front trigger 'Alcune reti sono state definite ma non utilizzate da alcun servizio' - mentre si avvia ~/api trigger' Service "api" usa un indefinito network' – Jivan

0

mi garantirebbe tutti i contenitori sono docker-compose 'd alla stessa rete componendo insieme, allo stesso tempo, utilizzando:

docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d 
+0

Questo mi consentirà, ad esempio, di creare un 'link' o' depends_on' da un contenitore di fronte a un contenitore di api? – Jivan

+0

effettivamente quando faccio ciò che suggerisci, docker-compose risponde sia 'build path ~/front/api o non esiste o non è accessibile 'o viceversa,' build path ~/api/front non esiste o non è accessibile' – Jivan

+1

Se li stai componendo allo stesso tempo non dovresti averne bisogno. Verrà creata una rete con tutti i contenitori su di essa, tutti saranno in grado di comunicare tramite il nome del servizio dal file di composizione (* non * il nome del contenitore). – Nauraushaun

15

Solo un piccolo adittion a @ grande risposta di johnharris85, quando si esegue un file di finestra mobile composizione, una rete "default" viene creato modo si può semplicemente aggiungere alla altro file composizione come una rete esterna:

# front/docker-compose.yml 
version: '2' 
    services: 
    front_service: 
    ... 

...

# api/docker-compose.yml 
version: '2' 
services: 
    api_service: 
    ... 
    networks: 
     - front_default 
networks: 
    front_default: 
    external: true 

Per me questo approccio era più adatto perché non possedevo il primo file di composizione di docker e volevo comunicare con esso.

+0

solo vagando il modo corretto per assegnare l'IP statico per questa rete esterna. Ho deciso di farlo all'interno di 'services:' tag, la sintassi sarebbe 'networks:' then nested 'front_default:' (rimuovi il parametro "-") e quindi annidiamo un IP statico: 'ipv4_address: '172.20.0.44'' –

10

Tutti i contenitori da api possono aderire alla rete frontpredefinita con i seguenti config:

# api/docker-compose.yml 

... 

networks: 
    default: 
    external: 
     name: front_default 

See guida finestra mobile composizione: using a pre existing network (vedi in basso)

2

Le precedenti informazioni messaggi siano corrette, ma non ha dettagli su come collegare i contenitori, che dovrebbero essere collegati come "external_links".

Spero che questo esempio rendere più chiaro a voi:

  • Supponiamo di avere app1/finestra mobile-compose.yml, con due servizi (svc11 e svc12) e app2/finestra mobile-compose.yml con due altri servizi (svc21 e svc22) e supponiamo è necessario collegare in modo incrociato:

  • svc11 ha bisogno di connettersi al contenitore di svc22

  • svc21 ha bisogno di connettersi al contenitore di svc11.

Così la configurazione dovrebbe essere simile a questo:

questo è app1/finestra mobile-compose.yml:


version: '2' 
services: 
    svc11: 
     container_name: container11 
     [..] 
     networks: 
      - default # this network 
      - app2_default # external network 
     external_links: 
      - container22:container22 
     [..] 
    svc12: 
     container_name: container12 
     [..] 

networks: 
    default: # this network (app1) 
     driver: bridge 
    app2_default: # external network (app2) 
     external: true 

questo è app2/finestra mobile-compose.yml:


version: '2' 
services: 
    svc21: 
     container_name: container21 
     [..] 
     networks: 
      - default # this network (app2) 
      - app1_default # external network (app1) 
     external_links: 
      - container11:container11 
     [..] 
    svc22: 
     container_name: container22 
     [..] 

networks: 
    default: # this network (app2) 
     driver: bridge 
    app1_default: # external network (app1) 
     external: true 
6

AGGIORNAMENTO: A partire dalla versione 3.5 del file comporre:

Questo funziona ora:

version: "3.5" 
services: 
    proxy: 
    image: user/image:tag 
    ports: 
     - "80:80" 
    networks: 
     - proxynet 

networks: 
    proxynet: 
    name: custom_network 

docker-compose up -d si uniranno una rete chiamata 'custom_network'. Se non esiste, verrà creato!

Ora, si può fare questo:

version: "2+" 
services: 
    web: 
    image: myweb:latest 
    networks: 
     - my-proxy-net 
networks: 
    my-proxy-net: 
    external: 
     name: custom_network 

Questo creerà un contenitore che sarà sulla rete esterna.

Non riesco ancora a trovare alcun riferimento nei documenti ma funziona!

+0

Grazie! Funziona molto bene – Mounir

1

Da Componi 1.18 (specifica 3.5), è possibile sovrascrivere la rete predefinita utilizzando il proprio nome personalizzato per tutti i file YAML Compose necessari. E 'semplice come aggiungendo il seguente a loro:

networks: 
    default: 
    name: my-app 

The above assumes you have version set to 3.5 (or above if they don't deprecate it in 4+).

altre risposte hanno evidenziato lo stesso; questo è un riassunto semplificato.