web-dev-qa-db-fra.com

Connexion d'un conteneur Docker à un autre

Je veux exécuter rabbitmq-server dans un conteneur docker et me connecter à partir d'un autre conteneur à l'aide de céleri ( http://celeryproject.org/ )

J'ai Rabbitmq en cours d'exécution en utilisant la commande ci-dessous ...

Sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server

et courir le céleri via

Sudo docker run -i -t markellul/celery /bin/bash

Quand j'essaie de faire le didacticiel très basique pour valider la connexion sur http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

Je reçois une erreur de connexion refusée:

consommateur: Impossible de se connecter à amqp: //[email protected]: 5672 //: [Errno 111] Connexion rejetée.

Lorsque j'installe rabbitmq sur le même récipient que le céleri, cela fonctionne bien.

Que dois-je faire pour que les conteneurs interagissent les uns avec les autres?

19
Mark Ellul

[modifier 2016]

Les liens directs sont obsolètes maintenant. La nouvelle façon de faire des conteneurs de liens est docker network connect . Il fonctionne de manière assez similaire aux réseaux virtuels et offre un ensemble de fonctionnalités plus étendu que l’ancienne méthode de liaison.

D'abord, vous créez vos conteneurs nommés:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash

Ensuite, vous créez un réseau (le dernier paramètre est votre nom de réseau):

docker network create -d bridge --subnet 172.25.0.0/16 mynetwork

Connectez les conteneurs à votre réseau nouvellement créé:

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery

Maintenant, les deux conteneurs sont dans le même réseau et peuvent communiquer l'un avec l'autre.

Vous trouverez un guide de l'utilisateur très détaillé à l'adresse Utilisation de réseaux: Connecter des conteneurs .

[ancienne réponse]

Il existe une nouvelle fonctionnalité dans Docker 0.6.5 appelée link , destinée à faciliter la communication entre les conteneurs de menu fixe.

Commencez par créer votre conteneur rabbitmq comme d'habitude. Notez que j'ai aussi utilisé la nouvelle fonctionnalité "name" qui rend la vie un peu plus facile:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server

Vous pouvez utiliser le paramètre link pour mapper un conteneur (nous utilisons le nom ici, l'identifiant serait également correct):

docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash

Vous avez maintenant accès à l'IP et au port du conteneur rabbitmq car docker a automatiquement ajouté certaines variables d'environnement:

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

De plus, Docker ajoute une entrée d'hôte pour le conteneur source au fichier /etc/hosts. Dans cet exemple, amq sera un hôte défini dans le conteneur.
De Docker documentation :

Contrairement aux entrées de l'hôte dans le fichier/etc/hosts, les adresses IP stockées dans les variables d'environnement ne sont pas automatiquement mises à jour si le conteneur source est redémarré. Nous vous recommandons d'utiliser les entrées de l'hôte dans/etc/hosts pour résoudre l'adresse IP des conteneurs liés.

75
Alp

Obtenez simplement votre adresse IP de conteneur et connectez-vous à partir d'un autre conteneur:

CONTAINER_IP=$(Sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
5
Valentin Kantor

Lorsque vous spécifiez -p 5672, What docker do ouvre un nouveau port, tel que 49xxx sur l'hôte, et le transfère au port 5672 du conteneur.

vous devriez être capable de voir quel port est transféré au conteneur en lançant:

Sudo docker ps -a

À partir de là, vous pouvez vous connecter directement à l'adresse IP de l'hôte de la manière suivante:

amqp://guest@Host_IP:49xxx

Vous ne pouvez pas utiliser localhost, car chaque conteneur est fondamentalement son propre localhost.

3
amattn

Je pense que vous ne pouvez pas vous connecter directement à un autre conteneur, car ce serait la responsabilité de l'hôte. Un exemple de partage de données entre conteneurs à l'aide de Volumes est donné ici http://docs.docker.io/en/latest/examples/couchdb_data_volumes/ , mais je ne pense pas que ce soit ce cherchez.

J'ai récemment découvert l'existence de https://github.com/toscanini/maestro - qui pourrait répondre à vos besoins. Faites-nous savoir si c'est le cas :), je ne l'ai pas encore essayé moi-même.


Modifier. Notez que vous pouvez lire ici que le "Câblage de conteneur et la découverte de service" natif se trouve sur la feuille de route. Je suppose que 7.0 ou 8.0 au plus tard.

1
qkrijger

Vous pouvez obtenir l'adresse IP de l'instance de docker avec ...

CID=$(Sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); Sudo docker inspect $CID | grep IPAddress

Mais ce n'est pas très utile.

Vous pouvez utiliser pipework pour créer un réseau privé entre les conteneurs Docker.

1
chanux

C'est actuellement sur la feuille de route 0.8:

https://github.com/dotcloud/docker/issues/1143

0
Allard Hoeve