Trucos para usar contenedores docker

Trucos para usar contenedores docker y hacerte la vida más fácil

El pasado 31 de agosto tuvo lugar el Docker Meetup #42 en el que se explicaron ejemplos de como usar las novedades de la versión 1.12. Además de hablar de la nueva integración de Docker y swarm que ya comentamos en el post referente a este asunto o sobre los nuevos tipos de redes que se pueden usar con Docker.

Aunque todo eso es muy útil, en este mismo Meetup se dieron una serie de pequeños trucos para hacer más fácil el uso del cli de Docker.

El primer tip es muy simple. Cuando listamos las imágenes locales que tenemos en nuestro equipo usamos:

>_ docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
lojzik/letsencrypt                    latest              8e17fad1541c        10 days ago         447 MB
phpmyadmin/phpmyadmin                 latest              62f0b14257d3        4 weeks ago         57.03 MB
debian                                latest              1b01529cc499        5 weeks ago         125.1 MB
hub.dondocker.com/canonale/ienda      latest              b390c6676ebd        3 months ago        1.113 MB
tvial/docker-mailserver               latest              151aa7b573b9        3 months ago        380.9 MB
python                                latest              67b5207e5d3b        4 months ago        671.1 MB
hub.dondocker.com/dondocker/redis     latest              9ee2e2d136af        4 months ago        15.95 MB
hub.dondocker.com/canonale/xxxxx      latest              47bcc53f74dc        5 months ago        1.113 MB
redis                                 alpine              50405530a7e5        6 months ago        15.95 MB
dondocker/back-end-python3-dev        0.0                 977594ac7bed        7 months ago        787.9 MB
dondocker/back-end-python3-dev        latest              977594ac7bed        7 months ago        787.9 MB
dondocker/back-end-python2-dev        0.0                 86cfce7d6716        7 months ago        772.9 MB
dondocker/back-end-python2-dev        latest              86cfce7d6716        7 months ago        772.9 MB

Nos lista la imágenes descargadas, pero normalmente, cuando construimos imágenes o cuando hacemos actualizaciones (docker pull imagen) van quedando capas sueltas que no salen en este listado y que nos pueden ocupar mucho espacio en algunas ocasiones. Si usamos el modificador --all veremos todas
esas imágenes:

>_ docker images --all
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
ghost                                 latest              dd4e3a04f0f3        11 weeks ago        376.9 MB
ubuntu                                14.04               8f1bd21bd25c        3 months ago        188 MB
mysql                                 latest              2fd136002c22        3 months ago        378.4 MB
<none>                                <none>              091e85bf81ef        3 months ago        1.113 MB
<none>                                <none>              133e51bae8d8        3 months ago        1.113 MB
tvial/docker-mailserver               latest              151aa7b573b9        3 months ago        380.9 MB
<none>                                <none>              3f5eb0656a63        4 months ago        671.1 MB
<none>                                <none>              84ab119c9ef0        4 months ago        15.95 MB
...
hub.dondocker.com/dondocker/redis     latest              9ee2e2d136af        4 months ago        15.95 MB
<none>                                <none>              358bc2a8a021        4 months ago        15.95 MB
<none>                                <none>              783dd5eaea02        4 months ago        15.95 MB
<none>                                <none>              7d4372227f67        5 months ago        607.6 MB
...
dondocker/back-end-python3-dev        0.0                 977594ac7bed        7 months ago        787.9 MB
dondocker/back-end-python3-dev        latest              977594ac7bed        7 months ago        787.9 MB

Otro sencillo truco es que para hacer una inspección de un contenedor no es necesario poner su ID entero o su nombre, por ejemplo:

>_ docker ps
434499296d86        jwilder/nginx-proxy:latest   "/app/docker-entrypoi"   04web_nginxproxy_1
06af52e60ee7        busybox                      "/bin/true"              ghost_data
>_ docker inspect 43
[
    {
        "Id": "434499296d86342b0092b7716270593391363703bf73f435a3bf4d5f24b65e60",
        "Created": "2016-08-24T14:56:42.498154511Z",
        "Path": "/app/docker-entrypoint.sh",
        ....

Alguna vez has visto todos los volumenes que tienes creados en tu equipo. Usando el comando docker volume ls nos devolverá un listado casi interminable con unos ID típicos que no se sabe a que corresponde:

>_ docker volume ls
DRIVER              VOLUME NAME
local               00116672bd5eda338a6e1cbb286937f4e9977d3bef6210faba9271607e3ff535
local               00722535c190913053a117545461bfdb23c039b9c75a6a3c2ee5bb60459bd8b2
local               00a32b51f1430f95a71e81ca4296f8ff1b02fa50582be721077780b93a802a3b
local               00c88ce80bbb6797d034e4819ca4b8af8f8975922092870980790124cc7e79ed
local               00c9cc18f5c19d17731e1b400f2a0d6f1dea45b99fe7aa4542eef4f4953e100d
...
local               ffe447104ac758ba81de36289a9602e8a0e147ad057cf2b83cec33119ec6d80e

Si quieres que estos volumenes tengan nombres que luego sepas para que se están usando el truco es el siguiente, al crear un contenedor etiqueta el volumen de esta manera:

>_ docker run --rm -v mysqldemo:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=22222 mysql:latest 
...
>_ docker volume ls
local               00116672bd5eda338a6e1cbb286937f4e9977d3bef6210faba9271607e3ff535
local               00722535c190913053a117545461bfdb23c039b9c75a6a3c2ee5bb60459bd8b2
local               00a32b51f1430f95a71e81ca4296f8ff1b02fa50582be721077780b93a802a3b
local               00c88ce80bbb6797d034e4819ca4b8af8f8975922092870980790124cc7e79ed
local               00c9cc18f5c19d17731e1b400f2a0d6f1dea45b99fe7aa4542eef4f4953e100d
...
local               ffe447104ac758ba81de36289a9602e8a0e147ad057cf2b83cec33119ec6d80e
local               mysqldemo

Así tendremos identificado el volumen en todo momento. Y si lo tienes que eliminar lo tendrás bastante más facil:

>_ docker volume rm mysqldemo

Una de las recomendaciones que se dan, dado el grado de facilidad de uso, es la elección de imágenes de tipo onbuild para desarrollo. Usar imágenes como node:onbuild resulta sencillo para probar o ejecutar nuestra aplicación en desarrollo. En es caso concreto de node tendríamos:

>_ ls -l
total 64K
drwxrwxr-x 44 nobody nobody 4,0K mar 16 20:26 bower_components
-rw-rw-r--  1 nobody nobody 1,8K mar 22 18:06 bower.json
drwxrwxr-x  2 nobody nobody 4,0K dic  8  2015 gulp
-rw-rw-r--  1 nobody nobody  232 dic  8  2015 gulpfile.js
-rw-rw-r--  1 nobody nobody 1,5K dic  8  2015 package.json
drwxrwxr-x  4 nobody nobody 4,0K jun 15 20:36 src
>_ docker run --rm -p 8080:8080 node:onbuild
.....

La nueva versión de docker-compose dispone de opciones tanto para crear servicios como para gestionar su red. Si queremos eliminar todos lo creado por el docker-compose, redes y contenedore, usaremos el modificador down:

>_ docker-compose down
Removing myapp_1 ... done
Removing mysql_1 ... done
Removing network mynetwork

La opción down tiene un modificador que permite limpiar del todo lo que genera el compose con la siguiente orden:

>_ docker-compose down -v --rmi local

Esta orden borra también los volúmenes creados y las imágenes que no tienen etiqueta. Con el modificador --rmi all borraríamos todas las que usamos.

Alias que te facilitarán la vida.

En este aspecto, en el último Meetup se explicaron unos cuantos alias para usar con la consola y así escribir menos y más rápido. Seguramente ya uses más de uno de estos ejemplos o muy similares pero siempre es útil tenerlos todos juntos.

Eliminar todos los contenedores de la máquina

>_ alias drma='docker rm $(docker ps -aq)'

Eliminar todas las imágenes sin etiquetar que suelen crearse cuando falla una creación

>_ alias drmi='docker rmi $(docker images -q -f "dangling=true")'

Eliminar todas las imágenes

>_ alias drmai='docker rmi $(docker images -q)'

Ejecutar un comando en una máquina

>_ alias drit='docker exec -ti'
>_ drit debian bash

Algunas de las salidas de los comandos pueden ser formateadas utilizando plantillas Go es el caso de los comando ps e images. Esto es útil porque algunas veces al listar, por ejemplo, los contenedores en funcionamiento se llena la pantalla y no vemos las cosas claras. Es por ello que unos alias adecuados nos darán solo la información adecuada y concisa.

Listado de imágenes, datos básicos

>_ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID            REPOSITORY                            TAG
8e17fad1541c        lojzik/letsencrypt                    latest
1b01529cc499        debian                                latest
b9debdc64b60        jwilder/nginx-proxy                   latest
>_ alias dit='docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"'

Hasta aquí el post sobre pequeños trucos a la hora de usar Docker. Muchos de ellos seguro que ya los usas y algunos serán nuevos. Si quieres ver el Docker Meetup #42 completo. Además de estos trucos hablan de como sacar el máximo partido a la nueva versión.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *