CodeGym /Cursos /Docker SELF /Creación de docker-compose.yml

Creación de docker-compose.yml

Docker SELF
Nivel 15 , Lección 2
Disponible

3.1 Archivo compose.yaml

El archivo compose.yaml (o alguna de estas otras opciones: docker-compose.yaml, docker-compose.yml, compose.yml) es el archivo principal de configuración que usa Docker Compose para definir y gestionar aplicaciones multicontenedor. Describe qué contenedores (servicios) deben ejecutarse, cómo interactúan entre sí y qué recursos necesitan.

Para mantener consistencia en esta lección, usaremos la opción compose.yaml, ya que se recomienda para las versiones modernas de Docker Compose.

Estructura del archivo compose.yaml

El archivo compose.yaml está compuesto de varias secciones, cada una describiendo diferentes aspectos de la configuración de la aplicación. Las secciones principales incluyen:

  1. version: especifica la versión del archivo Compose (por ejemplo, '3.9').
  2. services: describe los contenedores (servicios), sus configuraciones y dependencias.
  3. volumes: define volúmenes para almacenar datos entre los contenedores y el host.
  4. networks: configura las redes a través de las cuales los servicios se comunican entre sí.

3.2 Directivas principales

1. version

La directiva version define la versión de sintaxis de Docker Compose que se usa en el archivo compose.yaml. En el momento de escribir este artículo, la versión más actual es la 3, en particular sus actualizaciones como 3.8 y 3.9.

Yaml

version: '3.9'

2. services

La sección services define los contenedores que Compose debe crear y ejecutar. Cada servicio representa un contenedor independiente con una configuración específica.

Ejemplo:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

En este ejemplo se definen dos servicios: web y db. El servicio web utiliza la imagen nginx:latest y abre el puerto 80. El servicio db utiliza la imagen mongo:latest y conecta un volumen para almacenar datos.

3. volumes

La sección volumes se utiliza para definir volúmenes que pueden ser conectados a contenedores para almacenar datos. Esto es útil para conservar datos al reiniciar contenedores.

Ejemplo:

Yaml

volumes:
  mongo-data:

4. networks

La sección networks permite definir redes personalizadas en las que trabajarán los contenedores. Esto garantiza aislamiento y configuración de las conexiones de red. Si no se especifican redes, Docker Compose creará una red predeterminada y todos los servicios se conectarán a ella.

Ejemplo:

Yaml

networks:
  front-end:
  back-end:

3.3 Directivas para configurar servicios

Directivas principales para configurar servicios:

1. image

La directiva image indica la imagen que será utilizada para crear el contenedor.

Ejemplo:

Yaml

services:
  web:
    image: nginx:latest

2. build

La directiva build se usa para indicar la ruta al Dockerfile que debe ser utilizado para construir la imagen.

Ejemplo:

Yaml

services:
  app:
    build: ./app

3. ports

La directiva ports define los puertos que deben ser abiertos y redirigidos desde la máquina host al contenedor.

Ejemplo:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

La directiva volumes monta volúmenes en los contenedores, lo que permite guardar los datos entre reinicios de los contenedores.

Ejemplo:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

La directiva environment establece variables de entorno para el contenedor.

Ejemplo:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

La directiva depends_on indica que este servicio depende de otros servicios y debe ser ejecutado después de ellos.

¡Importante! Cuando se ejecuta tu servicio, no hay una garantía del 100% de que todos los servicios necesarios para su funcionamiento estén completamente listos. Estarán ejecutados —sí—, pero no se garantiza que funcionen correctamente. Este problema se soluciona con health-check, pero hablaremos de eso más tarde.

Ejemplo:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

La directiva command permite sobrescribir el comando que será ejecutado al iniciar el contenedor.

Ejemplo:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

La directiva networks conecta el servicio a una o más redes.

Ejemplo:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 Ejemplo completo

Ejemplo de archivo completo compose.yaml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

En este ejemplo:

  • Se definieron tres servicios: web, app y db.
  • web usa una imagen Nginx, monta un archivo de configuración y depende del servicio app.
  • app se construye desde un Dockerfile local, monta el código fuente de la aplicación y usa variables de entorno.
  • db usa una imagen de MongoDB y monta un volumen para almacenar los datos.
  • Se crean dos volúmenes y dos redes para aislar y manejar la interacción entre los servicios.

Nota: un volumen es mongo-data y el otro es un directorio montado desde la máquina host (por ejemplo, ./app).

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION