Comment créer un lien bidirectionnel entre les conteneurs?
J'ai pour lier les deux conteneurs afin qu'ils puissent voir les uns les autres. Bien sûr, la suite...
docker run -i -t --name container1 --link container2:container2 ubuntu:trusty /bin/bash
docker run -i -t --name container2 --link container1:container1 ubuntu:trusty /bin/bash
...ne parvient pas à la ligne 1, car un récipient doit être en place et en cours d'exécution afin d'être une cible du lien:
2014/08/15 03:20:27 Error response from daemon: Could not find entity for container2
Quelle est la façon la plus simple de créer un lien bidirectionnel?
- Mon récent answer peut vous intéresser.
- merci, c'est effectivement ce que j'ai fait (voir mon propre réponse ci-dessous), et il travaille de manière très fiable
Vous devez vous connecter pour publier un commentaire.
Docker 1.10 adresses de cette très joliment en introduisant avancé conteneur de réseautage.
(Détails: https://docs.docker.com/engine/userguide/networking/dockernetworks/ )
Tout d'abord, créer un réseau. L'exemple ci-dessous crée un "pont" du réseau, qui fonctionne sur un seul hôte. Vous pouvez consulter docker est une documentation plus complète pour ce faire dans les hôtes à l'aide d'un réseau de superposition.
Docker réseaux 1.10 maintenant créer un spécial de résolution DNS à l'intérieur de conteneurs qui peuvent résoudre les noms d'une manière spéciale. Tout d'abord, vous pouvez continuer à utiliser --lien, mais comme vous l'avez souligné votre exemple ne fonctionne pas. Ce que je recommande est d'utiliser --net-alias= dans votre panneau d'exécuter des commandes:
Remarque que le fait d'avoir --nom container2 est le paramètre le nom du conteneur, ce qui crée également une entrée DNS et-net-alias=container2 crée une entrée DNS sur le réseau, donc dans cet exemple particulier, vous pourriez omettre --net-alias, mais je l'ai laissé là au cas où vous vouliez renommer vos contenants et ont encore un alias DNS qui ne correspond pas à votre nom de conteneur.
(Plus de détails ici: https://docs.docker.com/engine/userguide/networking/configure-dns/ )
Et ici, vous allez:
Et de container1
Il n'y a pas de bi-directionnelle lien car on ne peut pas lier à une non-exécution de conteneur.
Sauf si vous êtes la désactivation de l'inter-communication de conteneur, tous les conteneurs sur le même hôte peut voir tout autre contenant sur le réseau. Tous vous avez besoin est de leur fournir l'adresse ip du conteneur que vous souhaitez contacter.
La façon la plus simple de connaître l'adresse ip d'un conteneur est à exécuter:
Vous pouvez le regarder après le démarrage de deux récipients (il suffit de ne pas utiliser
--link
).Si vous avez besoin de savoir l'adresse IP de container2 de l'intérieur container1 automatiquement, il ya quelques options:
Monter le docker prise en volume et de l'utilisation de l'API à distance
docker run-je -t --nom container1 -v /var/run/docker.chaussette:docker.chaussette de ubuntu:ubuntu trusty /bin/bash
echo-e "GET /conteneurs/container2/json HTTP/1.0\r\n" | cn -U /docker.chaussette | sed 's/.IPAddress":"([0-9.]).*/\1/'
Utilisation d'une orchestration de services... il y a tellement de choix, mais personnellement, j'aime le DNS comme Skydock ou registrator et l'accès des conteneurs par nom dns.
Utiliser un panneau de gestion de service (tels que dockerize.c' —disclaimer: je suis en train de travailler sur lui—) qui permet de configurer le service DNS pour vous.
echo -e "GET...\r\n"
?Car il n'y a pas de lien bidirectionnel, j'ai résolu ce problème avec le --net argument. De cette manière, ils sont à l'aide de la même pile réseau et peut donc accéder à l'autre via le bouclage du périphérique (localhost).
Afin que je puisse accéder depuis le web le sélénium serveur (port 4444) et mon selenium server peut accéder à mon serveur web (port 80).
Voici comment j'ai résolu ce problème pour moi:
Tout d'abord, je vais à travers tous mes contenants (qui ont besoin de savoir les uns des autres) et de créer dnsmasq entrées comme suit:
Puis-je commencer un conteneur dns qui a dnsmasq de la base installée et commence à dnsmasq de service:
puis-je obtenir l'adresse IP de ce conteneur:
Et de commencer à les conteneurs comme suit:
C'est une version simplifiée de mon installation, mais il montre la gist. J'ai aussi ajouté un mécanisme qui oblige à dnsmasq de réanalyser lorsque les fichiers dans /etc/dnsmasq.d changement via inotify-tools. De cette façon, tous les conteneurs d'obtenir la nouvelle adresse ip chaque fois qu'un conteneur est redémarré.
J'ai résolu ce problème en ajoutant un ip-table dans /etc/hosts de chaque conteneur, pour
exemple