Etiquetas

Docker (Estructura de un docker-compose y dockerfile )



 El archivo docker-compose.yml define y configura servicios en contenedores de Docker. Su estructura sigue un formato YAML y se compone de varias secciones clave.

Aquí está la estructura básica:

version: "3.8" # Especifica la versión de Docker Compose services: # Sección donde se definen los servicios (contenedores) nombre_servicio: # Nombre del servicio image: imagen_base # Imagen de Docker a utilizar build: # Opcional: Si deseas construir una imagen desde un Dockerfile context: . # Directorio donde está el Dockerfile dockerfile: Dockerfile # Nombre del Dockerfile container_name: nombre_contenedor # Nombre personalizado para el contenedor restart: always # Política de reinicio (always, on-failure, unless-stopped, no) ports: # Mapeo de puertos (host:contenedor) - "8080:80" environment: # Variables de entorno VARIABLE1: valor1 VARIABLE2: valor2 volumes: # Mapeo de volúmenes - ./datos:/var/lib/data networks: # Red a la que pertenece el contenedor - mi_red depends_on: # Dependencias con otros servicios - servicio_dependencia command: ["comando", "argumentos"] # Comando que ejecuta el contenedor volumes: # Definición de volúmenes persistentes mi_volumen: networks: # Definición de redes personalizadas mi_red: driver: bridge

Explicación de las Secciones

version

Define la versión del esquema de Docker Compose. Algunas opciones comunes:

  • "3.8" (Recomendada para compatibilidad con Docker moderno)
  • "2" (Para versiones más antiguas)

services

Define los contenedores a ejecutar.

Cada servicio representa un contenedor con su configuración:

  • image: Nombre de la imagen base a usar (por ejemplo, nginx, postgres).
  • build: Si no usas una imagen preexistente, se puede construir desde un Dockerfile.
  • container_name: Nombre del contenedor.
  • restart: Controla la política de reinicio:
    • always → Siempre reinicia si se detiene.
    • on-failure → Solo si hay un fallo.
    • unless-stopped → Se reinicia excepto si se detuvo manualmente.
    • no → No se reinicia automáticamente.

ports

Expone puertos entre el host y el contenedor:

ports: - "8080:80" # Mapea el puerto 80 del contenedor al 8080 del host

environment

Define variables de entorno dentro del contenedor:


environment: POSTGRES_USER: usuario POSTGRES_PASSWORD: contraseña

volumes

Los volúmenes permiten persistencia de datos:


volumes: - ./mis_datos:/var/lib/data # Mapea un directorio del host al contenedor

Si se define un volumen global:


volumes: mi_volumen:

Y se usa en un servicio:


services: db: volumes: - mi_volumen:/var/lib/postgresql/data

networks

Define redes personalizadas para comunicación entre contenedores:


networks: mi_red: driver: bridge # Tipo de red (bridge, host, overlay)

Y su uso en servicios:


services: servicio1: networks: - mi_red servicio2: networks: - mi_red

depends_on

Especifica dependencias entre servicios:

depends_on: - db

Pero no garantiza que el servicio esté listo antes de iniciar otro. Para eso, usa healthcheck.

command

Define un comando a ejecutar al iniciar el contenedor:

command: ["npm", "start"]

Ejemplo Completo

Este docker-compose.yml levanta una aplicación Node.js con PostgreSQL:

version: "3.8" services: app: build: . container_name: mi_app ports: - "3000:3000" environment: DATABASE_URL: postgres://user:password@db:5432/mydb depends_on: - db networks: - mi_red db: image: postgres:15 container_name: mi_postgres restart: always environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydb ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data networks: - mi_red volumes: db_data: networks: mi_red: driver: bridge

 Comandos Útiles

ComandoDescripción
docker-compose up -dLevanta los servicios en segundo plano.
docker-compose downDetiene y elimina contenedores y redes.
docker-compose psMuestra los servicios en ejecución.
docker-compose logs -fMuestra los logs en tiempo real.
docker-compose exec app shAbre una terminal en el contenedor app.

Estructura de un Dockerfile

Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para crear una imagen de Docker. Su estructura básica suele seguir este orden:


# 1. Imagen base FROM node:18-alpine # O cualquier otra imagen base relevante # 2. Mantenedor (opcional) LABEL maintainer="tu@email.com" # 3. Variables de entorno (opcional) ENV PORT=3000 # 4. Directorio de trabajo dentro del contenedor WORKDIR /app # 5. Copiar archivos al contenedor COPY package.json package-lock.json ./ RUN npm install # Instalar dependencias # 6. Copiar el resto del código fuente COPY . . # 7. Exponer puertos (opcional) EXPOSE 3000 # 8. Comando de inicio del contenedor CMD ["node", "server.js"]

Explicación de cada instrucción:

  1. FROM: Define la imagen base desde la que se construirá la imagen.
  2. LABEL: Información del mantenedor del Dockerfile (opcional).
  3. ENV: Variables de entorno dentro del contenedor.
  4. WORKDIR: Establece el directorio de trabajo dentro del contenedor.
  5. COPY: Copia archivos desde la máquina host al contenedor.
  6. RUN: Ejecuta comandos en el contenedor al momento de construir la imagen.
  7. EXPOSE: Indica qué puertos utilizará la aplicación (no los publica).
  8. CMD: Define el comando por defecto que se ejecutará cuando se inicie un contenedor basado en esta imagen.

Comandos adicionales:

  • ADD: Similar a COPY, pero permite descargar archivos desde URLs y descomprimir archivos .tar.
  • ENTRYPOINT: Similar a CMD, pero permite ejecutar comandos con argumentos personalizados.
  • VOLUME: Define un volumen para persistencia de datos.
  • ARG: Define variables de entorno que solo existen en tiempo de construcción.