Clase 3 - Introducción a Docker
1. ¿Qué es Docker?
Docker es una plataforma de código abierto que te permite crear, probar y desplegar aplicaciones dentro de contenedores. Los contenedores son entornos ligeros y portátiles que incluyen todo lo necesario para ejecutar una aplicación: código, runtime, herramientas del sistema, bibliotecas y configuraciones.
1.1 ¿Por qué usar Docker?
- Consistencia: La aplicación se ejecuta de la misma manera en cualquier entorno (desarrollo, pruebas, producción)
- Aislamiento: Las aplicaciones y sus dependencias están aisladas, evitando conflictos
- Eficiencia: Los contenedores comparten el sistema operativo del host, son más ligeros que las máquinas virtuales
- Portabilidad: “Si funciona en mi computadora, funcionará en todas partes”
- Escalabilidad: Facilita desplegar múltiples instancias de tu aplicación
2. Verificar la instalación de Docker
Después de instalar Docker, abrimos la terminal y ejecutamos:
docker --versiondocker run hello-worldEl segundo comando descargará una imagen pequeña y ejecutará un contenedor que mostrará un mensaje de confirmación.
3. Conceptos Básicos de Docker
3.1 Imágenes
Una imagen de Docker es una plantilla de solo lectura que contiene el sistema operativo, aplicaciones, dependencias y configuraciones necesarias para ejecutar una aplicación.
Las imágenes de Docker:
- Son inmutables (no cambian)
- Están compuestas por capas
- Se pueden encontrar en Docker Hub (repositorio público) o en registros privados
3.2 Contenedores
Un contenedor es una instancia en ejecución de una imagen. Es un proceso aislado que ejecuta la aplicación definida en la imagen.
Características importantes:
- Son ligeros y eficientes
- Están aislados entre sí y del sistema host
- Pueden ser iniciados, detenidos, movidos y eliminados
- Su ciclo de vida es independiente de otros contenedores
3.3 Dockerfile
Un Dockerfile es un archivo de texto que contiene las instrucciones para construir una imagen de Docker. Define qué sistema operativo usar, qué paquetes instalar, qué archivos copiar y qué comandos ejecutar.
Ejemplo básico de un Dockerfile:
FROM node:18WORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["npm", "start"]3.4 Volúmenes
Los volúmenes en Docker son el mecanismo para almacenar datos persistentes fuera de los contenedores. Cuando un contenedor se elimina, los datos almacenados en volúmenes persisten.
Usos comunes:
- Almacenar datos de bases de datos
- Compartir archivos entre contenedores
- Guardar logs y configuraciones persistentes
3.5 Redes
Docker permite crear redes virtuales para que los contenedores se comuniquen entre sí de forma segura y aislada.
Tipos de redes:
- Bridge: Red por defecto para contenedores en un solo host
- Host: El contenedor comparte la red del host
- None: Sin acceso a red
- Overlay: Red para comunicar contenedores en diferentes hosts
- Macvlan: Asigna una dirección MAC a cada contenedor
4. Comandos Básicos de Docker
4.1 Gestión de Imágenes
# Listar imágenesdocker images
# Descargar una imagendocker pull nombre_imagen:tag
# Construir una imagen desde un Dockerfiledocker build -t mi_imagen:tag .
# Eliminar una imagendocker rmi nombre_imagen:tag4.2 Gestión de Contenedores
# Crear y ejecutar un contenedordocker run --name mi_contenedor -p 8080:80 -d nombre_imagen:tag
# Listar contenedores en ejecucióndocker ps
# Listar todos los contenedores (incluso los detenidos)docker ps -a
# Detener un contenedordocker stop mi_contenedor
# Iniciar un contenedor detenidodocker start mi_contenedor
# Eliminar un contenedordocker rm mi_contenedor
# Ver logs de un contenedordocker logs mi_contenedor
# Ejecutar un comando dentro de un contenedor en ejecucióndocker exec -it mi_contenedor bash5. Docker Compose
Docker Compose es una herramienta que simplifica el trabajo con múltiples contenedores, permitiendo definirlos y configurarlos en un solo archivo YAML.
5.1 Archivo docker-compose.yml
Ejemplo básico:
services: web: image: nginx:latest ports: - '8080:80' volumes: - ./website:/usr/share/nginx/html
db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: secretpassword MYSQL_DATABASE: myapp volumes: - db_data:/var/lib/mysql
volumes: db_data:5.2 Comandos de Docker Compose
# Iniciar todos los servicios definidosdocker compose up -d
# Detener todos los serviciosdocker compose down
# Ver logs de todos los serviciosdocker compose logs
# Reiniciar un servicio específicodocker compose restart nombre_servicio6. Desafíos Prácticos
Desafío 1: Tu primera imagen Docker
Objetivo: Crear una imagen para una página web HTML simple.
-
Crea un directorio para el proyecto:
Ventana de terminal mkdir mi-primer-dockercd mi-primer-docker -
Crea un archivo index.html:
<!DOCTYPE html><html><head><title>Mi Primera Página con Docker</title></head><body><h1>¡Hola, Docker!</h1><p>Esta es mi primera página web servida desde un contenedor Docker.</p></body></html> -
Crea un Dockerfile:
FROM nginx:latestCOPY index.html /usr/share/nginx/html/ -
Construye la imagen:
Ventana de terminal docker build -t mi-primera-imagen . -
Ejecuta un contenedor:
Ventana de terminal docker run --name mi-web -p 8080:80 -d mi-primera-imagen -
Visita
http://localhost:8080en tu navegador para ver tu página web.
Desafío 2: Contenedor con persistencia
Objetivo: Ejecutar un contenedor donde puedas modificar archivos y los cambios persistan.
-
Crea un directorio para tu sitio web:
Ventana de terminal mkdir mi-sitioecho "<h1>Mi sitio web con volumen</h1>" > mi-sitio/index.html -
Ejecuta un contenedor con un volumen:
Ventana de terminal docker run --name nginx-persistente -p 8081:80 -v $(pwd)/mi-sitio:/usr/share/nginx/html -d nginx -
Visita
http://localhost:8081en tu navegador. -
Modifica el archivo index.html en tu computadora y recarga la página.
Desafío 3: Docker Compose - Aplicación Web con Base de Datos
Objetivo: Crear un entorno de desarrollo para una aplicación web con base de datos.
-
Crea un directorio para el proyecto:
Ventana de terminal mkdir app-web-dbcd app-web-db -
Crea un archivo docker-compose.yml:
services:web:image: nginx:latestports:- '8082:80'volumes:- ./www:/usr/share/nginx/htmldepends_on:- dbdb:image: mariadb:latestenvironment:MARIADB_ROOT_PASSWORD: ejemplo123MARIADB_DATABASE: miappMARIADB_USER: usuarioMARIADB_PASSWORD: clave123volumes:- datos_db:/var/lib/mysqlvolumes:datos_db: -
Crea un directorio www con un archivo index.html básico:
Ventana de terminal mkdir wwwecho "<h1>Mi aplicación con Docker Compose</h1>" > www/index.html -
Inicia los servicios:
Ventana de terminal docker compose up -d -
Visita
http://localhost:8082en tu navegador.
7. Buenas Prácticas
7.1 Imágenes
- Usa imágenes oficiales cuando sea posible
- Usa tags específicos en lugar de
latest - Mantén las imágenes pequeñas (Alpine/Slim cuando sea posible)
7.2 Contenedores
- Trátalos como efímeros (pueden ser reemplazados en cualquier momento)
- Usa volúmenes para datos persistentes
- Limpia contenedores e imágenes no utilizados
8. Recursos Adicionales
Glosario
- Contenedor: Instancia en ejecución de una imagen Docker
- Imagen: Plantilla de solo lectura con instrucciones para crear contenedores
- Dockerfile: Archivo de texto que define cómo construir una imagen
- Docker Hub: Registro público de imágenes Docker
- Volumen: Mecanismo para persistir datos generados por contenedores
- Docker Compose: Herramienta para definir y gestionar aplicaciones multi-contenedor