Comment définir le nom d'hôte dans docker-compose?

120

Dans mon docker-compose.ymldossier, j'ai ce qui suit. Cependant, le conteneur ne récupère pas la valeur du nom d'hôte. Des idées?

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock

Lorsque je vérifie le nom d'hôte dans le conteneur, il ne répond pas affy.

David Medinets
la source
1
Quelle version de Compose utilisez-vous?
kojiro

Réponses:

4

À partir de la version 3 de docker-compose , vous pouvez simplement utiliser un hostnamechamp:

version: '3'
services:
  dns:
    hostname: 'your-name'
improbable
la source
57

Cela semble fonctionner correctement. Si je mets votre configuration dans un fichier:

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF

Et puis évoquez les choses:

$ docker-compose -f compose.yml up
Creating tmp_dns_1...
Attaching to tmp_dns_1
dns_1 | 2015-04-28T17:47:45.423387 [dockerdns] table.add tmp_dns_1.docker -> 172.17.0.5

Et puis vérifiez le nom d'hôte à l'intérieur du conteneur, tout semble aller bien:

$ docker exec -it stack_dns_1 hostname
affy.affy.com
larsks
la source
1
Quelle version de Compose utilisez-vous?
kojiro
Ce format ne fonctionne pas dans la dernière version de docker-compose. Les fichiers YML sont des choses difficiles; êtes-vous sûr que c'est le bon format pour DNS?
George Stocker
3
Les fichiers YML ne sont pas vraiment si difficiles. Que signifie «ne fonctionne pas»? Selon la documentation , les deux hostnameet domainnamesont des docker-compose.ymloptions valides . Mise à jour: juste testé, semble toujours fonctionner correctement (docker-compose version 1.4.2, docker version 1.8.2).
larsks
Existe-t-il un moyen d'exposer ce nom d'hôte en dehors de l'environnement docker? Ce serait bien si l'hôte pouvait accéder aux conteneurs du docker par leur nom DNS.
Paul Praet
1
C'est possible et vaut probablement sa propre question. Si vous recherchez "docker dns", vous trouverez plusieurs résultats pertinents; Jetez un œil à ce qui existe en premier.
larsks
53

J'ai trouvé que le nom d'hôte n'était pas visible pour les autres conteneurs lors de l'utilisation docker run. Cela s'avère être un problème connu (peut-être plus une fonctionnalité connue), une partie de la discussion étant:

Nous devrions probablement ajouter un avertissement à la documentation concernant l'utilisation du nom d'hôte. Je pense que c'est rarement utile.

La manière correcte d'attribuer un nom d'hôte - en termes de mise en réseau de conteneurs - est de définir un alias comme ceci:

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias2

Malheureusement, cela ne fonctionne toujours pas avec docker run. La solution de contournement consiste à attribuer un nom au conteneur:

docker-compose run --name alias1 some-service

Et alias1peut ensuite être envoyé par ping à partir des autres conteneurs.

MISE À JOUR: Comme le souligne @grilix, vous devez utiliser docker-compose run --use-aliasespour rendre disponibles les alias définis.

foz
la source
11
Je suis coincé avec ce problème que je ne peux pas accéder au conteneur par hosname à partir d'autres conteneurs. Et vous êtes le seul sur tout Internet à avoir déclaré ce problème.
Je cherche
7
Pareil ici! Il est insensé que des millions de développeurs semblent utiliser Docker, mais personne ne sait comment donner un nom simple à une boîte, pas même la documentation officielle. Merci beaucoup :)
Sliq
1
Juste au cas où, maintenant nous pouvons utiliser --use-aliasesavec docker-compose run. Cela évitera de coder en dur l'alias sur la runcommande
grilix
38

Basé sur la documentation de docker: https://docs.docker.com/compose/compose-file/#/command

J'ai simplement mis hostname: <string> dans mon fichier docker-compose.

Par exemple:

[...]

lb01:
  hostname: at-lb01
  image: at-client-base:v1

[...]

et le conteneur lb01 prend le at-lb01nom d'hôte.

Marcello Romani
la source
si vous avez plusieurs conteneurs dans le fichier docker-compose, définiriez-vous le nom d'hôte de chaque conteneur? cela semble très inefficace?
vgoklani
6
Si vous avez besoin de noms connus pour les conteneurs, c'est une solution viable.
Marcello Romani
9

Le moyen le plus simple que j'ai trouvé est de simplement définir le nom du conteneur dans la documentation docker-compose.ymlSee container_name . Il est applicable à docker-compose v1 +. Cela fonctionne de conteneur en conteneur, pas de la machine hôte au conteneur.

services:
  dns:
    image: phensley/docker-dns
    container_name: affy

Vous devriez maintenant pouvoir accéder à affypartir d'autres conteneurs en utilisant le nom du conteneur. Je devais le faire pour plusieurs serveurs redis dans un environnement de développement.

REMARQUE La solution fonctionne tant que vous n'avez pas besoin de mettre à l'échelle. Tels que des environnements de développement individuels cohérents.

KJ
la source
Dans Compose 3.7la seule façon dont je suis le nom d' hôte du service de base de données à voir à l' intérieur un autre conteneur de service de la même pile était de nommer le service comme le nom d' hôte. L'utilisation de la hostname:propriété a échoué. L'utilisation de l'environnement HOSTNAME = construct a également échoué.
Stephane
Une autre solution qui a également fonctionné consistait à utiliser la aliasespropriété comme décrit dans la fozsolution.
Stephane
1
Cela fonctionne très bien mais est un peu désordonné - j'ai maintenant pris le réglage container_nameet hostnamela même valeur pour obtenir ce dont j'ai besoin
Oliver Dungey
3

J'avais besoin de faire tourner le conteneur freeipa pour avoir un kdc fonctionnel et je devais lui donner un nom d'hôte sinon il ne fonctionnerait pas. Ce qui a finalement fonctionné pour moi, c'est de définir la HOSTNAMEvariable env dans compose:

version: 2
services:
  freeipa:
    environment:
      - HOSTNAME=ipa.example.test

Maintenant ça marche:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test
Roy Golan
la source
2
Pour moi, en utilisant slim, cela se traduit par une variable d'environnement HOSTNAME qui n'a aucun effet sur le nom d'hôte réel du conteneur
Oliver Dungey
2
Bien que cela ait fonctionné avec le conteneur que vous utilisiez, la directive d'environnement expose uniquement les variables au conteneur. C'est toujours au conteneur de faire quelque chose avec la valeur définie. Dans de nombreux cas, cela ne fera probablement rien.
MrJohnBBQ
exposer un env var n'a rien à voir avec le nom d'hôte du conteneur, ce sont deux royaumes distincts.
Marcello Romani le