Impossibile collegarsi a un contenitore in esecuzione avviato da docker-compose


99

Sto configurando il mio ambiente di sviluppo locale con i contenitori Docker. Il docker-compose.yml è come segue

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 avvia senza errori. E docker elenca 3 container in esecuzione

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 collegarmi a quei contenitori in esecuzione da un altro contenitore

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

Ottengo 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?

Risposte:


196

Ok, ho trovato la risposta. Nel caso in cui qualcun altro dovesse riscontrare lo stesso problema, fallo e basta

docker network ls

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

Nota: alla rete della tua app viene assegnato un nome basato sul "nome del progetto", che si basa sul nome della directory in cui risiede. Puoi sovrascrivere il nome del progetto con il flag --project-name o la variabile d'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 

9
Per chi non si è accorto bisogna anteporre --netil comando. Ho riscontrato questo problema durante il tentativo di eseguire l'immagine docker redis ufficiale.
mistertee

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


2

Quando si utilizza la definizione del servizio versione 2 e più, docker-composecrea una rete definita dall'utente. La risoluzione dei nomi in una rete definita dall'utente funziona tramite il server DNS integrato Docker. Ecco la citazione correlata dalla documentazione :

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

I contenitori sono disponibili anche dagli alias di rete che docker-composecrea. Può essere verificato tramite comandi come:

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

Stampa ["db","$CONTAINER_ID"].

Fornire collegamenti con --linknon avrà alcun effetto nel caso di una rete esistente definita dall'utente. Puoi assicurarti e guardare /etc/hosts, che non avrà le linee corrispondenti.

Pertanto è sufficiente il seguente comando:

docker run -it --net myapp_default worker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.