No se puede vincular a un contenedor en ejecución iniciado por docker-compose

99

Estoy configurando mi entorno de desarrollo local con contenedores Docker. El docker-compose.yml es como seguir

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

Comienza sin errores. Y Docker enumera 3 contenedores en ejecución

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

Sin embargo, cuando trato de vincularme a esos contenedores en ejecución desde otro contenedor

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

Me sale un error

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

Yo tambien he probado

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

Mismo error.

Entonces, ¿cómo puedo vincularme a un contenedor en ejecución iniciado por docker-compose?

Byte de despertar
fuente

Respuestas:

196

Ok, encontré la respuesta. En caso de que alguien más se encuentre con el mismo problema, simplemente haga

docker network ls

Este comando enumera todas las redes de Docker. docker-compose creará una nueva red cuando ejecute docker-compose up. En mi caso, la red se denomina myapp_default.

Nota: La red de tu aplicación recibe un nombre basado en el "nombre del proyecto", que se basa en el nombre del directorio en el que vive. Puedes anular el nombre del proyecto con la marca --project-name o la variable de entorno COMPOSE_PROJECT_NAME . Redes en Compose

Entonces, la forma correcta de vincular a esos contenedores es

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Byte de despertar
fuente
9
Para aquellos que no se dieron cuenta, deben poner el --netantes del comando. Encontré este problema al intentar ejecutar la imagen oficial de la ventana acoplable de redis.
mistertee
3
Tuve que usar la marca --network, en lugar de --net. Úselo al comienzo del comando de ejecución. Espero que esto ayude. La referencia está disponible aquí: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

mi comando para ejecutar enlaces

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
Gabriel Borges Oliveira
fuente
2

Cuando usa la definición de servicio versión 2 y más, docker-composecrea una red definida por el usuario. La resolución de nombres en una red definida por el usuario funciona a través del servidor DNS integrado de Docker. Aquí está la cita relacionada de la documentación :

El servidor DNS integrado de Docker permite la resolución de nombres para contenedores conectados a una red determinada [definida por el usuario]. Esto significa que cualquier contenedor conectado puede hacer ping a otro contenedor en la misma red por su nombre de contenedor.

Los contenedores también están disponibles mediante los alias de red que docker-composecrea. Se puede verificar mediante un comando como:

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

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

Proporcionar enlaces con --linkno tendrá ningún efecto en el caso de una red definida por el usuario existente. Puede asegurarse y mirar /etc/hosts, que no tendrá las líneas correspondientes.

Por tanto, el siguiente comando es suficiente:

docker run -it --net myapp_default worker
saaj
fuente