0%
Los Fundamentos de Docker: Guía Completa para Desarrolladores

Los Fundamentos de Docker: Guía Completa para Desarrolladores

Descubre los conceptos esenciales de Docker, cómo crear y gestionar contenedores, y las mejores prácticas para la integración continua y el despliegue.

I

InSkillCoach

· min

Los Fundamentos de Docker: Guía Completa para Desarrolladores

Docker ha revolucionado la forma en que desarrollamos, desplegamos y ejecutamos aplicaciones. Esta guía te presenta los conceptos fundamentales de Docker y cómo utilizarlo de forma eficaz en tu flujo de trabajo de desarrollo.

¿Qué es Docker?

Docker es una plataforma de contenedorización que permite empaquetar una aplicación y sus dependencias en un “contenedor” aislado, que podrá ejecutarse en cualquier servidor. A diferencia de las máquinas virtuales, los contenedores no necesitan un hipervisor y se ejecutan directamente sobre el kernel de la máquina anfitriona.

Ventajas de Docker

  • Coherencia de entorno: “Funciona en mi máquina” se convierte en “Funciona en todas partes”
  • Aislamiento: Las aplicaciones se ejecutan de forma aislada sin interferir entre sí
  • Eficiencia de recursos: Más ligero que las VM tradicionales
  • Despliegue rápido: Los contenedores arrancan rápidamente
  • Escalado sencillo: Replicación simple de los contenedores

Arquitectura de Docker

La arquitectura de Docker comprende varios componentes clave:

  • Docker Daemon (dockerd): El servicio que gestiona los contenedores
  • Docker Client: La interfaz de línea de comandos
  • Docker Registry: El repositorio donde se almacenan las imágenes (por ejemplo, Docker Hub)
  • Docker Images: Plantillas de solo lectura utilizadas para crear contenedores
  • Docker Containers: Instancias en ejecución de las imágenes

Instalación de Docker

Windows

# Instalar Docker Desktop para Windows
# Descargar desde https://www.docker.com/products/docker-desktop
# Seguir las instrucciones de instalación

Linux (Ubuntu)

# Actualizar la lista de paquetes
sudo apt-get update

# Instalar los requisitos previos
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

# Añadir la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Configurar el repositorio estable
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Instalar Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# Añadir tu usuario al grupo docker
sudo usermod -aG docker $USER

macOS

# Instalar Docker Desktop para Mac
# Descargar desde https://www.docker.com/products/docker-desktop
# Seguir las instrucciones de instalación

Comandos Esenciales de Docker

Gestión de Imágenes

# Descargar una imagen
docker pull ubuntu:latest

# Listar las imágenes
docker images

# Construir una imagen a partir de un Dockerfile
docker build -t mon-app:1.0 .

# Eliminar una imagen
docker rmi ubuntu:latest

Gestión de Contenedores

# Crear e iniciar un contenedor
docker run -d -p 8080:80 --name mon-conteneur nginx

# Listar los contenedores en ejecución
docker ps

# Listar todos los contenedores (incluidos los detenidos)
docker ps -a

# Detener un contenedor
docker stop mon-conteneur

# Iniciar un contenedor existente
docker start mon-conteneur

# Eliminar un contenedor
docker rm mon-conteneur

Interacción con los Contenedores

# Ejecutar un comando en un contenedor en ejecución
docker exec -it mon-conteneur bash

# Mostrar los logs de un contenedor
docker logs mon-conteneur

# Copiar archivos hacia/desde un contenedor
docker cp mon-fichier.txt mon-conteneur:/chemin/destination
docker cp mon-conteneur:/chemin/source/fichier.txt .

Creación de un Dockerfile

Un Dockerfile es un archivo de texto que contiene todos los comandos para construir una imagen de Docker.

# Utilizar una imagen base
FROM node:14-alpine

# Definir el directorio de trabajo
WORKDIR /app

# Copiar los archivos de dependencias
COPY package*.json ./

# Instalar las dependencias
RUN npm install

# Copiar el resto de los archivos
COPY . .

# Exponer un puerto
EXPOSE 3000

# Definir el comando que se ejecutará al iniciar el contenedor
CMD ["npm", "start"]

Mejores Prácticas para los Dockerfiles

  1. Utilizar imágenes base ligeras como Alpine Linux
  2. Combinar los comandos RUN para reducir el número de capas
  3. Limpiar las cachés tras la instalación de los paquetes
  4. Utilizar .dockerignore para excluir los archivos innecesarios
  5. Especificar versiones precisas para las dependencias
  6. Utilizar usuarios no root para ejecutar la aplicación

Docker Compose

Docker Compose es una herramienta para definir y ejecutar aplicaciones multicontenedor.

Ejemplo de docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://postgres:password@db:5432/app

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=postgres
      - POSTGRES_DB=app

volumes:
  postgres_data:

Comandos de Docker Compose

# Iniciar todos los servicios definidos en docker-compose.yml
docker-compose up -d

# Detener todos los servicios
docker-compose down

# Ver los logs de todos los servicios
docker-compose logs

# Reconstruir las imágenes e iniciar
docker-compose up -d --build

Redes de Docker

Docker crea por defecto varias redes:

  • bridge: Red por defecto para los contenedores
  • host: Elimina el aislamiento de red entre el contenedor y el host
  • none: Desactiva la red

Creación y Gestión de Redes

# Crear una red
docker network create mon-reseau

# Listar las redes
docker network ls

# Conectar un contenedor a una red
docker network connect mon-reseau mon-conteneur

# Inspeccionar una red
docker network inspect mon-reseau

Volúmenes de Docker

Los volúmenes permiten persistir los datos fuera de los contenedores.

Tipos de Volúmenes

  1. Volumen con nombre: Gestionado por Docker
  2. Volumen de enlace (bind mount): Vinculado a una ruta específica del host
  3. Volumen tmpfs: Almacenado en memoria (no persistente)

Comandos de Gestión de Volúmenes

# Crear un volumen con nombre
docker volume create mon-volume

# Listar los volúmenes
docker volume ls

# Utilizar un volumen al iniciar un contenedor
docker run -d -v mon-volume:/data --name mon-conteneur ubuntu

# Asociar un directorio del host a un contenedor
docker run -d -v /chemin/hote:/data --name mon-conteneur ubuntu

# Eliminar un volumen
docker volume rm mon-volume

Docker Registry

Un registry es un servicio de almacenamiento y distribución de imágenes de Docker.

Interacción con Docker Hub

# Iniciar sesión en Docker Hub
docker login

# Etiquetar una imagen
docker tag mon-app:1.0 utilisateur/mon-app:1.0

# Subir una imagen a Docker Hub
docker push utilisateur/mon-app:1.0

# Descargar una imagen desde Docker Hub
docker pull utilisateur/mon-app:1.0

Desplegar un Registry Privado

# Iniciar un registry local
docker run -d -p 5000:5000 --name registry registry:2

# Etiquetar una imagen para el registry local
docker tag mon-app:1.0 localhost:5000/mon-app:1.0

# Subir al registry local
docker push localhost:5000/mon-app:1.0

Seguridad en Docker

Buenas Prácticas

  1. Mantener Docker actualizado para beneficiarse de los parches de seguridad
  2. Escanear las imágenes para detectar vulnerabilidades (con Docker Scout o Trivy)
  3. Limitar las capacidades de los contenedores
  4. Utilizar usuarios no root en los contenedores
  5. Firmar las imágenes con Docker Content Trust
  6. Restringir los recursos (CPU, memoria) de los contenedores

Configuración Segura

# Ejecutar un contenedor con restricciones de recursos
docker run -d --name mon-conteneur --memory="512m" --cpus="0.5" nginx

# Ejecutar un contenedor con un usuario específico
docker run -d --user 1000:1000 --name mon-conteneur nginx

# Ejecutar un contenedor en modo de solo lectura
docker run -d --read-only --name mon-conteneur nginx

Casos de Uso Habituales

Aplicaciones Web

# Ejecutar una aplicación web Node.js
docker run -d -p 3000:3000 --name node-app node-app:1.0

# Ejecutar un servidor Nginx como proxy inverso
docker run -d -p 80:80 --name nginx -v ./nginx.conf:/etc/nginx/nginx.conf nginx

Bases de Datos

# Iniciar una base de datos MySQL
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=password -v mysql_data:/var/lib/mysql mysql:8.0

# Iniciar una base de datos PostgreSQL
docker run -d --name postgres -e POSTGRES_PASSWORD=password -v postgres_data:/var/lib/postgresql/data postgres:13

CI/CD

# Ejecutar pruebas en un contenedor
docker run --rm -v $(pwd):/app -w /app node:14 npm test

# Construir una aplicación en un contenedor
docker run --rm -v $(pwd):/app -w /app maven:3.8-openjdk-11 mvn package

Integración con Kubernetes

Docker funciona muy bien con Kubernetes, el orquestador de contenedores:

  1. Crear imágenes de Docker para tu aplicación
  2. Subir las imágenes a un registry accesible
  3. Definir manifiestos de Kubernetes para desplegar los contenedores
  4. Utilizar kubectl para gestionar los despliegues

Conclusión

Docker ha transformado el desarrollo de software al hacer que las aplicaciones sean más portables, más fáciles de desplegar y de escalar. Dominar Docker se ha convertido en una competencia esencial para los desarrolladores y los profesionales de DevOps.

Siguiendo esta guía, has adquirido los conocimientos fundamentales para:

  • Comprender los conceptos clave de Docker
  • Crear y gestionar contenedores
  • Trabajar con imágenes y volúmenes
  • Utilizar Docker Compose para aplicaciones multicontenedor
  • Seguir las mejores prácticas de seguridad

Para ir más lejos, explora la orquestación de contenedores con Kubernetes, los pipelines de CI/CD basados en Docker y la arquitectura de microservicios.

InSkillCoach

Acerca de InSkillCoach

Experto en formación y tecnologías

Coach especializado en tecnologías avanzadas e IA, impulsado por GNeurone Inc.

Certificaciones:

  • AWS Certified Solutions Architect – Professional
  • Certificaciones de Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.1k
113

Comentarios

Los comentarios funcionan con GitHub Discussions

Inicia sesión con GitHub para participar en la discusión

¡Enlace copiado!