web-dev-qa-db-fra.com

Impossible d'établir une liaison avec un conteneur en cours d'exécution démarré par docker-compose

Je configure mon environnement de développement local avec des conteneurs Docker. Le docker-compose.yml est comme suit

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

Il commence sans erreur . Et docker répertorie 3 conteneurs en cours d'exécution

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

Cependant, lorsque j'essaie de créer un lien vers les conteneurs en cours d'exécution à partir d'un autre conteneur

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

Je reçois une erreur

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

J'ai aussi essayé 

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

Même erreur.

Alors, comment puis-je créer un lien vers un conteneur en cours d'exécution démarré par docker-compose?

76
Awakening Byte

Ok, a trouvé la réponse. Si quelqu'un d'autre rencontre le même problème, il suffit de 

docker network ls

Cette commande répertorie tous les réseaux de menus fixes. docker-compose créera un nouveau réseau lorsque vous exécuterez docker-compos up. Dans mon cas, le réseau s'appelle myapp_default.

Remarque: le réseau de votre application se voit attribuer un nom basé sur le «nom du projet», qui repose sur le nom du répertoire dans lequel elle réside. Vous pouvez remplacer le nom du projet avec l'indicateur --project-name ou la variable d'environnement COMPOSE_PROJECT_NAME. . Mise en réseau dans Compose

Donc, la bonne façon de se connecter à ces conteneurs est

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
162
Awakening Byte

ma commande d'exécuter des liens

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

Lorsque vous utilisez la définition de service version 2 ou supérieure, docker-compose crée un réseau défini par l'utilisateur. La résolution de noms dans un réseau défini par l'utilisateur fonctionne via le serveur DNS intégré de Docker. Voici une citation connexe de documentation :

Le serveur DNS intégré de Docker permet la résolution de noms pour les conteneurs connectés à un réseau [défini par l'utilisateur] donné. Cela signifie que tout conteneur connecté peut envoyer une requête ping à un autre conteneur du même réseau par son nom de conteneur.

Les conteneurs sont également disponibles par les alias de réseau créés par docker-compose. Il peut être vérifié par une commande comme:

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

Il imprime ["db","$CONTAINER_ID"].

Fournir des liens avec --link n'aura aucun effet dans le cas d'un réseau existant défini par l'utilisateur. Vous pouvez vous en assurer et regarder /etc/hosts, qui n'aura pas les lignes correspondantes. 

Ainsi, la commande suivante est suffisante:

docker run -it --net myapp_default worker
0
saaj