Práctica básica con Docker:

Carga de imágenes

Vamos a realizar una práctica básica con Docker, en concreto lo que hemos visto en el artículo de Primeros pasos con Docker. Para comenzar, ejecutamos Docker con el comando “docker run” y el nombre de una imagen como puede ser “centos”. Para averiguar qué imágenes se pueden usar se puede ir al sitio web hub.docker.com y en el apartado “Explorer” se pueden encontrar imágenes oficiales, como el “Hello world” o el “CentOS” que vamos a probar. Hacer clic en el link de CentOS para ver las instrucciones sobre cómo ejecutarlo. Explica que haciendo “docker pull centos” se descarga como imagen. Lo primero que hace Docker es comprobar si hay una imagen CentOS disponible localmente. Si no la hay, descarga la última versión de la imagen. El nombre “centos” especifica un nombre para buscar en el repositorio de la biblioteca predeterminada con las imágenes oficiales. Si vamos al sitio web de Docker Hub, todas las imágenes oficiales se pueden descargar con el comando “pull” y el nombre de esa imagen en particular. En caso de que desarrolles una imagen propia subida al repositorio de Docker (necesita registro), entonces hay que usar el nombre usuario, una barra diagonal y el nombre del repositorio. Si está utilizando sus propias imágenes podría usar el nombre directamente, pero debe ser un repositorio oficial que sea compatible con Docker.

Ejecución de imágenes

Una vez se ha descargado centos y  ejecutado con un comando run, seguiremos estando en el prompt, ya que no le pedimos que haga nada. Esto quiere decir que “centos” es solo una imagen base para el sistema operativo CentOS. Docker se utiliza para ejecutar servicios y aplicaciones, una vez termina la ejecución vuelve al prompt. Para mantener vivo el contenedor, se debe ejecutar algo. Si ejecutamos de nuevo, esta vez tardará menos porque la imagen ya está extraída. Vamos a decirle que ejecute el comando “bash” y, para iniciar sesión automáticamente en la ventana del contenedor, se usa la opción -it: “docker run -it centos bash”

Se observa que el prompt ha cambiado a “root@” y una ID única. Docker ejecutó el contenedor “centos”, que es el sistema operativo CentOS y luego ejecutó el comando bash, para luego conectarse al contenedor con las opciones -it. Así que ahora está dentro del contenedor. Podemos verificar el sistema operativo en el que esta haciendo “cat /etc/*release*”. Salimos del contenedor con “exit” y limpiamos la pantalla con “clear”.

Listado de contenedores

El siguiente comando que vamos a ver en esta práctica básica con Docker es “docker ps”. El comando enumera todos los contenedores en ejecución. En principio no hay nada en ejecución, ya que ejecutamos “centos”, nos conectamos, ejecutamos un par de comandos y luego salimos. El comando “docker ps” enumera todos los contenedores en ejecución solamente. Vamos a ejecutar el contenedor de CentOS en segundo plano (opcion -d), con el comando de suspensión para que espere 20 segundos: “docker -d run centos sleep 20”. Si ejecutamos el comando “docker ps” veremos la información sobre el ID, la imagen, el comando en ejecución, el tiempo desde que se ejecutó, el tiempo que está activo y un nombre. Si volvemos a lanzar el comando “docker ps” probablemente veremos que ha desaparecido debido a que han pasado los 20 segundos. 

Para ver todos los contenedores que se ejecutaron en el pasado y todos los contenedores terminados, se usa el comando con la opción -a: “docker ps -a”. Podremos ver que lo último que ejecutamos fue “centos” con el comando “sleep”, el tiempo aproximado de cuando fue creado y cuando terminó. Igual ocurre con el resto de ejecuciones anteriores.

Ejecución en segundo plano

Ejecutar un CentOS durmiendo durante 2000 segundos. Si se ejecuta el comando “docker ps” veremos su información. Si, por alguna razón, queremos detener o eliminar este contenedor antes de tiempo, usamos el comando “docker stop” con el nombre dado por Docker (última columna de la información mostrada por “ps”) o el ID (demasiado complejo). Una vez ejecutado, el contenedor termina. Puede comprobarse con “docker ps” o “docker ps -a” que mostrará en la columna de Status el código de salida 137 que indica una parada forzada.

En estos momentos hay muchos contenedores en el listado de ejecuciones, por lo que vamos a limpiarlo con “docker rm” y el nombre o ID del contenedor que se desea eliminar. Esto es lo que debe hacerse para liberar espacio en disco. Para eliminar varios contenedores, puede ponerse la lista de IDs o nombres separados por espacios: “docker rm ID1 ID2 ID3 …”. Libera todo para dejar ese espacio de disco libre y no tener ningún contenedor funcionando o muerto.

Limpieza de imágenes

Solo quedarán las imágenes descargadas, que para verlas se usa el comando “docker images”. Para eliminar las imágenes se utiliza “docker rmi” y el nombre de la imagen. Si se intenta eliminar una imagen para la que hay algún contenedor en ejecución que depende de esa imagen, no se permitirá. Es ese caso al usar “docker rmi” aparecerá un mensaje de error. Así, para eliminar una imagen primero hay que eliminar todos los contenedores que la usan utilizando el comando “docker rm <ID>”. Elimina todas las imagenes para que no ocupen espacio en disco.

Otro comando útil es pull. Cuando ejecutamos el comando “run” con centos, primero buscó una imagen localmente, como no la encontró, la extrajo del repositorio de Docker y luego ejecutó la imagen en un contenedor. Si no queremos que Docker ejecute la imagen y solo queremos extraerla para ejecutarla posteriormente de una forma más rápida, utilizamos el comando “docker pull”.  El comando hace una extracción y la almacena localmente. Ejecutemos “docker pull ubuntu” y luego “docker images” para ver que la imagen se descarga y está presente en nuestra máquina.

La última tara de nuestra práctica básica con Docker es a ejecutar un contenedor de ubuntu en segundo plano y lo vamos a mantener con vida durante unos 100 segundos: “docker -d run ubuntu sleep 100”. Con “docker ps” puede verse que se está ejecutando y está durmiendo durante 100 segundos. Mientras un contenedor de Docker se ejecuta en segundo plano, si se desea ejecutar un comando particular en el contenedor, por ejemplo, ver el contenido de un archivo en particular con el comando “cat” de linux, usamos el comando Docker “exec”: “docker exec <ID> cat /etc/*release*”. Al hacerlo, en realidad se ejecuta el comando dentro del contenedor y da una salida.