60 votes

Comment attribuer des noms de domaine aux conteneurs dans docker

Je lis beaucoup ces jours-ci sur la façon de configurer et de faire fonctionner une pile Docker. Mais l'une des choses qui m'échappent toujours est la façon de configurer les conteneurs particuliers pour qu'ils répondent à l'accès par leur nom de domaine et pas seulement par leur nom de conteneur en utilisant docker dns.

Ce que je veux dire, c'est que si j'ai un microservice qui est accessible de l'extérieur, par exemple : users.mycompany.com, il passera par le conteneur de microservice qui gère l'API des utilisateurs.

Ensuite, lorsque j'essaierai d'accéder à la liste de clients de mon entreprise, l'accès se fera au conteneur de microservices qui gère les listes de clients.

Bien sûr, en utilisant docker dns, je peux y accéder et les relier à un réseau docker, mais cela ne fonctionne vraiment que si l'on veut accéder de conteneur à conteneur, mais pas d'internet à conteneur.

Quelqu'un sait-il comment je dois m'y prendre ? Ou la meilleure façon de le faire.

65voto

MagicMicky Points 2349

Vous devez donc utiliser le concept de publication de port, afin qu'un port de votre conteneur soit accessible via un port de votre hôte. En utilisant cela, vous pouvez configurer un simple proxy_pass à partir d'un nginx qui redirigera users.mycompany.com vers myhost:1337 ( en supposant que vous avez publié votre port à 1337 )

Donc, si vous voulez faire cela, vous devrez configurer votre conteneur pour exposer un certain port en utilisant :

docker run -d -p 5000:5000 training/webapp # publish image port 5000 to host port 5000

Vous pouvez ensuite, à partir de votre hôte, curl votre localhost:5000 pour accéder au conteneur.

curl -X GET localhost:5000

Si vous souhaitez configurer un nom de domaine en amont, vous devrez disposer d'une instance de serveur web qui vous permette de proxy_pass votre nom d'hôte à votre conteneur.

c'est-à-dire dans nginx :

server {
  listen 80;
  server_name users.mycompany.com;
  location / {
    proxy_pass http://localhost:5000;
  }
}

Je vous conseille de suivre ce tutoriel et peut-être vérifier le référence d'exécution du docker

5voto

K.Martin Points 31

Pour autant que je sache, Docker ne fournit pas cette fonctionnalité d'emblée. Mais il existe sûrement plusieurs solutions de contournement. En fait, vous devez déployer un DNS sur votre hôte qui distinguera les conteneurs et résoudra leurs noms de domaine en IP dynamiques. Vous pouvez donc essayer de le faire :

  1. Déployez une solution DNS compatible avec Docker (je vous suggère d'utiliser SkyDNSv1/SkyDock) ;

  2. Configurez votre hôte pour qu'il fonctionne avec ce DNS (par défaut, SkyDNS fait en sorte que les conteneurs se connaissent par leur nom, mais l'hôte n'en est pas conscient) ;

  3. Exécutez vos conteneurs avec un --hostname explicite (vous utiliserez probablement le schéma nom_conteneur.nom_image.dev.skydns.local)

Vous pouvez sauter l'étape 2 et lancer votre navigateur à l'intérieur du conteneur également : il découvrira le conteneur d'application web par le nom d'hôte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X