Como desarrolladoras/es web, analicemos la situación en la que nos encontramos ahora:
Cuando desarrolle una aplicación web, es casi seguro que necesitaré tener en el sistema:
- Un servidor web: p.e apache
- Un intérprete de código: p.e php
- Un servidor de bases de datos: p.e mysql
- Una herramienta para gestionar: p.e phpmyadmin
- Otros elementos, como copias de seguridad.

Ante esta situación qué hacemos

Estructura de un fichero compose.yaml
- Podría tener un contenedor con todos los servicios.
- Pero vaya lío tener todo en un contenedor
- ¿Podría tener un contenedor con cada servicio?
Para ello disponemos de una utilidad de docker llamada docker compose
Docker Compose es una herramienta que permite definir y levantar varios contenedores de forma conjunta. Los contenedores se definen en un fichero, compose.yaml, escrito en formato YAML (YAML Ain't Markup Language, «YAML no es un lenguaje de marcado»). En este fichero definimos principalmente servicios (que son los contenedores) , redes y volúmenes. Cada servicio describe un tipo de contenedor que queremos ejecutar.
Un docker run con cinco flags o parámetros (-t -i --name -p -v ) es más complicado y puede resultar difícil de recordar. El entorno de ejecución de clase serán dos ficheros al lado del código. La creación de la imagen y levantar los contenedores o servicios: Dockerfile y compose.
En este comando ha habido una modificación respecto a la versión anterior de docker. El comando actual es el plugin (docker compose, con espacio), no docker-compose.
Fichero de configuración
Es un fichero llamado compose.yaml (también puede utilizarse
compose.yml).- YAML o YML es un formato declarativo, cuya configuración y sintaxis es
muy sencilla.
YAML viene de YAML Ain't Markup Language («YAML no es un lenguaje de marcado»), especificando que no es un lenguaje de marcado como XML o HTML:
- Tiene en cuenta la indentación para crear bloques.
- Asignamos valores utilizando
:(dos puntos), debiendo haber un espacio entre los dos puntos y el valor. - Para crear listas utiliza guiones
-.
Es un fichero muy fácil de entender.
Creando el fichero- Vamos a ver la construcción del fichero compose.yaml.
- Posteriormente veremos cómo ejecutar el fichero y construir nuestro entorno de desarrollo.
Sintaxis del fichero
El fichero compose.yaml tiene diferentes opciones de configuración que podemos jerarquizar mediante la indentación.
Es un fichero de configuración con formato YAML.


Comando docker para compose
Levanta el proyecto. -d en segundo plano. --build reconstruye la imagen si cambió el Dockerfile.
Estado de estos servicios (no de todos los contenedores de tu máquina).
Logs del conjunto. -f sigue la salida.
Para y quita los contenedores del proyecto. Los volúmenes nombrados se quedan, salvo --volumes.
YAML: la indentación agrupa; espacio después de :. Un tab mal puesto tira el fichero.
Nuestro entorno de ejecución (para desarrollo web)
Vamos a crear un entorno que puede ser como se comenta en la imagen siguiente 
proyecto/
docker/
Dockerfile
compose.yaml
app/
index.phpservices:
web:
build: ..
ports:
- "8800:80"
volumes:
- ../app:/var/www/html
container_name: web- build: . usa el
Dockerfilede esa carpeta - 8800:80 →
http://localhost:8800 - ../app:/var/www/html → editas en PhpStorm, Apache sirve al instante
- container_name: web →
docker exec -it web bash
Desde el directorio del compose:
docker compose up -d --buildCuando entre la base de datos
Un solo contenedor con Apache + PHP + MySQL funciona y es un lío. Mejor un servicio por proceso. Compose les pone una red: desde PHP el host de MySQL no es localhost, es el nombre del servicio (db).
services:
web:
build: .
ports:
- "8800:80"
volumes:
- ../app:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: ejemplo
MYSQL_USER: usuario
MYSQL_PASSWORD: secreto
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:Eso llega con persistencia y formularios. El día uno del laboratorio basta el servicio web.
docker compose ps— ¿estáUpoExit?docker compose logs -f— el error suele estar al final- Puerto 8800 ocupado: cambia el izquierdo (
8801:80) o cierra lo que lo usa - Permiso denegado al socket: instalación (grupo
docker)