2016-04-08 22 views
55

Sto configurando il mio ambiente di sviluppo locale con contenitori di finestra mobile. La finestra mobile-compose.yml è come seguireImpossibile collegarsi a un contenitore in esecuzione avviato da docker-compose

version: '2' 

services: 
    db: 
    image: mongo:3 
    mq: 
    image: rabbitmq:3 
    api: 
    build: . 
    image: my_app/api 
    ports: 
     - "3000:3000" 
    links: 
     - db 
     - mq 
    environment: 
     - NODE_ENV=development 

Si parte senza errori. E docker liste 3 contenitori da corsa

docker-compose up -d 
docker ps 

e90e5a8b5d33  my_app/api "/usr/local/bin/node " 0.0.0.0:3000->3000/tcp    my_app_api_1 
42bfcd971b16  mongo:3  "/entrypoint.sh mongo" 27017/tcp       my_app_db_1 
a0685a816c47  rabbitmq:3 "/docker-entrypoint.s" 4369/tcp, 5671-5672/tcp, 25672/tcp my_app_mq_1 

Tuttavia quando provo a collegare a quei contenitori che vanno da un altro contenitore

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it worker 

ottengo l'errore

docker: Error response from daemon: Cannot link to /my_app_mq_1, as it does not belong to the default network. 

Ho anche provato

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net default worker 

Stesso errore.

Quindi, come posso collegarmi a un container in esecuzione avviato da docker-compose?

risposta

128

Ok, ho trovato la risposta. Se qualcun altro incontra lo stesso problema, esegui semplicemente

docker network ls 

Questo comando elenca tutte le reti mobili. docker-compose creerà una nuova rete quando esegui docker-compose up. Nel mio caso, la rete è denominata myapp_default.

Nota: alla rete della tua app viene assegnato un nome basato sul "nome progetto", che si basa sul nome della directory in cui si trova. È possibile sovrascrivere il nome del progetto con --project-name flag o la variabile di ambiente COMPOSE_PROJECT_NAME. Networking in Compose

Quindi il modo corretto per collegarsi a quei contenitori è

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
+3

Per chi non ha notato devi mettere la '--net' prima del comando. Ho riscontrato questo problema durante il tentativo di eseguire l'immagine ufficiale della finestra mobile Redis. – mistertee

+1

Ho dovuto usare il flag --network, invece di --net. Usalo all'inizio del comando run. Spero che aiuti. Il riferimento è disponibile qui: https://docs.docker.com/engine/reference/run/#network-settings. – Erizo

0

Quando si utilizza il servizio definizione versione 2 e di più, docker-compose crea rete definito dall'utente. La risoluzione dei nomi in una rete definita dall'utente funziona tramite il server DNS incorporato Docker. Ecco correlate citazione da documentation:

Il Docker server DNS integrato consente la risoluzione dei nomi per i contenitori collegati ad una determinata rete [definito dall'utente]. Ciò significa che qualsiasi contenitore connesso può eseguire il ping di un altro contenitore sulla stessa rete tramite il nome del contenitore.

contenitori sono disponibili per gli alias di rete che crea anche docker-compose. Si può essere verificato comando come:

docker inspect \ 
    -f '{{json .NetworkSettings.Networks.myapp_default.Aliases}}' my_app_db_1 

la stampa ["db","$CONTAINER_ID"].

I collegamenti con --link non avranno alcun effetto in caso di rete definita dall'utente esistente. Puoi assicurarti e guardare /etc/hosts, che non avrà le linee corrispondenti.

Così il seguente comando è sufficiente:

docker run -it --net myapp_default worker 
-1

mio comando per eseguire i collegamenti

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command 
Problemi correlati