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 comando docker
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 pudo encontrar la imagen 'nginx:latest' localmente
latest: Pulling from library/nginx
33847f680f63: Pull completo
dbb907d5159d: Pull completo
8a268f30c42a: Pull completo
b10cf527a02d: Pull completo
c90b090c213b: Pull completo
1f41b2f2bf94: Pull completo
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Estado: Downloaded newer image for 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 arrancar
2021/08/15 12:13:23 [notice <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: usando el método de evento "epoll"
2021/08/15 12:13:23 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> notice] 1#1: nginx/1.21.1
2021/08/15 12:13:23 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: construido por gcc 8.3.0 (Debian 8.3.0-6)
2021/08/15 12:13:23 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: OS: Linux 5.8.0-1039-azure
2021/08/15 12:13:23 [notice <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/08/15 12:13:23
<x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x>
1#1: iniciar
proceso trabajador
2021/08/15 12:13:23 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: iniciar proceso trabajador 33
2021/08/15 12:13:23 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: iniciar proceso trabajador 34
comando ps
el comando docker
ps lista todos los contenedores en ejecución y alguna información básica sobre ellos. Como el ID del contenedor, el nombre de la imagen, la hora de creación del contenedor, el estado actual y el nombre del contenedor. Cada contenedor obtiene un nombre aleatorio (si no se especifica explícitamente) y un ID
Ejemplo
$ docker ps
ID DE CONTENEDOR IMAGEN ORDEN 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
ID DE CONTENEDOR IMAGEN ORDEN 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
ls Comando
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 l
s
Ejemplo
$
docker container ls
ID DEL CONTENEDOR IMAGEN ORDEN 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
$
docker container ls
comando stop
el comando docker
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
ID DE CONTENEDOR 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 docker rm
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 arrancar
2021/08/15 12:14:09 [notice <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: utilizando el método de evento "epoll"
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> ] 1#1: nginx/1.21.1
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: construido por gcc 8.3.0 (Debian 8.3.0-6)
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: OS: Linux 5.8.0-1039-azure
2021/08/15 12:14:09 [notice <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> notice] 1#1: iniciar proceso de trabajo
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: iniciar proceso de trabajo 31
2021/08/15 12:14:09 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1: iniciar proceso de trabajo 32
$
cp Comando
Para copiar archivos entre un contenedor y el sistema de archivos localhost, puede utilizar el comando cp
$
docker container cp {NOMBRE o ID DEL CONTENEDOR: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 usando 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
ID DEL CONTENEDOR 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
top Comando
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 {NOMBRE o ID DEL CONTENEDOR}
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 worker
$
rename Comando
Para renombrar un contenedor existente, utilice el comando rename
$ docker container rename {nombre del contenedor antiguo} {NUEVO
NOMBRE DE CONTENEDOR}
Ejemplo
$ docker ps
ID DE CONTENEDOR 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
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
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, Doker ofrece un extenso conjunto de comandos para gestionar 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
A continuación, descubra algunos de los recursos para aprender DevOps.