Saltar la navegación

7.2 El archivo docker-compose.yml

Como ya hemos dicho en el apartado anterior el fichero docker-compose.yml es un fichero en formato YAML que contiene las instrucciones para crear y configurar los servicios que van a constituir mi aplicación o entorno. Su estructura general es la siguiente:

Estructura general de un docker-compose.yml
Juan Diego Pérez Jiménez. Estructura general de un docker-compose.yml (Dominio público)


Dentro de cada una de estas secciones tenemos multitud de opciones. Es imposible tratar todas de manera detallada así que nos vamos a centrar en ejemplos para conseguir:

  • Asociar contenedores e imágenes a los servicios creados.
  • Especificar las distintas variables de entorno que pueden tener los contenedores creados. Recordad que hay que consultar siempre la página de cada imagen en DockerHub.
  • Establecer las redirecciones de puertos si fueran necesarias.
  • Persistir los datos de los contenedores usando bind mounts o volúmenes . Definiremos los volúmenes, si es necesario, para que sean usados por los contenedores.
  • Definir redes para asociarlas a los contenedores en caso de que queramos que no usen la red por defecto. En el módulo 5 hablamos de las diferencias entre la red por defecto y las redes creadas por el usuario.
  • Establecer orden de inicio para los contenedores que componen mi aplicación.

ASOCIAR CONTENEDORES A SERVICIOS

version: '3'

  # Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre miapache

    miapache:

     # Ese contenedor usará como imagen de base la imagen httpd(Servidor Apache) de DockerHub.

      image: httpd

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: web

ESPECIFICAR LAS VARIABLES DE ENTORNO PARA  LOS CONTENEDORES

version: '3'

  # Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre datos

    datos:

     # Ese contenedor usará como imagen de base la imagen mariadb (Servidor de base de datos) de DockerHub.

      image: mariadb

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: bd

      # Establezco las variables de entorno para configurar el servicio

      environment:

        MYSQL_ROOT_PASSWORD: 123456

        MYSQL_DATABASE: test

        MYSQL_USER: pepe

        MYSQL_PASSWORD: pepe

ESTABLEZCO LA REDIRECCIÓN DE PUERTOS SI FUERA NECESARIO

version: '3'

  # Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre miapache

    miapache:

     # Ese contenedor usará como imagen de base la imagen httpd(Servidor Apache) de DockerHub.

      image: httpd

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: web

      # Establezco la redirección de puertos

      ports:

        - 8080:80

PERSISTO LOS DATOS USANDO UN BIND MOUNT PARA EL SERVIDOR WEB

version: '3'

  # Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre miapache

    miapache:

     # Ese contenedor usará como imagen de base la imagen httpd(Servidor Apache) de DockerHub.

      image: httpd

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: web

      # Establezco un bind bound de la carpeta src de mi equipo en la carpeta /app del contenedor.

      volumes:

        - "./src:/app"

       # Notación alternativa a lo anterior

       - type: bind

         source: "./src"

         target: /app

PERSISTIR LOS DATOS PARA QUE EL SERVIDOR DE BASE DE DATOS USE UN VOLUMEN

version: '3'

  services:

    # Declaro un servicio con nombre datos

    datos:

     # Ese contenedor usará como imagen de base la imagen mariadb (Servidor de base de datos) de DockerHub.

      image: mariadb

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: bd

      .........

      # Establezco que los datos de la base de datos van a persistir en el volumen datosapp que se montará en /var/lib/mysql

      volumes:

        - "datosapp:/var/lib/mysql"

      # Notación alternativa a lo anterior

      volumes:

        - type: volume

          src: datosapp

          target: "var/lib/mysql"

 # Sección para la definición de los volúmenes. Está al mismo nivel de la sección services

  volumes:

    datosapp: local

DEFINIR REDES PARA ASOCIARLAS A LOS CONTENEDORES

version: '3'

# Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre miapache

    miapache:

     # Ese contenedor usará como imagen de base la imagen httpd(Servidor Apache) de DockerHub.

      image: httpd

      # Le doy nombre al contenedor cuando arranque (equivalente al flag --name de docker un) 

      container_name: web

      # Establezco el nombre de red para el contenedor

      hostname: web

      # Establezco la red o redes a las que se va a conectar el contenedor

      networks:

        - ejemplo

...

# Sección de definición de redes. Está al mismo nivel que services y volumes

networks:

  # Definición de la red ejemplo

  ejemplo:

    # Tipo de red

    driver: bridge

    # Opciones de la red

    ipam:

      driver: default

      config:

        subnet: 172.20.0.0/16

ESTABLECER ORDEN DE INICIO DE LOS CONTENEDORES

version: '3'

# Empieza la sección de servicios.

  services:

    # Declaro un servicio con nombre miapache

    miapache:

     # Ese contenedor usará como imagen de base la imagen httpd(Servidor Apache) de DockerHub.

      image: httpd

      ....

     # Este contenedor arrancará después el contenedor del servicio datos

      depends_on:
        - datos

   # Comienzo de descripción del servicio de datos

    datos:

      image: mariadb

      ....

NOTA: LA NOTACIÓN YAML ESTABLECE 2 ESPACIOS PARA LA TABULACIÓN DE LOS DISTINTOS NIVELES:

EJEMPLO COMPLETO

docker-compose.yml que une todo lo expuesto anteriormente.

Creado con eXeLearning (Ventana nueva)