Docker es una herramienta popular para construir y ejecutar aplicaciones en contenedores. Está disponible para múltiples plataformas y se utiliza como una de las tecnologías de contenedores back-end en Kubernetes.

En Docker, usted puede construir sus propias imágenes para ejecutar su aplicación como contenedor, o puede extraer y utilizar miles de imágenes públicas del repositorio de Docker y utilizarlas en su proyecto. Una vez que su imagen está lista, puede lanzar sus contenedores utilizando esas imágenes. Un contenedor es una instancia en ejecución de una imagen Docker.

La gestión de contenedores Docker es uno de los aspectos más importantes que debe cuidar como administrador de sistemas que gestiona hosts/contenedores Docker.

En este artículo, nos centraremos en la gestión de contenedores utilizando el comando docker.

comando run

el comandodocker run se utiliza para ejecutar un contenedor desde una imagen especificando el ID de la imagen o el nombre del repositorio y/o etiqueta.

$ docker run {imagen}

Ejemplo:

$ docker run nginx

El comando anterior ejecuta una instancia de la aplicación<span class="NormalTextRun SpellingErrorV2 SCXW251451022 BCX0">nginx</span> en un host docker, si ya existe. Si no existe en el host Docker, sale al hub Docker (por defecto) y baja la imagen. Pero esto se hace sólo la primera vez. Para las veces siguientes se reutiliza la misma imagen.

Si desea ejecutar una versión concreta de una imagen, especifique su versión separada por dos puntos. Esto se conoce como Etiqueta. En caso de que no especifique ninguna etiqueta, docker la considerará por defecto como la más reciente.

Además, si desea ejecutar el contenedor en segundo plano en modo separado para que vuelva al prompt después de que Docker lance el contenedor, utilice la bandera -d.

Ejemplo:

$ docker run nginx
No se puede encontrar la imagen 'nginx:latest' localmente
latest: Extrayendo de library/nginx
33847f680f63: Pull completo
dbb907d5159d: Pull completo
8a268f30c42a: Pull completo
b10cf527a02d: Pull completo
c90b090c213b: Pull completo
1f41b2f2bf94: Pull completo
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Estado: Descargada imagen más nueva para nginx:latest
/docker-entrypoint.sh: /docker-entrypoint.d/ no está vacío, intentará realizar la configuración
/docker-entrypoint.sh: Buscando scripts de shell en /docker-entrypoint.d/
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Obteniendo la suma de comprobación de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Habilitada la escucha en IPv6 en /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuración completada; listo para el arranque
2021/08/15 12:13:23 [notice] 1#1: utilizando el método de evento "epoll
2021/08/15 12:13:23 [notice] 1#1: nginx/1.21.1
2021/08/15 12:13:23 [notice] 1#1: construido por gcc 8.3.0 (Debian 8.3.0-6)
2021/08/15 12:13:23 [notice] 1#1: SO: Linux 5.8.0-1039-azure
2021/08/15 12:13:23 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/08/15 12:13:23 [notice] 1#1: iniciar procesos worker
2021/08/15 12:13:23 [notice] 1#1: iniciar proceso trabajador 33
2021/08/15 12:13:23 [notice] 1#1: iniciar proceso worker 34

comando ps

el comandodocker ps lista todos los contenedores en ejecución y alguna información básica sobre ellos. Como ID del contenedor, nombre de la imagen, hora de creación del contenedor, estado actual y nombre del contenedor. Cada contenedor obtiene un nombre aleatorio (si no se especifica explícitamente) y un ID.

Ejemplo:

$ docker ps 
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES 
133f5e0267a5 nginx "/docker-entrypoint...." hace 10 segundos Arriba 10 segundos 80/tcp jolly_elion 

Para listar todos los contenedores en ejecución y no en ejecución/salidos a la vez, puede utilizar:

$ docker ps -a

Ejemplo:

$ docker ps -a 
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES 
fcec129f0eb4 nginx "/docker-entrypoint...." hace 46 horas Salió (0) hace 46 horas interesting_ishizaka 
6e8b1e441aa6 hello-world "/hello" hace 2 días Salió (0) hace 2 días keen_shirley 

comando ls

Al igual que el comando ps, ls también puede utilizarse para listar contenedores. -se puede utilizar una bandera para listar todos los contenedores (no sólo los que están en ejecución).

$ docker contenedor ls

Ejemplo:

$ docker contenedor ls
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
15796e91c30b redis "docker-entrypoint.s..." hace 2 segundos Arriba 1 segundo 6379/tcp flamboyant_neumann
904390b65d45 nginx "/docker-entrypoint...." hace 14 minutos Arriba 14 minutos 80/tcp nginx_new
$

comando stop

el comandodocker stop se utiliza para detener un contenedor en ejecución. Aquí necesitamos poner el nombre o ID del contenedor junto con esto.

$ docker stop {id-contenedor}

En caso de éxito, devolvería el nombre o ID del docker.

Ejemplo:

$ docker ps 
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES 
133f5e0267a5 nginx "/docker-entrypoint...." hace 50 segundos Arriba 49 segundos 80/tcp jolly_elion 

Esto devolverá el ID del contenedor que puede utilizar para detener el contenedor.

$ docker stop 133f5 
133f5

Para este ejemplo y los siguientes, tenga en cuenta que no necesita especificar un valor completo de ID DE CONTENEDOR. Aceptará hasta la parte, que lo hace único entre otros contenedores en ejecución ya que Docker sabe qué contenedor detener.

comando rm

el comando dockerrm elimina un contenedor detenido o salido.

$ docker rm {NOMBRE o ID DEL CONTENEDOR}

Ejemplo:

$ docker rm 133f5
133f5
$

comando exec

Podemos utilizar el comando exec para entrar dentro de un contenedor en ejecución. Esto es útil para depurar contenedores en ejecución o hacer algunas cosas dentro de un contenedor.

$ docker exec -it {contenedor} {comando}

Ejemplo:

Suponga que quiere lanzar el shell bash (asumiendo que la imagen tiene Bash disponible, puede utilizar otros shells disponibles también) dentro de un contenedor llamado unruffled_meninsky en modo interactivo, utilice:

$ docker exec -it unruffled_meninsky /bin/bash

Esto debería llevarlo dentro del contenedor a un shell bash. Aquí la bandera -i significa modo interactivo y -t terminal. Si sólo desea ejecutar uno o varios comandos y salir del contenedor, puede utilizar

$ docker exec unruffled_meninsky cat /etc/hosts
127.0.0.1 localhost 
::1 localhost ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
172.17.0.2 cd2eed4acf34 

comando logs

En caso de que un contenedor sea lanzado en modo detached, y queramos ver sus logs, podemos utilizar el comando logs para revisar sus logs:

$ docker logs {NOMBRE o ID DEL CONTENEDOR}

Ejemplo:

$ docker logs 7da6dcebaf9c
/docker-entrypoint.sh: /docker-entrypoint.d/ no está vacío, intentará realizar la configuración
/docker-entrypoint.sh: Buscando scripts de shell en /docker-entrypoint.d/
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Obteniendo la suma de comprobación de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Habilitada la escucha en IPv6 en /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Lanzando /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuración completada; listo para el arranque
2021/08/15 12:14:09 [notice] 1#1: utilizando el método de evento "epoll
2021/08/15 12:14:09 [notice] 1#1: nginx/1.21.1
2021/08/15 12:14:09 [notice] 1#1: construido por gcc 8.3.0 (Debian 8.3.0-6)
2021/08/15 12:14:09 [notice] 1#1: SO: Linux 5.8.0-1039-azure
2021/08/15 12:14:09 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/08/15 12:14:09 [notice] 1#1: iniciar procesos worker
2021/08/15 12:14:09 [notice] 1#1: iniciar proceso trabajador 31
2021/08/15 12:14:09 [aviso] 1#1: iniciar proceso worker 32
$

comando cp

Para copiar archivos entre un contenedor y el sistema de archivos localhost, puede utilizar el comando cp.

$ docker container cp {CONTAINER NAME or ID:SRC_PATH} {DEST_PATH}|-

Ejemplo:

$ docker container cp quirky_cray:/etc/nginx/nginx.conf nginx.conf.bkp

comando export

El comando docker container ofrece una opción para exportar el sistema de archivos de un contenedor como un archivo TAR.

$ docker container export {NOMBRE o ID DEL CONTENEDOR}

comando inspeccionar

Podemos comprobar información detallada sobre un contenedor utilizando el comando inspect como:

$ docker inspect {NOMBRE o ID DEL CONTENEDOR}

O

$ docker container inspect {NOMBRE o ID DEL CONTENEDOR}

comando kill

Un contenedor en ejecución puede ser matado utilizando el comando kill con una bandera opcional --signal o -s. Se pueden especificar varios contenedores para matarlos de una sola vez.

$ docker kill {NOMBRE o ID DEL CONTENEDOR} [--signal VAL]

Ejemplo:

$ docker kill cd9005a0b5d2 -s 9
cd9005a0b5d2
$

comando stats

Para visualizar un flujo en directo del uso de recursos de un contenedor, puede utilizar el comando stats:

$ docker container stats {NOMBRE o ID DEL CONTENEDOR}

Ejemplo:

$ docker container stats thirsty_volhard
CONTENEDOR ID NOMBRE CPU % MEM USO / LIMITE MEM % NET I/O BLOQUE I/O PIDS
904390b65d45 thirsty_volhard 0.00% 3.406MiB / 7.775GiB 0.04% 1.02kB / 0B 0B / 8.19kB 3

comando top

Al igual que el comando top en Linux, podemos utilizarlo con Docker para obtener una lista de los procesos en ejecución.

$ docker contenedor top {CONTAINER NOMBRE o ID}

Ejemplo:

$ docker container top thirsty_volhard
UID PID PPID C STIME TTY TIME CMD
root 2603 2582 0 12:34 ?                   00:00:00 nginx: proceso maestro nginx -g daemon off;
systemd 2659 2603 0 12:34 ?                   00:00:00 nginx: proceso trabajador
systemd 2660 2603 0 12:34 ?                   00:00:00 nginx: proceso de trabajador
$

comando rename

Para renombrar un contenedor existente, utilice el comando rename.

$ docker container rename {nombre del contenedor antiguo} {NUEVO NOMBRE DE CONTENEDOR}

Ejemplo:

$ docker ps
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
904390b65d45 nginx "/docker-entrypoint...." hace 7 minutos Arriba 7 minutos 80/tcp nginx_container
$ docker container rename nginx_container nginx_new
$ docker ps
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
904390b65d45 nginx "/docker-entrypoint...." hace 7 minutos Arriba 7 minutos 80/tcp nginx_new
$

comando diff

Podemos inspeccionar los cambios en los archivos o directorios del sistema de archivos de un contenedor con el comando diff.

$ docker container diff {NOMBRE o ID DEL CONTENEDOR}

Ejemplo:

$ docker container diff nginx_new
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
$

Resumen

Para concluir, Docker ofrece un amplio conjunto de comandos para gestionar los contenedores desde su creación hasta su destrucción. Hemos cubierto algunos de los comandos importantes y su uso en este artículo, que debería darle una buena idea sobre la gestión de contenedores Docker.

More on Docker