web-dev-qa-db-fra.com

Noms d'hôte locaux pour les conteneurs Docker

Question Docker débutant ici,

J'ai donc un environnement de développement dans lequel j'exécute une application modulaire. Il utilise Docker Compose pour exécuter 3 conteneurs: serveur, client, base de données.

Le docker-compose.yml ressemble à ceci:

#############################
# Server
#############################
server:
  container_name: server
  domainname: server.dev
  hostname: server
  build: ./server
  working_dir: /app
  ports:
    - "3000:3000"
  volumes:
    - ./server:/app
  links:
    - database

#############################
# Client
#############################
client:
  container_name: client
  domainname: client.dev
  hostname: client
  image: php:5.6-Apache
  ports:
     - "80:80"
  volumes:
   - ./client:/var/www/html

#############################
# Database
#############################
database:
  container_name: database
  domainname: database.dev
  hostname: database
  image: postgres:9.4
  restart: always
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=root
    - POSTGRES_DB=dbdev
    - PG_TRUST_LOCALNET=true
  ports:
    - "5432:5432"
  volumes:
    - ./database/scripts:/docker-entrypoint-initdb.d # init scripts

Vous pouvez voir que j’assigne un nom de domaine .dev à chacun d’entre eux. Cela fonctionne bien pour voir un ordinateur d’un autre ordinateur (réseau interne de Docker). Par exemple, je lance un ping server.dev à partir de la CLI de client.dev:

    root@client:/var/www/html# ping server.dev
    PING server.dev (127.0.53.53): 56 data bytes
    64 bytes from 127.0.53.53: icmp_seq=0 ttl=64 time=0.036 ms

Cela fonctionne très bien en interne, mais pas sur le réseau de mon système d'exploitation hôte.

Par souci de commodité, j'aimerais attribuer des domaines à MY network, pas au réseau de conteneurs Docker, afin de pouvoir par exemple taper: client.dev sur l'URL de mon navigateur et charger le conteneur Docker.

Pour le moment, je ne peux y accéder que si j'utilise l'IP Docker, qui est dynamique:

client: 192.168.99.100:80
server: 192.168.99.100:3000
database: 192.168.99.100:5432

Existe-t-il un moyen automatisé/pratique de le faire qui ne nécessite pas l’ajout manuel de l’adresse IP à mon fichier/etc/hosts?

BTW je suis sur OSX si cela a une pertinence.

Merci!

Edit: J'ai trouvé ce problème avec Github qui semble être lié: https://github.com/docker/docker/issues/2335

D'après ce que j'ai compris, ils semblent dire que c'est quelque chose qui n'est pas disponible en dehors de la boîte et ils suggèrent des outils externes comme: 

Est-ce exact? Et si oui, lequel devrais-je choisir dans mon scénario particulier?

30
Edu Wass

D'ACCORD,

donc, comme il semble qu'il n'y ait aucun moyen natif de faire cela avec Docker , j'ai finalement opté pour cette solution alternative de Ryan Armstrong, qui consiste à mettre à jour dynamiquement le fichier /etc/hosts.

J'ai choisi cette option car cela me convenait, car cela fonctionne comme un script et comme j'avais déjà un script de démarrage, je pouvais simplement y ajouter cette fonction.

L'exemple suivant crée une entrée d'hôtes nommée docker.local qui résoudra sur votre IP docker-machine:

update-docker-Host(){
    # clear existing docker.local entry from /etc/hosts
    Sudo sed -i '' '/[[:space:]]docker\.local$/d' /etc/hosts

    # get ip of running machine
    export DOCKER_IP="$(echo ${DOCKER_Host} | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"

    # update /etc/hosts with docker machine ip
    [[ -n $DOCKER_IP ]] && Sudo /bin/bash -c "echo \"${DOCKER_IP}   docker.local\" >> /etc/hosts"
}

update-docker-Host

Cela va automatiquement ajouter ou modifier la ligne /etc/hosts sur mon système d'exploitation hôte lorsque je démarre la machine Docker via mon script de démarrage.

Quoi qu'il en soit, comme je l'ai découvert au cours de mes recherches, en plus de la modification du fichier hosts, vous pouvez également résoudre ce problème en configurant un serveur DNS personnalisé :

J'ai également trouvé plusieurs projets sur Github qui visaient apparemment à résoudre ce problème, bien que je ne les aie pas essayés:

19
Edu Wass

En prolongeant la réponse de @ eduwass, voici ce que j'ai fait manuellement (sans script).

  1. Comme indiqué dans la question, définissez le domainname: myapp.dev et le hostname: www dans le fichier docker-compose.yml.
  2. Amenez vos conteneurs Docker comme d'habitude
  3. Exécutez docker-compose exec client cat /etc/hosts pour obtenir une sortie du fichier hosts du conteneur (où client est le nom de votre service) (Exemple de sortie: 172.18.0.6 www.myapp.dev)
  4. Ouvrez votre fichier /etc/hosts local (ordinateur hôte) et ajoutez cette ligne: 172.18.0.6 server.server.dev

Si votre conteneur de services Docker change d'adresse IP ou fait quelque chose d'extraordinaire, vous voudrez une solution plus complexe, mais cela fonctionne pour mes besoins simples pour le moment.

7
thaddeusmt

Pour créer un domaine entier pour localhost, vous pouvez utiliser dnsmasq . Dans ce cas, si vous avez choisi le domaine .dev, tout sous-domaine pointe vers votre conteneur. Mais vous devez savoir sur problèmes avec la zone .dev 

Ou vous pouvez utiliser le script bash pour lancer votre composition docker qui, au démarrage, ajoutera une ligne à/etc/hosts et, une fois ce processus arrêté, cette ligne sera supprimée.

#!/usr/bin/env bash

Sudo sed -i '1s;^;127.0.0.1    example.dev\n;' /etc/hosts

trap 'Sudo sed -i "/example.dev/d" /etc/hosts' 2

docker-compose up
0
anydasa