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