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ó:
- FROM: Defineix la imatge base a partir de la qual es construirà la nova imatge.
- RUN: Executa comandes en el context de la imatge.
- COPY: Copia fitxers o directoris des del sistema de fitxers de l'amfitrió a la imatge.
- ADD: Similar a COPY, però amb funcionalitats addicionals com la descàrrega d'URL i l'extracció d'arxius.
- CMD: Especifica la comanda per defecte que s'executarà quan es llanci un contenidor.
- ENTRYPOINT: Configura una aplicació que sempre s'executarà quan es llanci el contenidor.
- EXPOSE: Informa Docker que el contenidor escoltarà en els ports especificats en temps d'execució.
- ENV: Defineix variables d'entorn.
- WORKDIR: Estableix el directori de treball per a les instruccions RUN, CMD, ENTRYPOINT, COPY i ADD.
- 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
- FROM node:14: Utilitza la imatge oficial de Node.js versió 14 com a base.
- WORKDIR /app: Estableix
/app
com a directori de treball dins del contenidor. - COPY package.json ./*: Copia els fitxers
package.json
ipackage-lock.json
al directori de treball. - RUN npm install: Executa
npm install
per instal·lar les dependències de l'aplicació. - COPY . .: Copia tot el contingut del directori actual al directori de treball del contenidor.
- EXPOSE 3000: Informa Docker que el contenidor escoltarà en el port 3000.
- 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.
Docker: De Principiant a Avançat
Mòdul 1: Introducció a Docker
- Què és Docker?
- Instal·lant Docker
- Arquitectura de Docker
- Comandes bàsiques de Docker
- Entenent les imatges de Docker
- Creant el teu primer contenidor Docker
Mòdul 2: Treballant amb imatges Docker
- Docker Hub i Repositoris
- Construint imatges Docker
- Conceptes bàsics de Dockerfile
- Gestionant imatges Docker
- Etiquetant i pujant imatges
Mòdul 3: Contenidors Docker
- Executant contenidors
- Cicle de vida del contenidor
- Gestionant contenidors
- Xarxes a Docker
- Persistència de dades amb volums
Mòdul 4: Docker Compose
- Introducció a Docker Compose
- Definint serveis a Docker Compose
- Comandes de Docker Compose
- Aplicacions multi-contenidor
- Variables d'entorn a Docker Compose
Mòdul 5: Conceptes avançats de Docker
- Exploració profunda de xarxes Docker
- Opcions d'emmagatzematge de Docker
- Millors pràctiques de seguretat de Docker
- Optimitzant imatges Docker
- Registre i monitoratge de Docker
Mòdul 6: Docker en producció
- CI/CD amb Docker
- Orquestrant contenidors amb Docker Swarm
- Introducció a Kubernetes
- Desplegant contenidors Docker a Kubernetes
- Escalat i equilibrat de càrrega