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:
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).
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 .