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:

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: # 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: