Si tenemos varios contenedores docker arrancados en nuestro ordenador. Muchas veces, nos interesará conectar con servicios corriendo dentro de cada uno de ellos. Algunos estarán lanzados simplemente con docker, otros con docker-compose, cada uno trabajando en un sistema distinto, y necesitamos una forma más o menos sencilla de acceder a cada uno de ellos.
Con un pequeño script podemos recorrer todos los contenedores, pedir la dirección IP de cada uno de ellos y añadirlas al nuestro archivo /etc/hosts de forma que este archivo se actualice automáticamente cada vez que lanzamos el comando.
Tabla de contenidos
El script
Yo lo suelo llamar docker_update_hosts.sh, y suele estar en /usr/local/bin. En realidad, es un enlace el que está ahí:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash function panic() { echo "$@" >&2 exit 1 } if [ "`whoami`" != "root" ] then panic "This program must be ran as root" fi # Clear /etc/hosts file HEADER="# Added automatically by docker_update_hosts" sed -i '/docker\.local$/d' /etc/hosts sed -i "/$HEADER\$/d" /etc/hosts # Remove empty lines at the end of file sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' /etc/hosts echo -e "\n$HEADER" >> /etc/hosts IFS=$'\n' && ALLHOSTS=($( docker ps --format '{{.ID}} {{.Names}}')) for line in ${ALLHOSTS[*]}; do IFS=" " read -r ID NAME <<< "$line" IP="$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ID)" if [ -n "$IP" ]; then echo -e "$IP\t$NAME.docker.local" >> /etc/hosts fi done |
El script debe ser ejecutado como root, porque tiene que tener permiso para escribir en /etc/hosts. Para ello, en muchas distribuciones lo podremos ejecutar así:
Hosts
El script creará varios hosts llamados [contenedor].docker.local donde contenedor es el nombre de cada uno de nuestros contenedores. Al final, nos podremos juntar con algo como:
172.17.0.8 myphp5.6-fpm.docker.local
172.17.0.7 mongodb-testing.docker.local
172.17.0.6 wp-plugin-test.docker.local
172.17.0.5 myphp7.2-fpm.docker.local
172.17.0.4 mariadb-proyectos.docker.local
172.17.0.3 mariadb-testing.docker.local
172.17.0.2 redis.docker.local
De esta forma, podremos utilizar el nombre que le hemos dado en docker junto con «.docker.local» para referirnos al contenedor y llamar a un servicio encerrado en el mismo. Por ejemplo, para conectar con la base de datos mariadb-proyectos.docker.local podemos, desde el mismo ordenador host:
Precauciones
Ya que el script está editando el archivo /etc/hosts y ese mismo fichero puede ser editable por nosotros, el script escribe un comentario:
1 | # Added automatically by docker_update_hosts |
Y debajo se escriben todos los hosts e IPs de contenedores docker que encontremos. Automáticamente, nada más ejecutar el script se busca el comentario y se buscan todos los hosts que terminen en .docker.local, por lo que si tenemos otras cosas que terminen en .docker.local serán eliminadas cuando se ejecute el script.
No tenemos que tener especial cuidado cuando editemos el fichero /etc/hosts manualmente. Podremos meter hosts nuevos al final, o encima de los hosts introducidos por el script y se respetarán.
Ejecutar automáticamente
Dependiendo de nuestra forma de trabajar, podemos ejecutar el script a mano siempre que sea necesario, ejecutarlo dentro de un script para lanzar contenedores o podemos ejecutarlo en un cron cada 10 minutos, por ejemplo.
Foto principal: Sherzod Max
Excelente iniciativa! Hice un par de modificaciones porque el script no funcionaba en Mac OS
#!/bin/bash
function panic()
{
echo «$@» >&2
exit 1
}
if [ «`whoami`» != «root» ]
then
panic «This program must be ran as root»
fi
# Clear /etc/hosts file
HEADER=»# Added automatically by docker_update_hosts»
sed -i » ‘/docker\.local$/d’ /etc/hosts
sed -i » «/$HEADER\$/d» /etc/hosts
# Remove empty lines at the end of file
sed -i » -e :a -e ‘/^\n*$/{$d;N;ba’ -e ‘}’ /etc/hosts
echo -e «\n$HEADER» >> /etc/hosts
IFS=$’\n’ && ALLHOSTS=($( docker ps –format ‘{{.ID}} {{.Names}}’))
for line in ${ALLHOSTS[*]}; do
IFS=» » read -r ID NAME <<> /etc/hosts
fi
done
Hola Matías !
Creo que falta un trozo de código al final. Por favor, pásamelo desde el formulario de contacto, github, o pastebin por favor.
Gracias por tu comentario.
Each of the proposed options will work in a different system, and we need a more or less easy way to access each of them.
Everyone will be happy to know this. This new version has left a deep impression on many people, so if you also feel relaxed, it will be a great advantage for you.메이저사이트
2048 is a simple and entertaining puzzle game that everyone can appreciate.
Thank you for your tutorial for updating more efficiently.
Everyone will be happy to know this! Crypto Pump and Dump Groups
Crypto Pump and Dump Groups
I think your site might be having browser compatibility issues. When I look at your website in Safari, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, terrific blog!ufabet168 vip
Thanks for the updates and the post https://www.speechtherapyconsultants.com/adults
It’s actually a nice and helpful piece of info. I’m happy that you shared this helpful information with us. Please stay us up to date like this.Thank’s for sharing.
Here is My Homepage: live casino games