L'accès conteneur docker à partir de l'hôte à l'aide de conteneurs nom
Je suis en train d'élaborer un service et il n'y docker composer de spin des services comme postgresql, redis, elasticsearch. J'ai une application web qui est basé sur au système rubyonrails et les écritures et les lectures de tous ces services.
Voici mon docker-compose.yml
version: '2'
services:
redis:
image: redis:2.8
networks:
- frontapp
elasticsearch:
image: elasticsearch:2.2
networks:
- frontapp
postgres:
image: postgres:9.5
environment:
POSTGRES_USER: elephant
POSTGRES_PASSWORD: smarty_pants
POSTGRES_DB: elephant
volumes:
- /var/lib/postgresql/data
networks:
- frontapp
networks:
frontapp:
driver: bridge
Et je peux faire un ping conteneurs à l'intérieur de ce réseau
$ docker-compose run redis /bin/bash
root@777501e06c03:/data# ping postgres
PING postgres (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: icmp_seq=0 ttl=64 time=0.346 ms
64 bytes from 172.20.0.2: icmp_seq=1 ttl=64 time=0.047 ms
...
So far So good. Maintenant je veux l'exécuter en ruby on rails application sur mon ordinateur hôte, mais être en mesure d'accéder à postgres exemple avec l'url comme postgresql://username:password@postgres/database
actuellement ce n'est pas possible
$ ping postgres
ping: unknown host postgres
Je vois mon réseau dans le panneau
$ docker network ls
NETWORK ID NAME DRIVER
ac394b85ce09 bridge bridge
0189d7e86b33 elephant_default bridge
7e00c70bde3b elephant_frontapp bridge
a648554a72fa host host
4ad9f0f41b36 none null
Et je peux voir une interface
$ ifconfig
br-0189d7e86b33 Link encap:Ethernet HWaddr 02:42:76:72:bb:c2
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:76ff:fe72:bbc2/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:36 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2000 (2.0 KB) TX bytes:8792 (8.7 KB)
br-7e00c70bde3b Link encap:Ethernet HWaddr 02:42:e7:d1:fe:29
inet addr:172.20.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:e7ff:fed1:fe29/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1584 errors:0 dropped:0 overruns:0 frame:0
TX packets:1597 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:407137 (407.1 KB) TX bytes:292299 (292.2 KB)
...
Mais je ne suis pas sûr que dois-je faire ensuite. J'ai essayé de jouer un peu avec /etc/resolv.conf
, principalement avec nameserver
la directive, mais qui n'avait aucun effet.
Je vous serais reconnaissant de toute aide de suggestions sur la manière de configurer cette installation correctement.
Mise à JOUR
Après la navigation au travers des ressources Internet, j'ai réussi à attribuer des adresses IP statiques pour les boîtes. Pour l'instant c'est assez pour moi de continuer le développement. Ici est mon docker-compose.yml
version: '2'
services:
redis:
image: redis:2.8
networks:
frontapp:
ipv4_address: 172.25.0.11
elasticsearch:
image: elasticsearch:2.2
networks:
frontapp:
ipv4_address: 172.25.0.12
postgres:
image: postgres:9.5
environment:
POSTGRES_USER: elephant
POSTGRES_PASSWORD: smarty_pants
POSTGRES_DB: elephant
volumes:
- /var/lib/postgresql/data
networks:
frontapp:
ipv4_address: 172.25.0.10
networks:
frontapp:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.25.0.0/16
gateway: 172.25.0.1
Vous devez vous connecter pour publier un commentaire.
Il y est une application opensource qui permet de résoudre ce problème, il est appelé Serveur Proxy DNS, voici quelques exemples de dépôt officiel
C'est un serveur DNS qui permet de résoudre les noms d'hôtes des conteneurs, si elle ne pouvait pas trouver un nom d'hôte qui correspond alors résoudre à partir de l'internet ainsi
Démarrez le Serveur DNS
Il sera automatiquement comme votre DNS par défaut (et de récupérer de l'original quand il s'arrête)
La création de certains conteneurs de test
vérification de docker-composition de fichier
de départ des conteneurs
La résolution de conteneurs
à partir de l'hôte
à partir d'un autre conteneur
Ainsi il permet de résoudre des noms d'hôtes internet
resolv.conf
fichier n'est pas utilisé pour la résolution DNS malheureusement.Il y a deux solutions (à l'exception de
/etc/hosts
) décrit ici et iciJ'ai écrit ma propre solution en Python et mis en œuvre en tant que service de cartographie de la boite nom d'hôte à partir de son IP. Ici, il est: https://github.com/nicolai-budico/dockerhosts
Il lance dnsmasq avec le paramètre
--hostsdir=/var/run/docker-hosts
et les mises à jour de fichier/var/run/docker-hosts/hosts
chaque fois qu'une liste de course conteneurs a été changé.Une fois le fichier
/var/run/docker-hosts/hosts
est changé, dnsmasq automatiquement les mises à jour de sa cartographie et de conteneurs deviennent disponibles par nom d'hôte dans un second.Il y a d'installer et de désinstaller des scripts. Seulement vous avez besoin est de permettre à votre système d'interagir avec cette dnsmasq instance. Je me suis inscrit dans systemd-résolu:
Si vous n'utilisez vous docker-composer le programme d'installation en local, vous pouvez mapper les ports de vos contenants à votre hôte avec
Puis utilisez localhost:9300 (ou 9200 selon protocole) à partir de votre web app pour accéder à Elasticsearch.
Plus en plus complexes, la solution est de lancer votre propre serveur dns qui permettent de résoudre contenant les noms. Je pense que cette solution est beaucoup plus proche de ce que vous me demandez. J'ai previsously utilisé skydns lors de l'exécution de kubernetes localement.
Il y a quelques options là-bas. Jetez un oeil à https://github.com/gliderlabs/registrator et https://github.com/jderusse/docker-dns-gen. Je n'ai pas essayer, mais vous pourriez potentiellement carte le port dns à votre hôte de la même façon qu'avec l'élastique ports dans l'exemple précédent, puis ajouter localhost pour votre resolv.conf pour être en mesure de résoudre votre conteneur des noms à partir de votre hôte.
nom d'hôte de l'docker conteneur ne peut pas être vu de l'extérieur. Ce que vous pouvez faire est d'attribuer un nom de conteneur et de l'accès du conteneur par le nom. Si vous link 2 conteneurs dire container1 et container2 puis docker prend soin de l'écriture de l'adresse IP et le nom d'hôte de container2 dans le container1. Cependant, dans votre cas, votre dossier est en cours d'exécution dans le hostmachine.
OU
Vous connaissez l'adresse IP du conteneur. Donc dans votre machine hôte /etc/hosts, vous pouvez ajouter $IP, $hostanameof conteneur
Aditya est correct. Dans votre cas, le plus simple est de coder en dur le nom d'hôte /IP cartographique dans
/etc/hosts
Le problème avec cette approche, cependant, est que vous ne contrôlez pas l'adresse IP privée de votre postgres ordinateur. Adresse IP change à chaque fois que vous démarrez un nouveau conteneur, et si vous devez mettre à jour votre fichier /etc/hosts.
Si c'est un problème, je vous recommande de lire cet article de blog qui explique comment appliquer un conteneur obtenir une adresse IP spécifique:
https://xand.es/2016/05/09/docker-with-known-ip/