Gestionar contenedores con Docker

Este es uno de los capítulos del tutorial Docker. Introducción y primeros pasos. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

En el capítulo anterior estuvimos viendo como tratar con imágenes. Imágenes que descargábamos desde DockerHub. Se trataba de poder inspeccionar imágenes, conocer su historia, y poder borrarlas de nuestro equipo para que no ocupen un espacio innecesario. En este capítulo del tutorial, vamos a hacer lo propio pero con contenedores. El objetivo es gestionar contenedores con docker.

Sin embargo, a pesar de que trataré como gestionar contenedores con docker, no voy a tratar en profundidad la ejecución de contenedores. La ejecución de contenedores la encontrarás en un capítulo posterior del tutorial. Se trata de un aspecto que tiene suficiente entidad e importancia como para dedicarle un capítulo única y exclusivamente a la ejecución de contenedores. Esto no quita a que en este capítulo iniciemos algún contenedor para poder saber como gestionarlo y trabajar con el.

Gestión de contenedores con docker

Gestionar contenedores con docker

Si en el capítulo anterior, para la gestión de imágenes tenías que tener presente la instrucción docker image --help, en este, para la gestión de contenedores tendrás que tener presente docker container --help.

Por otro lado, para seguir este segundo capítulo del tutorial, utilizaré la misma imagen con la que trabajamos en el capítulo anterior blitznote/baseimage. Se trata de una imagen muy ligera, y al ser Ubuntu, me siento como en casa.

Iniciando el primer contenedor

Para iniciar tu primer contenedor tan solo tienes que ejecutar docker container run blitznote/baseimage o mejor, por ser mas corto,

$ docker run blitznote/baseimage

Al ejecutar esta instrucción, te llevarás un pequeño chasco, y es que no sucede, aparentemente, nada. Pasa como un segundo, y vuelves de nuevo a la línea de comandos. Bueno, realmente no es así. Lo cierto es que has arrancado un contenedor, y como no hay ningún proceso en él se ha detenido.

¿Cuantos contenedores tienes?

Para conocer el número de contenedores, tienes que utilizar docker ps o también docker container ls. Sin embargo, si ahora lo ejecutas, verás que aparentemente no tienes niguno. Bueno, realmente no verás nada. Para ver todos los contenedores, incluidos los contenedores parados, ejecuta docker ps -a.

$ docker ps -a

CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                      PORTS               NAMES
17cb81b454a5        blitznote/baseimage   "/bin/bash"         3 minutes ago       Exited (0) 3 minutes ago                        serene_thompson

Algunos detalles a tener en cuenta,

  • COMMAND se refiere al comando que es ejecutado, en este caso figura /bin/bash. ¿de donde sale?. Si ejecutas docker history blitznote/baseimage, verá que lo que buscas en CMD. Esto también lo puedes encontrar utilizando docker inspect blitznote/baseimage. Estas dos herramientas las viste en el capítulo anterior de este tutorial.
  • CREATED como ya sospechas, indica el tiempo que ha transcurrido desde que se creó el contenedor.
  • STATUS, por otro lado, te indica en que estado se encuentra, y el tiempo que lleva en ese estado.
  • NAMES, indica el nombre del contenedor. Es mas sencillo identificar un contenedor por su nombre que por su CONTAINER ID. En el caso de que tu no le pases el nombre, docker generará uno de forma aleatoria.

Poniendo nombre a tus contenedores

Como he comentadoPara iniciar un contenedor asignándole un nombre, la instrucción a ejecutar es la siguiente,

docker run -d --name ejemplo blitznote/baseimage

Si intentas llamar a dos contenedores por el mismo nombre, como te puedes imaginar, se producirá un error, y no iniciará el segundo contenedor.

Pero también tienes la opción de renombrar uno de los conenedores. Así por ejemplo,

docker container rename 17cb81b454a5 perico

De esta manera, renombrará el contenedor con número de identificación 17cb81b454a5 a perico. Indicarte que, como ya viste con las imágenes, puedes acortar el número de identificación, hasta su mínima expresión, es decir, un solo caracter. Siempre y cuando no haya otro contenedor que tenga un identificador que empiece c on el mismo carácter.

Iniciando, parando y pausando contenedores

Para poder poder parar contenedores y volverlo a iniciar posteriormente, necesitarás un contenedor que ejecute un proceso, un contenedor que no se detenga nada mas arrancarlo. Para eso utilizarás el comando sleep en el contenedor.

El primero lo vas a lanzar con unos pocos segundos,

docker run blitznote/baseimage sleep 5

Esto no es muy interesante. Hasta que no han transcurrido los 5 segundos, no puedes hacer nada. Para evitar esto, tienes que utilizar la opción -d, que te permite ejecutar el contenedor sin que estés esperando a que finalice, detach mode. Ahora, en lugar ed 5 segundos, ejecútalo con 100 segundos que te de tiempo a realizar otras opciones,

docker run -d blitznote/baseimage sleep 100

Al hacer esto, te ha devuelto el número de identificación del contenedor. Si ahora ejecutas docker ps, lo encontrarás entre los contenedores que se están ejecutando.

Ahora ha llegado el momento de parar el contenedor. Para esto, ejecuta docker stop 1e0e92b8255e. En tu caso, indica el identificador o parte del identificador de tu contenedor.

Una vez detenedido lo puedes iniciar de nuevo. Para esto ejecuta docker start 1e0e92b8255e.

Matando contenedores

Por último puedes matar el contenedor. Para ello ejecuta docker kill 1e0e92b8255e. La diferencia entre stop y kill, radica en que en el primer caso se envía proceso principal del contenedor la señal SIGTERM y posteriormente SIGKILL. En el segundo caso, en el caso de docker kill, se envia directamente la señal SIGKILL. Esto lo notarás en el tiempo que tarda en detenerse un contenedor, si haces un docker stop tardará unos segundos, mientras que si haces un docker kill se detendrá prácticamente al instante.

Otra opción que tienes es la de reiniciar un contenedor. Es decir, detener e iniciar de nuevo el contenedor, pero todo desde un único comando docker restart 1e0e92b8255e.

Pausando contenedores

Por último, te queda una opción que te puede resultar muy interesante, que es le de pausar un contenedor. Bueno, realmente, estás pausando todos los procesos dentro del contenedor. Para pausar el contenedor,

docker pause 1e0e92b8255e

Ahora al hacer un docker ps verás que si que aparece tu contenedor, pero que está en modo pausa. Puedes ponerlo de nuevo en funcionamiento con un unpause, como por ejemplo,

docker unpause 1e0e92b8255e

Mas operaciones para gestionar contenedores

De nuevo inicia un docker pero esta vez con mas tiempo para hacer mas operaciones con él. Por ejemplo con un sleep 100000. Si por lo que fuera, lo lanzas sin la opción -d, recuerda que siempre puedes parar el contenedor desde otro terminal. Por otro lado, esta vez para tu comodidad, le vas a poner nombre, en mi caso midocker. Así va a ser mas sencillo trabajar con él.

docker run -d --name midocker blitznote/baseimage sleep 100000

Copiando entre el host y el contenedor

Es posible que en alguna ocasión quieras copiar un archivo entre tu equipo y el contenedor, y al revés. Para esto tienes el comando cp. Para verlo con un ejemplo crear un archivo y posteriormente lo copias al contenedor,

$ touch archivo.txt
$ docker cp archivo.txt midocker:.

Ya lo tienes… has copiado archivo.txt a /. ¿Como comprobarlo? Tienes que entrar al contenedor y ver que hay allí dentro. Para esto ejecuta,

$ docker exec -it midocker bash

No te preocupes, que tanto docker exec como docker run los verás con detalle en el próximo capítulo de este tutorial. Por ahora, quedate con que esta opción te permite abrir una consola de forma interactiva en el contenedor.

Una vez ejecutada la instrucción anterior, y dentro del contenedor, verás que estás en el directorio raíz. Lista los archivos ls y verás que allí está el archivo que has copiado. Ahora, puedes hacer lo mismo, crea un archivo nuevo, que luego lo copiarás a tu equipo, touch archivo2.txt. Ahora sal del contenedor con un exit, y copia del contenedor a tu equipo,

$ docker cp midocker:archivo2.txt .

Simplemente ls y comprueba que tienes ahí ese archivo que creaste en tu contenedor.

¿Que sucede en el contenedor?

Si quieres saber lo que sucede en tu equipo, es decir, los procesos que están corriendo, ejecutarías el comando top. Esto mismo lo puedes hacer con un contenedor. Simplemente tienes que ejecutar,

$ docker top midocker

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1330                1308                0                   06:34               ?                   00:00:00            sleep 100000

Otra opción que también te puede resultar interesante para monitorizar un contenedor es docker stats. Esto te permite ver en tiempo real y hasta que lo detengas lo que sucede en ese contenedor. Para detenerlo, tienes que ejecutar Ctrl+C. En el caso de que solo quieras una visión puntual, utiliza la opción --no-stream. Por ejemplo,

$ docker stats --no-stream midocker

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
a89b24cc9cd2        midocker            0.00%               2.227MiB / 7.694GiB   0.03%               7.42kB / 0B         1.98MB / 0B         1

Borrando contenedores

Ejecuta ahora docker ps -a y verás la cantidad de contenedores que tienes en tu equipo. Es el momento de hacer un poco de limpieza. Para esta operación, tienes dos opciones, o bien, los eliminas uno a uno, como por ejemplo,

$ docker rm midocker

Si por despiste o por la razón que sea, intentas detener un contendor que está en ejecución, te arrojará un error. Antes de borrar un contenedor este tiene que estar parado. Como viste antes, puedes pararlo o matarlo.

La otra opción es borrar todos los contenedores que estén parados. Para ello, tienes que ejecutar el comando,

$ docker container prune

Al ejecutar este comando, te avisa que vas a borrar todos los contenedores parados, y te pregunta si esto es lo que quieres hacer.

Conclusión

En este segundo capítulo del tutorial, has podido ver una parte importante de los comandos que puedes utilizar para gestionar contenedores. Indicarte que estos no son todos, pero, ahora mismo, para gestionar tus contenedores tienes suficientes herramientas.

En el próximo capítulo vas a ver con detalle los comandos docker run y docker exec.


Imagen de portada de ammiel jr en Unsplash

Deja un comentario

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