Impossible de créer un lien vers un conteneur en cours d'exécution démarré par docker-compose

99

Je mets en place 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

Cela démarre 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 ces 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?

Octet d'éveil
la source

Réponses:

196

Ok, j'ai trouvé la réponse. Si quelqu'un d'autre rencontre le même problème, faites-le

docker network ls

Cette commande répertorie tous les réseaux docker. docker-compose créera un nouveau réseau lorsque vous exécuterez docker-compose up. Dans mon cas, le réseau est nommé myapp_default.

Remarque: le réseau de votre application reçoit un nom basé sur le "nom du projet", qui est basé sur le nom du répertoire dans lequel il 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 créer un lien vers ces conteneurs est

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Octet d'éveil
la source
9
Pour ceux qui n'ont pas remarqué, vous devez mettre le --netavant la commande. J'ai rencontré ce problème en essayant d'exécuter l'image docker redis officielle.
mistertee
3
J'ai dû utiliser l'indicateur --network, au lieu de --net. Utilisez-le au début de la commande d'exécution. J'espère que ça aide. La référence est disponible ici: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

ma commande pour exécuter des liens

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

Lorsque vous utilisez la définition de service version 2 et plus, docker-composecré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é Docker. Voici une citation associée de la 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 sur le même réseau par son nom de conteneur.

Les conteneurs sont également disponibles par les alias de réseau qui docker-composecréent. Il peut être vérifié par commande comme:

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

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

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

Ainsi, la commande suivante suffit:

docker run -it --net myapp_default worker
saaj
la source