Salta el contingut

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à.