web-dev-qa-db-fra.com

Comment attribuer des noms de domaine aux conteneurs dans docker

Je lis beaucoup ces jours-ci sur la façon d'installer et d'exécuter une pile de docker. Mais l’une des choses qui me manque toujours, c’est la façon de configurer ces conteneurs particuliers qui répondent à l’accès via leur nom de domaine et pas seulement leur nom de conteneur en utilisant docker dns.

Ce que je veux dire, c’est-à-dire que j’ai un microservice accessible de l’extérieur, par exemple: utilisateurs.monentreprise.com, il sera transmis au conteneur de microservice qui gère l’API des utilisateurs.

Ensuite, lorsque j'essaie d'accéder à customer-list.mycompany.com, il se rend au conteneur microservice 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 vous voulez accéder de conteneur à conteneur, mais pas d'internet à conteneur.

Est-ce que quelqu'un sait comment je devrais faire ça? Ou la meilleure façon de le configurer.

13
Christopher Thomas

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 redirige users.mycompany.com vers myhost: 1337 (en supposant que vous avez publié votre port sur 1337)

Donc, si vous voulez faire cela, vous aurez besoin de 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, depuis votre hôte, courber votre hôte localhost: 5000 pour accéder au conteneur.

curl -X GET localhost:5000

Si vous souhaitez configurer un nom de domaine en amont, vous devez disposer d'une instance de serveur Web vous permettant de proxy_pass transférer votre nom d'hôte vers votre conteneur.

c'est-à-dire dans nginx:

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

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

17
MagicMicky

Pour autant que je sache, Docker ne fournit pas cette fonctionnalité prête à l'emploi. Mais il existe sûrement plusieurs solutions de contournement ici. En fait, vous devez déployer un DNS sur votre hôte qui distingue les conteneurs et résolve leurs noms de domaine dans des adresses IP dynamiques. Pour que vous puissiez essayer:

  1. Déployez certaines des solutions DNS compatibles 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 a pas connaissance);

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

Vous pouvez ignorer l'étape 2 et exécuter votre navigateur à l'intérieur du conteneur: il découvrira le conteneur d'applications Web par nom d'hôte.

1
K.Martin