Saltar al contenido

Clase 3 - Introducción a Docker

#docker #desarrollo-web #devops

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:

Ventana de terminal
docker --version
docker run hello-world

El 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:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["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

Ventana de terminal
# Listar imágenes
docker images
# Descargar una imagen
docker pull nombre_imagen:tag
# Construir una imagen desde un Dockerfile
docker build -t mi_imagen:tag .
# Eliminar una imagen
docker rmi nombre_imagen:tag

4.2 Gestión de Contenedores

Ventana de terminal
# Crear y ejecutar un contenedor
docker run --name mi_contenedor -p 8080:80 -d nombre_imagen:tag
# Listar contenedores en ejecución
docker ps
# Listar todos los contenedores (incluso los detenidos)
docker ps -a
# Detener un contenedor
docker stop mi_contenedor
# Iniciar un contenedor detenido
docker start mi_contenedor
# Eliminar un contenedor
docker rm mi_contenedor
# Ver logs de un contenedor
docker logs mi_contenedor
# Ejecutar un comando dentro de un contenedor en ejecución
docker exec -it mi_contenedor bash

5. 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

Ventana de terminal
# Iniciar todos los servicios definidos
docker compose up -d
# Detener todos los servicios
docker compose down
# Ver logs de todos los servicios
docker compose logs
# Reiniciar un servicio específico
docker compose restart nombre_servicio

6. Desafíos Prácticos

Desafío 1: Tu primera imagen Docker

Objetivo: Crear una imagen para una página web HTML simple.

  1. Crea un directorio para el proyecto:

    Ventana de terminal
    mkdir mi-primer-docker
    cd mi-primer-docker
  2. 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>
  3. Crea un Dockerfile:

    FROM nginx:latest
    COPY index.html /usr/share/nginx/html/
  4. Construye la imagen:

    Ventana de terminal
    docker build -t mi-primera-imagen .
  5. Ejecuta un contenedor:

    Ventana de terminal
    docker run --name mi-web -p 8080:80 -d mi-primera-imagen
  6. Visita http://localhost:8080 en 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.

  1. Crea un directorio para tu sitio web:

    Ventana de terminal
    mkdir mi-sitio
    echo "<h1>Mi sitio web con volumen</h1>" > mi-sitio/index.html
  2. 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
  3. Visita http://localhost:8081 en tu navegador.

  4. 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.

  1. Crea un directorio para el proyecto:

    Ventana de terminal
    mkdir app-web-db
    cd app-web-db
  2. Crea un archivo docker-compose.yml:

    services:
    web:
    image: nginx:latest
    ports:
    - '8082:80'
    volumes:
    - ./www:/usr/share/nginx/html
    depends_on:
    - db
    db:
    image: mariadb:latest
    environment:
    MARIADB_ROOT_PASSWORD: ejemplo123
    MARIADB_DATABASE: miapp
    MARIADB_USER: usuario
    MARIADB_PASSWORD: clave123
    volumes:
    - datos_db:/var/lib/mysql
    volumes:
    datos_db:
  3. Crea un directorio www con un archivo index.html básico:

    Ventana de terminal
    mkdir www
    echo "<h1>Mi aplicación con Docker Compose</h1>" > www/index.html
  4. Inicia los servicios:

    Ventana de terminal
    docker compose up -d
  5. Visita http://localhost:8082 en 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