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?
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:
En prolongeant la réponse de @ eduwass, voici ce que j'ai fait manuellement (sans script).
domainname: myapp.dev
et le hostname: www
dans le fichier docker-compose.yml
.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
)/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.
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