Introducció

Un Dockerfile és un fitxer de text que conté una sèrie d'instruccions per construir una imatge Docker. Aquest fitxer defineix tot el que necessita la imatge, incloent-hi el sistema operatiu base, les aplicacions que s'hi instal·laran, les configuracions necessàries i els scripts que s'executaran.

Estructura d'un Dockerfile

Un Dockerfile està format per una sèrie d'instruccions que es processen seqüencialment. A continuació, es presenten les instruccions més comunes i la seva funció:

  1. FROM: Defineix la imatge base a partir de la qual es construirà la nova imatge.
  2. RUN: Executa comandes en el context de la imatge.
  3. COPY: Copia fitxers o directoris des del sistema de fitxers de l'amfitrió a la imatge.
  4. ADD: Similar a COPY, però amb funcionalitats addicionals com la descàrrega d'URL i l'extracció d'arxius.
  5. CMD: Especifica la comanda per defecte que s'executarà quan es llanci un contenidor.
  6. ENTRYPOINT: Configura una aplicació que sempre s'executarà quan es llanci el contenidor.
  7. EXPOSE: Informa Docker que el contenidor escoltarà en els ports especificats en temps d'execució.
  8. ENV: Defineix variables d'entorn.
  9. WORKDIR: Estableix el directori de treball per a les instruccions RUN, CMD, ENTRYPOINT, COPY i ADD.
  10. USER: Estableix l'usuari que s'utilitzarà per executar les instruccions següents.

Exemple de Dockerfile

A continuació, es presenta un exemple senzill de Dockerfile per una aplicació Node.js:

# Utilitza una imatge base oficial de Node.js
FROM node:14

# Estableix el directori de treball dins del contenidor
WORKDIR /app

# Copia el fitxer package.json i package-lock.json
COPY package*.json ./

# Instal·la les dependències de l'aplicació
RUN npm install

# Copia el codi de l'aplicació
COPY . .

# Exposa el port en el qual l'aplicació escoltarà
EXPOSE 3000

# Defineix la comanda per defecte per executar l'aplicació
CMD ["node", "app.js"]

Explicació del Dockerfile

  1. FROM node:14: Utilitza la imatge oficial de Node.js versió 14 com a base.
  2. WORKDIR /app: Estableix /app com a directori de treball dins del contenidor.
  3. COPY package.json ./*: Copia els fitxers package.json i package-lock.json al directori de treball.
  4. RUN npm install: Executa npm install per instal·lar les dependències de l'aplicació.
  5. COPY . .: Copia tot el contingut del directori actual al directori de treball del contenidor.
  6. EXPOSE 3000: Informa Docker que el contenidor escoltarà en el port 3000.
  7. CMD ["node", "app.js"]: Defineix la comanda per defecte per executar l'aplicació Node.js.

Exercicis Pràctics

Exercici 1: Crear un Dockerfile per una aplicació Python

Crea un Dockerfile per una aplicació Python que utilitzi Flask. L'aplicació ha de mostrar "Hello, Docker!" quan s'accedeixi a la ruta principal.

Solució

# Utilitza una imatge base oficial de Python
FROM python:3.8

# Estableix el directori de treball dins del contenidor
WORKDIR /app

# Copia el fitxer requirements.txt
COPY requirements.txt ./

# Instal·la les dependències de l'aplicació
RUN pip install --no-cache-dir -r requirements.txt

# Copia el codi de l'aplicació
COPY . .

# Exposa el port en el qual l'aplicació escoltarà
EXPOSE 5000

# Defineix la comanda per defecte per executar l'aplicació
CMD ["python", "app.py"]

Exercici 2: Optimitzar un Dockerfile

Optimitza el següent Dockerfile per reduir la mida de la imatge resultant:

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y python3 python3-pip

WORKDIR /app

COPY requirements.txt ./
RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python3", "app.py"]

Solució

FROM python:3.8-slim

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

Errors Comuns i Consells

  • Error: "COPY failed: no source files were specified": Assegura't que els fitxers que intentes copiar existeixen en el directori de treball.
  • Consell: Utilitza imatges base lleugeres (com alpine) per reduir la mida de la imatge resultant.
  • Consell: Agrupa les instruccions RUN per reduir el nombre de capes en la imatge final.

Conclusió

Els Dockerfiles són una eina poderosa per definir i construir imatges Docker de manera repetible i consistent. Comprendre les instruccions bàsiques i com utilitzar-les és fonamental per treballar amb Docker de manera eficient. Amb la pràctica, podràs crear Dockerfiles optimitzats i personalitzats per a les teves aplicacions.

© Copyright 2024. Tots els drets reservats