Je prévois de diviser mon serveur monolthique en plusieurs petits conteneurs docker mais je n'ai pas encore trouvé de bonne solution pour la "communication inter-conteneurs". Voici mon scénario cible:
Je sais comment lier des conteneurs entre eux et comment exposer des ports, mais aucune de ces solutions ne me satisfait.
Existe-t-il une solution pour communiquer via des noms d'hôte (noms de conteneurs) entre les conteneurs comme dans un réseau de serveurs traditionnel?
networking
docker
Patrick Gotthard
la source
la source
Réponses:
Edit: Après Docker 1.9, la
docker network
commande (voir ci-dessous https://stackoverflow.com/a/35184695/977939 ) est le moyen recommandé pour y parvenir.Ma solution est de configurer un dnsmasq sur l'hôte pour que l'enregistrement DNS soit automatiquement mis à jour: les enregistrements «A» ont les noms des conteneurs et pointent automatiquement vers les adresses IP des conteneurs (toutes les 10 secondes). Le script de mise à jour automatique est collé ici:
Assurez-vous que votre service dnsmasq est disponible sur
docker0
. Ensuite, démarrez votre conteneur avec--dns HOST_ADDRESS
pour utiliser ce service mini DNS.Référence: http://docs.blowb.org/setup-host/dnsmasq.html
la source
La nouvelle fonctionnalité de mise en réseau vous permet de vous connecter aux conteneurs par leur nom, donc si vous créez un nouveau réseau, tout conteneur connecté à ce réseau peut atteindre d'autres conteneurs par leur nom. Exemple:
1) Créer un nouveau réseau
2) Connectez les conteneurs au réseau
ou
3) Ping conteneur par nom
Voir cette section de la documentation;
Remarque: contrairement à l'héritage,
links
le nouveau réseau ne créera pas de variables d'environnement, ni ne partagera les variables d'environnement avec d'autres conteneurs.Cette fonctionnalité ne prend actuellement pas en charge les alias
la source
docker-compose down,up,restart
?bridge
réseau par défaut à cause de la rétrocompatibilité mais oui, je suis d'accord, il devrait certainement être activé par défaut!Cela devrait être à quoi
--link
ça sert , au moins pour la partie hostname.Avec docker 1.10 et PR 19242 , ce serait:
(voir la dernière section ci-dessous)
C'est ce que la mise à jour des
/etc/hosts
détails du fichierPar exemple, lancez un serveur LDAP:
Et définissez une image pour tester ce serveur LDAP:
Vous pouvez exposer le '
openldap
' conteneur en tant que 'internalopenldap
' dans l'image de test avec --link:Ensuite, si vous tapez 'lds', cet alias fonctionnera:
Cela rendrait les gens. La signification
internalopenldap
est correctement atteinte à partir de l'ldaptest
image.Bien sûr, docker 1.7 ajoutera
libnetwork
, qui fournit une implémentation Go native pour connecter des conteneurs. Voir le billet de blog .Il a introduit une architecture plus complète, avec le Container Network Model (CNM)
Cela mettra à jour la CLI Docker avec de nouvelles commandes «réseau» et documentera comment l'
-net
indicateur « » est utilisé pour attribuer des conteneurs aux réseaux.docker 1.10 a une nouvelle section Alias à l'échelle du réseau , maintenant officiellement documentée dans
network connect
:la source
EDIT : Ce n'est plus à la fine pointe: http://blog.docker.com/2016/02/docker-1-10/
Réponse originale
Je me suis battu avec lui toute la nuit. Si vous n'avez pas peur de la pointe de la technologie , la dernière version du moteur Docker et de Docker composent les deux implémentent libnetwork.
Avec le bon fichier de configuration (qui doit être mis en version 2), vous allez créer des services qui se verront tous. Et, bonus, vous pouvez également les mettre à l'échelle avec docker-compose (vous pouvez mettre à l'échelle n'importe quel service de votre choix qui ne lie pas le port sur l'hôte)
Voici un fichier d' exemple
Et la référence pour cette nouvelle version de compose file: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
la source
Autant que je sache, en utilisant uniquement Docker, ce n'est pas possible. Vous avez besoin de DNS pour mapper les adresses IP du conteneur aux noms d'hôte.
Si vous voulez une solution prête à l'emploi. Une solution consiste à utiliser par exemple Kontena . Il est livré avec la technologie de superposition de réseau de Weave et cette technologie est utilisée pour créer des réseaux LAN privés virtuels pour chaque service et chaque service peut être atteint par
service_name.kontena.local-address
.Voici un exemple simple de fichier YAML de l'application Wordpress où le service Wordpress se connecte au serveur MySQL avec l'adresse wordpress-mysql.kontena.local:
la source