Pràctica 1: Aplicacions amb Docker Compose
Ara que heu après tots els conceptes, anem a posar-ho tot junt amb alguns exemples del món real que podeu utilitzar com a base per els vostres propis projectes.
Exemple 1: WordPress amb MySQL
WordPress és una aplicació perfecta per aprendre Docker Compose perquè necessita una base de dades i té una configuració relativament simple. Creeu un directori nou i dins un fitxer docker-compose.yml:
services:
db:
image: mysql:8.4
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: contrasenya_root
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress_password
wordpress:
depends_on:
- db
image: wordpress:6.7
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress_password
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
volumes:
db_data:
wordpress_data:
Executeu docker-compose up -d i després aneu a http://localhost:8000. Veureu l'instal·lador de WordPress! Totes les dades es guarden als volums, així que podeu aturar i arrencar els contenidors sense perdre res.
Exemple 2: Aplicació Node.js amb MongoDB i Redis
Aquest és un exemple més complex que mostra com funciona una aplicació web moderna amb diverses dependències:
Creeu app.js:
const express = require('express');
const mongoose = require('mongoose');
const redis = require('redis');
const app = express();
const PORT = process.env.PORT || 3000;
// Connexió a MongoDB
mongoose.connect(process.env.MONGODB_URI || 'mongodb://mongo:27017/myapp', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Connexió a Redis
const redisClient = redis.createClient({
url: process.env.REDIS_URL || 'redis://redis:6379'
});
redisClient.connect();
app.get('/', async (req, res) => {
const visits = await redisClient.incr('visits');
res.json({
message: 'Aplicació funcionant!',
visits: visits,
database: mongoose.connection.readyState === 1 ? 'connectada' : 'desconnectada'
});
});
app.listen(PORT, () => {
console.log(`Servidor escoltant al port ${PORT}`);
});
Creeu package.json:
{
"name": "app-exemple",
"version": "1.0.0",
"dependencies": {
"express": "^4.21.2",
"mongoose": "^8.9.5",
"redis": "^4.7.0"
}
}
Creeu Dockerfile:
FROM node:22-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
I finalment docker-compose.yml:
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGODB_URI=mongodb://mongo:27017/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- mongo
- redis
mongo:
image: mongo:8.0
volumes:
- mongo_data:/data/db
redis:
image: redis:7.4-alpine
volumes:
- redis_data:/data
volumes:
mongo_data:
redis_data:
Aquest exemple mostra com una aplicació pot utilitzar múltiples serveis: MongoDB per dades persistents, i Redis per caching i comptadors. Executeu docker-compose up i accediu a http://localhost:3000. Cada vegada que recarregueu la pàgina, el comptador de visites augmentarà.