web-dev-qa-db-fra.com

Conteneur Docker-compose utilisant un serveur DNS hôte

J'exécute plusieurs conteneurs sur mon "serveur Ubuntu 16.10" dans un réseau de pont "personnalisé" avec compose 2.9 (dans une version yml 2.1). La plupart de mes conteneurs utilisent en interne les mêmes ports, il n'y a donc aucun moyen pour moi d'utiliser le pilote réseau "Host". Mes conteneurs sont tous des liens ensemble, en utilisant l'attribut dédié links.

Mais, j'ai également besoin d'accéder à des services exposés à l'extérieur de mes conteneurs. Ces services ont une URL dédiée avec des noms enregistrés sur le serveur DNS de mon entreprise. Bien que je n'aie aucun problème à utiliser le DNS public et à accéder à n'importe quel service public depuis mes conteneurs, je ne peux tout simplement pas accéder à mon DNS privé.

Connaissez-vous une solution de travail pour utiliser le DNS privé à partir d'un conteneur? Ou encore mieux, utiliser la configuration DNS du réseau de l'hôte?

PS: Bien sûr, je peux créer un lien vers les services de mon entreprise en utilisant l'attribut extra_hosts Dans mes services dans mon fichier docker-compose.yml. Mais ... ce n'est définitivement pas l'objectif d'avoir un DNS. Je ne veux pas enregistrer tous mes services dans mon fichier YML, et je ne veux pas le mettre à jour à chaque fois que l'IP des services est mis à jour dans mon entreprise.

Contexte:

  • Hôte: serveur Ubuntu 16.10
  • Docker Engine: 1.12.6
  • Docker Compose: 1.9.0
  • docker-compose.yml: 2.1
  • Réseau: propre pont.

fichier docker-compose.yml (extrait):

version: '2.1'
  services:
    nexus:
    image: sonatype/nexus3:$NEXUS_VERSION
    container_name: nexus
    restart: always
    hostname: nexus.$URL
    ports:
      - "$NEXUS_81:8081"
      - "$NEXUS_443:8443"
    extra_hosts:
      - "repos.private.network:192.168.200.200"
    dns:
      - 192.168.3.7
      - 192.168.111.1
      - 192.168.10.5
      - 192.168.10.15
    volumes_from:
      - nexus-data
    networks:
      - pic

  networks:
    pic:
      driver: bridge
      ipam:
        driver: default
        config:
          - subnet: 172.18.0.0/16
            gateway: 172.18.0.1

J'ai essayé avec et sans la configuration ipam pour le réseau pic, sans aucune chance.

Tests et résultats:docker exec -ti nexus curl repos.private.network Renvoie correctement la page HTML desservie par ce service

docker exec -ti nexus curl another-service.private.network Renvoie curl: (6) Could not resolve Host: another-service.private.network; Name or service not known Alors que curl another-service.private.network De l'hôte renvoie la page HTML appropriée.

Et "bien sûr" another-service.private.network Est connu dans mes 4 serveurs DNS (192.168.3.7, 192.168.111.1, 192.168.10.5, 192.168.10.15).

14
Olivier

Vous ne spécifiez pas quel environnement vous utilisez docker-compose, par exemple Mac, Windows ou Unix, donc cela dépendra un peu des changements nécessaires. Vous ne spécifiez pas non plus si vous utilisez le réseau de pont par défaut dans docker sur un réseau de pont créé par l'utilisateur.

Dans les deux cas, par défaut, Docker doit essayer de mapper la résolution DNS de l'hôte Docker dans vos conteneurs. Donc, si votre hôte Docker peut résoudre les adresses DNS privées, en théorie, vos conteneurs devraient également pouvoir le faire.

Je recommanderais de lire cette documentation officielle Docker DNS car elle est assez raisonnable. ici pour le réseau de pont Docker par défaut, ici pour les réseaux de pont créés par l'utilisateur.

Un léger problème est que si vous utilisez Docker pour Mac, Docker Machine ou Docker pour Windows, vous devez vous rappeler que votre hôte Docker est en fait le VM fonctionnant sur votre machine et non la boîte physique) lui-même, vous devez donc vous assurer que VM a les bonnes options de résolution DNS définies. Vous devrez redémarrer vos conteneurs pour que les modifications de la résolution DNS soient prises en compte par eux.

Vous pouvez bien sûr remplacer tous les paramètres par défaut à l'aide de docker-compose. Il dispose de toutes les options pour définir explicitement les serveurs DNS, les options de recherche DNS, etc. À titre d'exemple:

version: 2
services:
 application:
  dns:
   - 8.8.8.8
   - 4.4.4.4
   - 192.168.9.45

Vous trouverez la documentation de ces fonctionnalités ici .

19
Rob Blake