
Damos unas comparaciones para entre los conceptos claves de Docker como lo es los contenedores e imágenes con tecnologías que empleamos siempre como lo son PHP, Node y Python.
Introducimos LOS CONCEPTOS CLAVES de Imágenes, Contenedores, Cliente y Demonio y por supuesto, el de Docker.
Hablamos sobre como instalar Docker, y que es lo que instalamos realmente...
Ejecutamos el siguiente comando:
docker run -d -p 8080:80 nginx
Con el cual se descarga la imagen de nginix, se crea el contenedor y se expone en el puerto 8080.
Ejecutamos el siguiente comando:
docker images
Ejecutamos el siguiente comando:
docker run
Con el cual ejecuta una imagen y crea un contenedor, hablemos sobre aspectos de configuración mediante parámetros y ejemplos de uso.
Ejecutamos el siguiente comando:
docker ps -a
Con el cual veremos TODOS los contenedores y:
docker ps
Muestra TODOS los contenedores ejecutandose .
Ejecutamos el siguiente comando:
docker stop ID/NAME
Detenemos los contenedores que se encuentren ejecutándose.
Ejecutamos el siguiente comando:
docker rm ID/NAME
Para eliminar un contenedor
Ejecutamos el siguiente comando:
docker logs ID/NAME
Veremos el log o la traza de un contenedor
Ejecutamos el siguiente comando:
docker rmi ID/NAME
Eliminamos una imagen
Ejecutamos el siguiente comando:
docker exec -it bash - Entrar dentro de un contenedor ACTIVO en modo interactivo (habilita el bash para lanzar comandos)
docker run -it Container ID (Ej ubuntu) Crea el contenedor y lo deja en modo interactivo (habilita el bash para lanzar comandos)
Vemos cómo ver el consumo de CPU y memoria en Docker (con docker stats)
Hablamos sobre como generar imágenes en Docker, en donde las claves es el archivo Dockerfile sobre nuestros proyectos y el comando de Dockerfile
Los Dockerfiles son la pieza clave para poder crear imágenes personalizadas, te explico sus opciones claves.
Te mostramos paso a paso cómo crear una imagen Docker limpia y eficiente para tu aplicación web desarrollada en Flask y como generar el contenedor.
? Te mostramos paso a paso cómo crear una imagen Docker de tu proyecto en Flask junto con el servidor de Gunicorn en Docker.
"Docker no se conecta a tu localhost… hasta que usas esto"
Donde continua el curso
Este curso ofrece una guía completa para iniciarse en el mundo de Docker, abarcando desde los conceptos más elementales hasta la orquestación de aplicaciones complejas con Docker Compose, con un enfoque práctico para desarrolladores.
1. Introducción a Docker y sus Conceptos Fundamentales
Antes de sumergirse en los comandos, es crucial entender la filosofía detrás de Docker y sus componentes principales.
¿Qué es Docker y por qué usarlo?
Docker es una plataforma que permite empaquetar aplicaciones junto con todas sus dependencias (librerías, configuraciones, etc.) en unidades estandarizadas llamadas contenedores. El objetivo principal es garantizar que una aplicación se ejecute de manera consistente en cualquier entorno, ya sea la máquina de un desarrollador, un servidor de pruebas o la nube.
La necesidad de Docker se comprende mejor con analogías. Al igual que los ambientes virtuales en Python (venv, pipenv) aíslan las dependencias de un proyecto para evitar conflictos entre versiones (por ejemplo, tener un proyecto con Django 4 y otro con Django 7 en la misma máquina), Docker encapsula toda la aplicación y su entorno, previniendo problemas de compatibilidad con el sistema operativo anfitrión y otros proyectos.
Imágenes (Images): Las Plantillas de tus Aplicaciones
Una imagen de Docker es una plantilla inmutable y de solo lectura que contiene todo lo necesario para ejecutar una aplicación: el sistema de archivos, el código, las librerías y las variables de entorno. Se puede pensar en una imagen como un archivo .exe o una clase en programación orientada a objetos: es un paquete estático que no hace nada por sí solo hasta que se ejecuta. Ejemplos de imágenes populares son python, ubuntu, nginx y postgres.
Contenedores (Containers): Las Instancias en Ejecución
Un contenedor es una instancia en ejecución de una imagen. Si la imagen es el plano, el contenedor es la casa construida a partir de ese plano. Al lanzar un contenedor, este se ejecuta como un proceso aislado con su propio sistema de archivos, red y entorno, pero compartiendo el kernel del sistema operativo anfitrión, lo que lo hace mucho más ligero que una máquina virtual completa. Los contenedores son portátiles, autocontenidos y pueden ser creados, iniciados, detenidos y eliminados de forma independiente.
2. Arquitectura y Comandos Esenciales de Docker
Para interactuar con Docker, se utilizan principalmente dos componentes que trabajan en conjunto.
El Cliente (docker) y el Demonio (dockerd)
Docker Client (docker): Es la herramienta de línea de comandos (CLI) con la que el usuario interactúa. Cuando escribes un comando como docker run, estás usando el cliente.
Docker Daemon (dockerd): Es el motor de Docker, un proceso que se ejecuta en segundo plano y se encarga de gestionar las imágenes, contenedores, redes y volúmenes. El cliente envía las instrucciones al demonio, y este las ejecuta.
Comandos Imprescindibles para la Gestión
docker images: Lista todas las imágenes descargadas en tu sistema.
docker ps: Muestra los contenedores que están actualmente en ejecución.
docker ps -a: Muestra todos los contenedores, tanto activos como detenidos.
docker run <imagen>: Crea y arranca un nuevo contenedor a partir de una imagen.
docker stop <id/nombre>: Detiene un contenedor en ejecución.
docker rm <id/nombre>: Elimina un contenedor detenido.
docker rmi <id/nombre>: Elimina una imagen.
docker logs <id/nombre>: Muestra los registros (logs) de un contenedor, útil para depurar.
docker exec -it <id/nombre> bash: Permite acceder a una terminal interactiva dentro de un contenedor que ya está en ejecución.
3. Creación de Imágenes Personalizadas con Dockerfile
El verdadero poder de Docker para los desarrolladores reside en la capacidad de crear imágenes propias para sus proyectos.
El Archivo Dockerfile
Un Dockerfile es un archivo de texto sin extensión que contiene un conjunto de instrucciones secuenciales para construir una imagen personalizada. Su estructura típica incluye:
FROM: Define la imagen base sobre la cual se construirá la nueva imagen (ej. FROM python:3.12-slim).
WORKDIR: Establece el directorio de trabajo dentro del contenedor (ej. WORKDIR /app).
COPY: Copia archivos desde el sistema anfitrión al contenedor (ej. COPY requirements.txt .).
RUN: Ejecuta comandos durante el proceso de construcción, como la instalación de dependencias (ej. RUN pip install -r requirements.txt).
EXPOSE: Informa a Docker sobre los puertos que el contenedor expondrá (ej. EXPOSE 5050).
CMD: Especifica el comando por defecto que se ejecutará al iniciar el contenedor (ej. CMD ["python", "app py"]).
Una vez definido el Dockerfile, la imagen se construye con el comando docker build -t mi-app ..
4. Orquestación de Múltiples Contenedores con Docker Compose
Para aplicaciones que requieren múltiples servicios (como una aplicación web, una base de datos y un servidor de caché), Docker Compose simplifica la gestión.
¿Qué es Docker Compose?
Es una herramienta que permite definir y ejecutar aplicaciones multi-contenedor a través de un único archivo de configuración llamado docker-compose.yml. En este archivo se definen los "servicios" que componen la aplicación, donde cada servicio es un contenedor.
El Archivo docker-compose.yml
Este archivo YAML define los servicios, redes y volúmenes. Por ejemplo, se puede definir un servicio web para una aplicación Flask y un servicio redis para la caché. Compose se encarga de crear y conectar los contenedores de forma automática. Los comandos principales son docker compose up para levantar la aplicación y docker compose down para detenerla.
5. Optimización del Flujo de Desarrollo
Para que Docker sea una herramienta de desarrollo eficiente, es fundamental que los cambios en el código se reflejen en tiempo real sin necesidad de reconstruir la imagen constantemente.
Volúmenes para la Persistencia de Datos
Los volúmenes permiten persistir datos fuera del ciclo de vida de un contenedor. Funcionan como un disco duro externo, montando un directorio del sistema anfitrión dentro del contenedor. Esto es clave para el desarrollo, ya que el código fuente puede vivir en la máquina local y ser "sincronizado" con el contenedor.
Docker Compose Watch: Sincronización en Tiempo Real
Docker Compose incluye una funcionalidad de watch que monitorea los cambios en los archivos locales y los sincroniza automáticamente con el contenedor. Esto se configura en el archivo docker-compose.yml dentro de una sección develop. Al ejecutar docker compose up --watch, los cambios en el código se reflejan instantáneamente en la aplicación que se ejecuta dentro del contenedor, creando un flujo de trabajo de desarrollo ágil y eficiente.