Al crear contenedores docker con un archivo docker-compose que especifica el nombre de host ( hostname:
) y las direcciones IP ( ipv4_address:
), me gustaría que la computadora local (la computadora que ejecuta el servicio docker daemon, también conocida como mi computadora portátil) pueda resolver esos nombres de host, sin la necesidad de (demasiada) intervención manual. Es decir, si el contenedor es un servicio de servidor web con el nombre de host my_webserver
, me gustaría que my_werbserver
resuelva en la dirección IP que asigné a ese contenedor.
¿Cuál es la mejor manera de lograr eso? ¿Algo mejor que mantener /etc/hosts en mi computadora portátil manualmente?
Como mencionó @Kārlis Ābele, no creo que puedas hacer lo que necesitas sin servicios adicionales. Una solución sería ejecutar dnsmasq en un contenedor docker en la misma red que los otros contenedores docker. Consulte Hacer que el servidor DNS interno esté disponible desde el host
docker run -d --name dns -p 53:53 -p 53:53/udp --network docker_network andyshinn/dnsmasq:2.76 -k -d
Comprueba que funciona usando localhost
como DNS
nslookup bar localhost
Opcionalmente, configure localhost
como servidor DNS. En Ubutu 18.04, por ejemplo, edite /etc/resolvconf/resolv.conf.d/head
.
nameserver localhost
Reinicie el servicio resolvconf
.
sudo service resolvconf restart
Ahora debería poder hacer ping a los contenedores por nombre.
EDITADO: una solución alternativa (basada en la respuesta de @Kārlis Ābele) es escuchar los eventos de la ventana acoplable y actualizar /etc/hosts
. Una implementación básica:
#!/usr/bin/env bash while IFS= read -r line; do container_id=$(echo ${line}| sed -En 's/.*create (.*) \(.*$/\1 /p') container_name=$(echo ${line}| sed -En 's/.*name=(.*)\)$/\1 /p') ip_addr=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${container_id}) echo ${ip_addr} ${container_name} >> /etc/hosts done < <(docker events --filter 'event=create')
Bueno, parece algo que no sería posible sin algún servicio personalizado que escuche eventos en el demonio Docker...
Cómo haría esto es escribir un servicio simple que escuche los eventos de Docker ( https://docs.docker.com/engine/reference/commandline/events/ ) y actualice el archivo /etc/hosts en consecuencia.
Aparte de eso, sin actualizar manualmente el archivo de hosts, no creo que haya otras opciones.