Skip to main content

Ejecutando y Administrando Contenedores

4.1. Entonces, vamos a jugar con ese tal container

Como todos sabemos, Docker utiliza la línea de comandos para que puedas interactuar con él -- básicamente utilizas el comando "docker".

Bien, ahora que ya iniciamos Docker, vamos a ejecutar nuestro primer container.

Como es costumbre cuando alguien está aprendiendo un nuevo lenguaje de programación, es muy común hacer como primer código un hello world!

Aunque Docker no sea un lenguaje de programación, vamos a utilizar esta costumbre con nuestro primer ejemplo de un container en ejecución.

Docker posee una imagen personalizada de hello-world y sirve para que puedas probar tu instalación y validar si todo funciona como se espera. :D

Para poder ejecutar un container, utilizamos el parámetro "run" del subcomando "container" del comando "docker". ¿Simple, no? :D

root@linuxtips:~# docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete a3ed95caeb02: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.


To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/userguide/

root@linuxtips:~#

En el ejemplo anterior, estamos ejecutando un container utilizando la imagen personalizada de hello-world.

Aunque sea una tarea simple, cuando ejecutaste el comando "docker container run hello-world" fueron necesarias cuatro etapas para su conclusión, veamos cuáles son:

  1. El comando "docker" se comunica con el daemon de Docker informando la acción deseada.

  2. El daemon de Docker verifica si la imagen "hello-world" existe en tu host; en caso de que no, Docker hace la descarga de la imagen directamente desde Docker Hub.

  3. El daemon de Docker crea un nuevo container utilizando la imagen que acabas de descargar.

  4. El daemon de Docker envía la salida al comando "docker", que imprime el mensaje en tu terminal.

¿Viste? ¡Es simple como volar! :)

Muy bien, ahora que ya tenemos una imagen en nuestro host, ¿cómo hago para visualizarla?

Muy simple, basta con escribir el siguiente comando:

root@linuxtips:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 690ed74de00f 5 months 960 B

root@linuxtips:~#

Como puedes notar en el código, la salida muestra cinco columnas:

  • REPOSITORY -- El nombre de la imagen.

  • TAG -- La versión de la imagen.

  • IMAGE ID -- Identificación de la imagen.

  • CREATED -- Cuándo fue creada.

  • SIZE -- Tamaño de la imagen.

Cuando ejecutamos el comando "docker container run hello-world", éste creó el container, imprimió el mensaje en la pantalla y después el container fue finalizado automáticamente, es decir, ejecutó su tarea, que era mostrar el mensaje, y después fue finalizado.

Para estar seguro de que realmente fue finalizado, escribe:

root@linuxtips:~# docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES

root@linuxtips:~#

Con "docker container ls", puedes visualizar todos los containers en ejecución y aún obtener los detalles sobre ellos. La salida de "docker container ls" está dividida en siete columnas; vamos a conocer lo que nos dicen:

  • CONTAINER ID -- Identificación única del container.

  • IMAGE -- La imagen que fue utilizada para la ejecución del container.

  • COMMAND -- El comando en ejecución.

  • CREATED -- Cuándo fue creado.

  • STATUS -- Su estado actual.

  • PORTS -- El puerto del container y del host que ese container utiliza.

  • NAMES -- El nombre del container.

Una opción interesante de "docker container ls" es el parámetro "-a".

root@linuxtips:~# docker container ls -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e45cf509282 hello-world "/hello" 4 seconds Exited(0) tracted_ardinghelli

root@linuxtips:~#

Con la opción "-a" puedes visualizar no solamente los containers en ejecución, sino también containers que están detenidos o que fueron finalizados.

4.2. Genial, quiero más

Ahora que vimos cómo crear un simple container, así como visualizar las imágenes y containers que están en nuestro host, vamos a crear uno nuevo, pero conociendo tres parámetros que traerán mayor flexibilidad en el uso y en la administración de nuestros containers. Estoy hablando de los parámetros "-t", "-i" y "-d".

  • -t -- Proporciona un TTY (consola) para nuestro container.

  • -i -- Mantiene el STDIN abierto aunque no estés conectado en el container.

  • -d -- Hace que el container se ejecute como un daemon, es decir, sin la interactividad que los otros dos parámetros nos proporcionan.

Con esto tenemos dos modos de ejecución de nuestros containers: modo interactivo o daemonizando el container.

4.2.1. Modo interactivo

En la mayoría de las veces vas a levantar un container a partir de una imagen que ya está lista, toda ajustadita. Sin embargo, hay algunos casos en que necesitas interactuar con tu container -- esto puede suceder, por ejemplo, a la hora de montar tu imagen personalizada.

En ese caso, usar el modo interactivo es la mejor opción. Para eso, basta pasar los parámetros "-ti" al comando "docker container run".

4.2.2. Daemonizando el container

Utilizando el parámetro "-d" del comando "docker container run", es posible daemonizar el container, haciendo que el container sea ejecutado como un proceso daemon.

Esto es ideal cuando ya poseemos un container que no vamos a acceder (vía shell) para realizar ajustes. Imagina una imagen ya con tu aplicación y todo lo que necesitas configurado; vas a levantar el container y solamente vas a consumir el servicio entregado por tu aplicación. Si es una aplicación web, basta con acceder en el browser pasando la IP y el puerto donde el servicio está disponible en el container. ¿Sensacional, no?

Es decir, si quieres levantar un container para ser utilizado como una máquina Linux convencional con shell y que necesita alguna configuración o ajuste, utiliza el modo interactivo, es decir, los parámetros "-ti".

Ahora, si ya tienes el container configurado, con tu aplicación y todas las dependencias resueltas, no tienes la necesidad de usar el modo interactivo -- en ese caso utilizamos el parámetro "-d", es decir, el container daemonizado. Vamos a acceder solamente a los servicios que él provee, simple así. :D

4.3. Entendí, ¿ahora vamos a practicar un poco?

Perfecto. Vamos a iniciar un nuevo container utilizando dos de esos nuevos parámetros que aprendimos.

Para nuestro ejemplo, vamos a levantar un container de Centos 7:

root@linuxtips:~# docker container run -ti centos:7
Unable to find image 'centos:7' locally
7: Pulling from library/centos
a3ed95caeb02: Pull complete 196355c4b639: Pull complete
Digest: sha256:3cdc0670fe9130ab3741b126cfac6d7720492dd2c1c8ae033dcd77d32855bab2
Status: Downloaded newer image for centos:7

[root@3c975fb7fbb5 /]#

Como la imagen no existía en nuestro host, comenzó a descargar desde Docker Hub, sin embargo, en caso de que la imagen ya estuviera en nuestro host, la utilizaría, no siendo necesaria la descarga.

Nota que cambió tu prompt (variable $PS1), pues ahora ya estás dentro del container. Para probar que estamos dentro de nuestro container Centos, ejecuta el siguiente comando:

[root@3c975fb7fbb5 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

[root@3c975fb7fbb5 /]#

El archivo "/etc/redhat-release" indica cuál es la versión de Centos que estamos utilizando, es decir, estamos realmente en nuestro container Centos 7. :D

4.4. Ok, ahora quiero salir

Idealmente, en el container va a haber apenas un proceso ejecutándose. En nuestro caso, como estamos interactuando (opción "-ti"), es el proceso de bash; por lo tanto, no puedes utilizar el comando "exit" para salir de la consola, pues de esa forma ese único proceso deja de ejecutarse y tu container muere. En caso de que quieras salir del container y mantenerlo en ejecución, es necesario salir con el siguiente atajo de teclado:

mantén el botón Ctrl presionado + p + q

Así, saldrás del container y él continuará en ejecución. Para confirmar si el container continúa en ejecución, haz:

root@linuxtips:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c975fb7fbb5 centos:7 "/bin/bash" 2 minutes Up 2 minutes angry_wescoff

root@linuxtips:~#

4.5. ¿Puedo volver al container?

Dejamos nuestro container en ejecución y ahora queremos acceder a él nuevamente. ¿Cómo podemos hacerlo?

¡Simple! Basta con escribir el siguiente comando:

root@linuxtips:~# docker container attach <CONTAINER ID>

El parámetro "attach" del comando "docker container" nos posibilita conectarnos a un container en ejecución. Para eso, basta pasar como parámetro el "CONTAINER ID", que consigues a través de la salida del "docker ps", como mostramos en el ejemplo anterior.

4.6. Continuando con el juego

Existe la posibilidad de crear un container, pero no ejecutarlo inmediatamente. Cuando hacemos uso del parámetro "create" del comando "docker container", él apenas crea el container, sin inicializarlo, como notamos en el ejemplo a continuación:

root@linuxtips:~# docker container create -ti ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
5a132a7e7af1: Pull complete
fd2731e4c50c: Pull complete
28a2f68d1120: Pull complete
a3ed95caeb02: Pull complete
Digest:sha256:4e85ebe01d056b43955250bbac22bdb8734271122e3c78d21e55ee235fc6802d
Status: Downloaded newer image for ubuntu:latest3e63e65db85a6e36950959dc6bdc00279e2208a335580c478e01723819de9467

root@linuxtips:~#

Nota que cuando escribes "docker container ls" no muestra el container recién creado, después de todo la salida de "docker container ls" solamente muestra los containers en ejecución. Para visualizar el container recién creado fue necesario utilizar el parámetro "-a".

root@linuxtips:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e63e65db85a ubuntu "/bin/bash" 18 seconds ago Created elo_visves

root@linuxtips:~#

Para que nuestro container recién creado sea ejecutado, basta utilizar "docker container start [CONTAINER ID]", como sigue:

root@linuxtips:~# docker container start [CONTAINER ID]
root@linuxtips:~# docker container attach [CONTAINER ID]

root@b422f04df14c:/#

Verificando si estamos realmente utilizando el container de Ubuntu:

root@b422f04df14c:/# cat /etc/issue
Ubuntu 18.04 LTS \n \l

root@b422f04df14c:/#

Recordando que para salir del container y mantenerlo en ejecución es necesario utilizar el atajo: Ctrl + p + q.

4.7. Levantando y matando containers

En caso de que quiera detener un container en ejecución, basta utilizar el parámetro "stop" seguido del "CONTAINER ID":

# docker container stop [CONTAINER ID]

Verificando si el container continúa en ejecución:

# docker container ls

Recordando que para visualizar los containers que no están en ejecución es necesario utilizar el parámetro "-a".

Para colocar nuevamente en ejecución un container que está detenido, es necesario utilizar el parámetro "start" del comando "docker container" seguido del "CONTAINER ID":

# docker container start [CONTAINER ID]

De la misma forma como podemos utilizar stop/start para apagar/iniciar un container, podemos también hacer uso del "restart", como notamos a continuación:

# docker container restart [CONTAINER ID]

Para pausar un container, ejecuta:

# docker container pause [CONTAINER ID]

Y verifica el estado del container:

root@linuxtips:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b34f4987bdce ubuntu "/bin/bash" 12 seconds ago Up 11 seconds (Paused) drunk_turi

root@linuxtips:~#

Para "despausar" el container:

# docker container unpause [CONTAINER ID]

4.8. Visualizando el consumo de recursos por el container

En caso de que quieras visualizar información referente al consumo de recursos por el container, también es bastante simple: basta utilizar el parámetro "stats" para verificar el consumo de CPU, memoria y red por el container en tiempo real.

# docker container stats [CONTAINER ID]

CONTAINER CPU% MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
b34f4987bdce 0.00% 503.8kB/2.094GB 0.02% 648B/648B 0B/0B 2

Para salir, presiona Ctrl + C.

Para visualizar todos los containers de una sola vez, basta no especificar el [CONTAINER ID], como sigue:

# docker container stats

Ahora, si quieres visualizar cuáles procesos están en ejecución en determinado container, utiliza el parámetro "top". Con él consigues información sobre los procesos en ejecución, como, por ejemplo, UID y el PID del proceso.

# docker container top [CONTAINER ID]
UID PID PPID C STIME TTY TIME COMMAND
root 10656 4303 0 20:24 pts/3 00:00:00 /bin/bash

Para verificar los logs de un determinado container, utiliza el parámetro "logs", simple así. :D

# docker container logs [CONTAINER ID]

Recuerda: muestra el STDOUT, la salida estándar. Es decir, normalmente vas a visualizar el historial de mensajes que aparecen en primer plano durante la ejecución del container.

Para mostrar los logs de forma dinámica, es decir, conforme aparecen nuevos mensajes actualiza la salida en el terminal, utilizamos la opción "-f"

# docker container logs -f [CONTAINER ID]

. Con esto tu terminal quedará bloqueado, apenas escuchando el log, y cualquier nueva entrada la mostrará en la pantalla. Salida parecida con "tail -f" en Linux. Recuerda, utiliza ctrl+c para cancelar la visualización de los logs.

4.9. Me cansé de jugar con el container, quiero eliminarlo

Bien, eliminar un container es aún más simple que su creación. Cuando eliminamos un container, la imagen que fue utilizada para su creación permanece en el host; solamente el container es eliminado.

root@linuxtips:~# docker container rm b34f4987bdce

Failed to remove container (b34f4987bdce): Error response from daemon:
Conflict, You cannot remove a running container. Stop the container
before attempting removal or use -f

root@linuxtips:~#

Nota que, cuando intentaste eliminar el container, retornó un error diciendo que falló al eliminar, pues el container estaba en ejecución. Incluso recomienda que detengas el container antes de eliminarlo o entonces utilices la opción "-f", forzando así su eliminación.

root@linuxtips:~# docker container rm -f b34f4987bdce
b34f4987bdce

root@linuxtips:~#

Para confirmar la eliminación del container, utiliza el comando "docker container ls -a".