Los contenedores representan la materialización de una imagen de Docker en ejecución. Mientras que una imagen actúa como una plantilla de solo lectura, el contenedor añade una capa superior de lectura y escritura, permitiendo la ejecución aislada de aplicaciones junto con todas sus dependencias, librerías y configuraciones de sistema necesarias.
Creación e Inicialización de Contenedores
El ciclo de vida de un contenedor comienza al instanciar una imagen. Por defecto, un contenedor recién creado permanece inactivo hasta que se le asigna un proceso principle. La finalización de este proceso provoca la detención automática del contenedor.
Para generar un contenedor sin iniciarlo inmediatamente, se emplea el siguiente comando:
docker create [opciones] [imagen] [comando]
Las opciones -i y -t son comunes para mantener la entrada estándar abierta y asignar una pseudo-terminal:
$ docker create -it --name mi_contenedor_alpine alpine:latest /bin/sh
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2
Nota sobre redes: Si al crear o ejecutar un contenedor se presenta un error relacionado con el reenvío de IPv4 (WARNING: IPv4 forwarding is disabled), es necesario habilitarlo editando el archivo /etc/sysctl.conf o /usr/lib/sysctl.d/00-system.conf, añadiendo la línea net.ipv4.ip_forward=1 y reiniciando el servicio de red.
Para verificar el estado de los contenedores, incluyendo los detenidos, se utiliza:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 alpine:latest "/bin/sh" 10 seconds ago Created mi_contenedor_alpine
Para iniciar un contenedor previamente creado y detenido:
$ docker start mi_contenedor_alpine
mi_contenedor_alpine
Si se desea crear y arrancar el contenedor en un solo paso, se usa docker run. Este comando busca la imagen localmente, la descarga si es necesario, crea el contenedor, configura la red y ejecuta el proceso:
$ docker run --rm alpine:latest /bin/sh -c "echo 'Iniciando entorno' && ls /etc"
Iniciando entorno
alpine-release
fstab
group
...
Para mantener un contenedor ejecutándose en segundo plano (modo detached), se añade la bandera -d. Es crucial que el proceso principal no finalice, de lo contrario, el contenedor se detendrá:
$ docker run -d --name servicio_fondo alpine:latest /bin/sh -c "while true; do sleep 3600; done"
f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b7a6f5e4d3c2b1a0f9e8
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9e8d7c6b5a4 alpine:latest "/bin/sh -c 'while t…" 5 seconds ago Up 4 seconds servicio_fondo
Detención de Contenedores
Para detener de manera controlada un contenedor en ejecución, enviando una señal SIGTERM seguida de SIGKILL si es necesario, se ejecuta:
$ docker stop servicio_fondo
servicio_fondo
Acceso al Interior del Contenedor
Para interactuar con la shell de un contenedor activo sin interrumpir su proceso principal, se utiliza docker exec:
$ docker exec -it servicio_fondo /bin/sh
/ # hostname
f9e8d7c6b5a4
/ # exit
Migración: Exportación e Importación
Los contenedores pueden empaquetarse y trasladarse entre diferentes hosts. El comando docker export genera un archivo tar con el sistema de archivos del contenedor, independientemente de su estado:
$ docker export servicio_fondo > alpine_custom.tar
$ ls -lh alpine_custom.tar
-rw-r--r-- 1 user user 5.2M Oct 24 10:15 alpine_custom.tar
En el servidor de destino, este archivo se importa como una nueva imagen mediante docker import:
$ cat alpine_custom.tar | docker import - alpine_custom:v1.0
sha256:1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7a8b9c0d1e2f
$ docker images | grep alpine_custom
alpine_custom v1.0 1a2b3c4d5e6f 1 minute ago 5.2MB
Eliminación de Contenedores
Los contenedores detenidos pueden eliminarse del sistema para liberar recursos. Se recomienda detenerlos previamente, aunque es posible forzar la eliminación con la opción -f:
$ docker rm mi_contenedor_alpine
mi_contenedor_alpine
Gestión del Almacenamiento
Por defecto, Docker almacena todas sus capas de imágenes, contenedores, volúmenes y registros en el directorio /var/lib/docker. En entornos de producción, es una práctica recomendada montar este directorio en una partición dedicada o un volumen lógico (LVM) de gran capacidad para evitar que el disco raíz del sistema host se llene debido al crecimiento de las imágenes y logs.