Preparación del entorno de desarrollo
Contar con un entorno de desarrollo que refleje el de producción es crucial para garantizar que las aplicaciones funcionen correctamente una vez desplegadas. Aquí es donde Docker y Docker Compose juegan un papel fundamental.
Introducción a Docker y Docker Compose
Docker es una plataforma que permite empaquetar aplicaciones y sus dependencias en contenedores, asegurando que se ejecuten de manera consistente en cualquier entorno. Docker Compose es una herramienta que simplifica la ejecución de aplicaciones multicontenedor mediante la definición de servicios en un archivo de configuración.
Instalación y configuración de Docker
Para instalar Docker:
-
Descargue e instale Docker Desktop desde el sitio web oficial para su sistema operativo.
-
Tras la instalación, verifique que Docker funciona correctamente ejecutando en la terminal:
docker --versionDebería mostrar la versión instalada de Docker.
Creación de contenedores con Docker Compose
Para ejecutar contenedores con Docker Compose, el punto de partida siempre es un fichero compose.yml, que es el fichero que contiene las instrucciones para la ejecución de los contenedores. Se trata de un fichero YAML, por lo que la identación es muy importante. También se puede nombrar docker-compose.yml.
LAMP
Vamos a levantar un entorno LAMP con Docker Compose. Para ello, debemos crear un fichero compose.yml con el siguiente contenido:
services:
# https://hub.docker.com/_/php/
php:
image: php:8.3.12-apache-bullseye
restart: unless-stopped
volumes:
- ./www:/var/www/html
ports:
- 80:80
depends_on:
- mysql
# https://hub.docker.com/_/mysql
mysql:
image: mysql:9.0.1
restart: unless-stopped
environment:
MYSQL_DATABASE: app
MYSQL_USER: user
MYSQL_PASSWORD: abc123.
MYSQL_ROOT_PASSWORD: abc123.
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
# https://hub.docker.com/_/phpmyadmin
phpmyadmin:
image: phpmyadmin:5.2.1-apache
restart: unless-stopped
links:
- mysql
depends_on:
- mysql
ports:
- 8000:80
environment:
PMA_HOST: mysql
PMA_PORT: 3306
PMA_ARBITRARY: 1
volumes:
mysql_data:
A continuación, ejecutamos el siguiente comando para iniciar los servicios:
docker compose up -d
Este compose.yml define un entorno de desarrollo con los siguientes servicios:
- PHP: Utiliza la imagen
php:8.3.12-apache-bullseye, expone el puerto80para acceder vía HTTP, y monta un volumen local para los archivos de la aplicación PHP (los ficheros.phpse deben colocar en el directoriowww). Depende de MySQL. - MySQL: Usa la imagen
mysql:9.0.1y monta un volumenmysql_datapara persistir los datos de MySQL. Expone el puerto3306. - phpMyAdmin: Interfaz gráfica web para gestionar MySQL, expuesta en el puerto
8000. Depende de MySQL.
Node.js
No es requisito definir más de un contenedor en un compose.yml. Podemos definir uno solo y, también, opcionalmente combinarlo con un Dockerfile.
Si queremos ejecutar un servidor Node.js, podemos definir los siguientes ficheros (deben estar en el mismo directorio):
FROM node:20.18-bullseye
WORKDIR /app
COPY . .
RUN npm install -g nodemon
EXPOSE 3000
CMD ["nodemon", "server.js"]
services:
# https://hub.docker.com/_/node
node:
build: .
volumes:
- ./app:/app
environment:
- NODE_ENV=development
ports:
- 3000:3000
A continuación, ejecutamos el siguiente comando para levantar el servicio:
docker compose up -d --build
Python
Si queremos ejecutar un servidor en Python, podemos definir los siguientes ficheros (deben estar en el mismo directorio):
FROM python:3.13.0-bullseye
WORKDIR /app
RUN pip install watchdog
EXPOSE 4000
CMD ["watchmedo", "auto-restart", "--patterns=*.py", "--recursive", "--", "python3", "/app/server.py"]
services:
# https://hub.docker.com/_/python
python:
build: .
volumes:
- ./app:/app
ports:
- 4000:4000
A continuación, ejecutamos el siguiente comando para levantar el servicio:
docker compose up -d --build
Java
Si queremos ejecutar un servidor en Java, podemos definir un fichero compose.yml:
services:
# https://hub.docker.com/_/openjdk
java:
image: openjdk:24
volumes:
- ./app:/app
working_dir: /app
command: bash -c "javac Server.java && java Server"
ports:
- 5000:5000
A continuación, ejecutamos el siguiente comando para levantar el servicio:
docker compose up -d
Cómo usar Docker Compose
Configuración del entorno de desarrollo
Los volúmenes definidos permiten que trabajes en tu máquina local (host), pero los cambios se reflejan inmediatamente dentro de los contenedores. Esto significa que puedes editar archivos PHP o Node.js en tu editor y ver los resultados de inmediato, sin necesidad de reiniciar los contenedores.
Arrancar los servicios
Para arrancar los servicios definidos en un compose.yml, en el mismo directorio donde se encuentra, ejecutamos:
docker compose up
En las versiones antiguas de Docker Compose, el comando lleva un guión medio. Es decir, sería el siguiente:
docker-compose up
Este comando iniciará todos los servicios y tendremos nuestro stack listo para el desarrollo, pero tiene un problema. Si cerramos la terminal, todos los servicios se detendrán. Por lo tanto, lo que buscamos es que los contenedores corran en segundo plano. Para ello, podemos añadir la opción -d:
docker compose up -d
Este será el comando que utilizaremos de forma más habitual.
Si el stack incluye un fichero Dockerfile, este se debe interpretar para la construcción de una imagen. Esto sólo se hará la primera vez, pero no las siguientes veces que se levanten servicios. Si queremos forzar que siempre se realice la construcción de la imagen, debemos ejecutar el siguiente comando:
docker compose up -d --build
Detener los servicios
Podemos detener los contenedores con:
docker compose down
Esto detendrá y eliminará los contenedores, pero preservará los datos que estén almacenados en volúmenes o en los directorios locales del alfitrión (host).