web-dev-qa-db-fra.com

Comment atteindre les conteneurs Docker par nom au lieu de l'adresse IP?

Existe-t-il un moyen d'atteindre mes conteneurs Docker en utilisant des noms au lieu d'adresses IP?

J'ai entendu parler de la tuyauterie et j'ai vu des options de type DNS et nom d'hôte pour Docker, mais je ne suis toujours pas en mesure de tout assembler.

Merci pour votre temps.

Je ne sais pas si cela est utile, mais c'est ce que j'ai fait jusqu'à présent:

  • docker Container Host installé à l'aide de Docker-Machine et du pilote vmwarevsphere
  • démarré tous les services avec docker-compose
  • Je peux accéder à tous les services à partir de n'importe quelle autre machine du réseau en utilisant IP et le port

J'ai ajouté une entrée d'alias DNS à mon serveur DNS de réseau privé et elle correspond au nom de machine utilisé par docker-machine. Mais la machine récupère toujours une adresse IP différente lorsqu'elle démarre et se connecte au réseau.

Je suis juste perdu pour savoir où aborder ceci:

  • serveur DNS réseau
  • nom d'hôte docker-machine
  • nom d'hôte du conteneur Docker
  • probablement une combinaison de tous

Je cherche probablement quelque chose de similaire à cette question:

Comment permettre à docker d'utiliser mon routeur réseau pour attribuer facilement l'ip dhcp aux conteneurs au lieu de la tuyauterie?

Toute direction générale sera géniale ... merci encore!

31
A L

Docker 1.10 possède un DNS intégré. Si vos conteneurs sont connectés au même réseau défini par l'utilisateur (créez un réseau docker network create my-network et exécutez votre conteneur avec --net my-network) ils peuvent se référencer en utilisant le nom du conteneur. ( Documents ).

Cool!

Une mise en garde si vous utilisez Docker compose, vous savez qu'il ajoute un préfixe aux noms de vos conteneurs, c'est-à-dire <project name>_<service name>-#. Cela rend les noms de vos conteneurs un peu plus difficiles à contrôler, mais cela peut convenir à votre cas d'utilisation. Vous pouvez remplacer la fonctionnalité de nommage de docker compose en définissant manuellement le nom du conteneur dans votre modèle de composition, mais vous ne pourrez pas évoluer avec compose .

21
datacarl

Créez un nouveau réseau de pont autre que docker0, exécutez vos conteneurs à l'intérieur et vous pouvez référencer les conteneurs à l'intérieur de ce réseau par leurs noms.

Le démon Docker exécute un serveur DNS intégré pour fournir une découverte de service automatique pour les conteneurs connectés à des réseaux définis par l'utilisateur. Les demandes de résolution de noms des conteneurs sont d'abord traitées par le serveur DNS intégré.

Essaye ça:

docker network create <network name>
docker run --net <network name> --name test busybox nc -l 0.0.0.0:7000
docker run --net <network name> busybox ping test

Tout d'abord, nous créons un nouveau réseau. Ensuite, nous exécutons un conteneur busybox nommé test en écoutant sur le port 7000 (juste pour le faire fonctionner). Enfin, nous pingons le conteneur de test par son nom et cela devrait fonctionner.

5
rogamba

EDIT 2018-02-17: Docker peut éventuellement supprimer la clé links de docker-compose, ils suggèrent donc d'utiliser réseaux définis par l'utilisateur comme indiqué ici => https : //docs.docker.com/compose/compose-file/#links


En supposant que vous souhaitez atteindre le conteneur mysql à partir du conteneur web de votre docker-compose.yml fichier, tel que:

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

Vous serez heureux de savoir que Docker Compose ajoute déjà un nom de domaine mysqlservice (dans le conteneur web/etc/hosts) qui pointent vers le conteneur mysql.

Au lieu de rechercher l'adresse IP du conteneur mysql, vous pouvez simplement utiliser le nom de domaine mysqlservice.

Si vous souhaitez ajouter des noms de domaine personnalisés, c'est également possible avec le paramètre extra_hosts .

4
Oliboy50

Vous voudrez peut-être essayer dnsdock. Semble simple et facile (!) À installer. Jetez un œil à http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/ et https://github.com/tonistiigi/ dnsdock .

3
Andreas Steffan

Si vous voulez une solution prête à l'emploi, vous pouvez vérifier 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 entre les services. Grâce à cela, chaque service/conteneur peut être atteint par service_name.kontena.local.

3
Lauri

J'ai changé le --net paramètre avec --network et s'exécute comme prévu:

docker network create <network name>
docker run --network <network name> --name <container name> <other container options>
docker run --network <network name> --name <container name> <other container options>
2
Oscar Llop