Docker es una plataforma que nos permite empaquetar aplicaciones completas en pequeñas cajitas llamadas contenedores. Estos contenedores incluyen el código completo de la aplicación, las bibliotecas, las herramientas y todo lo necesario para que las aplicaciones se ejecuten en un entorno seguro aisladas del host. En este post vamos a ver lo básico de Docker y, en entradas posteriores, profundizaré en sus funciones y uso.
Instalación de Docker.
Voy a instalar Docker en un sistema GNU/Linux, específicamente en la distribución Kali Linux pero la plataforma se puede usar en cualquiera de los SO principales. Solo vayan a su web oficial y sigan las instrucciones. Para instalarla en Kali, o en cualquier distro de base Debian, usaremos el comando: sudo apt install docker.io
Ahora que tenemos Docker instalado iniciaremos su demonio para que los contenedores puedan ser creados y administrados. Para iniciar el demonio de Docker, se puede utilizar el comando service docker start. Este comando iniciará el servicio del demonio de Docker, que es responsable de gestionar los contenedores y asegurarse de que funcionen correctamente.
Para verificar que Docker esté corriendo usaremos el comando service docker status. En nuestra terminal veremos que el servicio está activo (corriendo):

Dockerfile.
Un archivo Dockerfile se compone de varias secciones, cada una de las cuales comienza con una palabra clave en mayúsculas, seguida de uno o más argumentos. Algunas de las secciones más comunes en un archivo Dockerfile son:
- FROM: se utiliza para especificar la imagen base desde la cual se construirá la nueva imagen.
- RUN: se utiliza para ejecutar comandos en el interior del contenedor, como la instalación de paquetes o la configuración del entorno.
- COPY: se utiliza para copiar archivos desde el sistema host al interior del contenedor.
- CMD: se utiliza para especificar el comando que se ejecutará cuando se arranque el contenedor.
Además de estas secciones, también se pueden incluir otras instrucciones para configurar el entorno, instalar paquetes adicionales, exponer puertos de red y más.

Creando una imagen Docker.
Las imágenes de Docker son plantillas de solo lectura que contienen instrucciones para crear un contenedor. Una imagen de Docker es una instantánea o un esquema de las bibliotecas y dependencias necesarias dentro de un contenedor para que se ejecute una aplicación.
Una analogía válida sería que las imágenes son la receta mientras que los contenedores son el plato terminado. Veámoslo con un ejemplo práctico. Crearemos una nueva imagen basándonos en las instrucciones que contiene el siguiente Dockerfile:

Este Dockerfile contiene las instrucciones para crear la imagen de un webserver basado en la última versión de Ubuntu, pide que se actualice el sistema, que se instalen unos paquetes, que se exponga en el puerto 80 y que inicie el servicio de Apache.
El comando para crear la imagen sería: docker build -t webserver . Donde build le ordena construir la imagen con base en lo especificado en el Dockerfile; -t me permite asignarle una etiqueta, en este caso webserver y el . al final le indica que use el Dockerfile que está en el mismo directorio desde donde estoy lanzando el comando. Si el Dockerfile se encuentra en otro directorio quitamos el . y le decimos la ruta. En nuestra terminal veremos algo como:

Para comprobar que la imagen webserver fue creada lanzaremos el comando docker images y en la terminal veremos todas las imagenes que actualmente tenemos:

Si queremos borrar una imagen específica usaremos el comando docker rmi <imagen> y si lo que queremos es borrar todas las imágenes creadas usaremos: docker rmi $(docker images -q).
Creando contenedores.
Comenzando el post expliqué muy a grosso modo lo que son los contenedores. Como ya tenemos los ingredientes (la imagen webserver) ya podemos crear nuestro plato (el contenedor). Esto lo haremos con el comando: docker run -dit -p 80 --name theWeb webserver. Esto le dice a docker que cree un contenedor llamado theWeb, basado en la imagen webserver, que corra en segundo plano d, que sea interactivo i y que me permite usar la consola virtual t.
La salida de nuestra orden será:

Si queremos listar los contenedores que se encuentran en ejecución usaremos el comando docker ps y veremos algo como:

Y si lo que queremos es listar los contenedores que se encuentran en ejecución, y también los contenedores cerrados, usaremos el comando docker ps -a y veremos algo como:

Como lo que creé fue un servidor web y en la orden de creación del contenedor le pedí que corriera en el puerto 80 (-p 80), si voy al navegador y pongo la dirección http://localhost:80 tendré que ver:

Ahora, si lo que quiero es interactuar con el contenedor (theWeb) y todos sus componentes desde la terminal lo que debo hacer es lanzar el comando: docker exec -i theWeb bash. En la consola no veré nada diferente a la sesión en que me encontraba pero si escribo el comando whoami veré que soy root.
Ahora listaré todos los elementos presentes con el comando ls -lah y obtendré:

Si ya terminamos de trabajar con ese contenedor podemos detenerlo con docker stop theWeb. Si lo que queremos es eliminar el contenedor: docker rm theWeb. Si ya no vamos a joder más con Docker, imágenes ni contenedores entonces detenemos el servicio con service docker stop.
Eso es lo básico de Docker, lo superficial. Otro día seguimos con docker-compose y la creación de laboratorios locales para practicar ciberseguridad porque ya me aburrí. Hasta la próxima.
