Introducció
La integració contínua (CI) i el desplegament continu (CD) són pràctiques essencials en el desenvolupament de programari modern. Docker facilita aquestes pràctiques proporcionant un entorn consistent i replicable per a la construcció, prova i desplegament d'aplicacions. En aquest tema, explorarem com utilitzar Docker en un flux de treball CI/CD.
Objectius
- Entendre els conceptes bàsics de CI/CD.
- Aprendre a configurar un pipeline CI/CD amb Docker.
- Integrar Docker amb eines de CI/CD com Jenkins, GitLab CI/CD i GitHub Actions.
- Implementar bones pràctiques per a CI/CD amb Docker.
Conceptes Bàsics de CI/CD
Integració Contínua (CI)
- Definició: La integració contínua és una pràctica de desenvolupament de programari on els desenvolupadors integren el seu codi en un repositori compartit diverses vegades al dia.
- Objectiu: Detectar errors ràpidament i millorar la qualitat del programari.
- Eines: Jenkins, GitLab CI, Travis CI, CircleCI, etc.
Desplegament Continu (CD)
- Definició: El desplegament continu és una pràctica on el codi que passa totes les etapes del pipeline de CI es desplega automàticament a l'entorn de producció.
- Objectiu: Reduir el temps de lliurament del programari i assegurar que sempre estigui en un estat desplegable.
- Eines: Kubernetes, Docker Swarm, AWS CodeDeploy, etc.
Configurant un Pipeline CI/CD amb Docker
Pas 1: Crear un Dockerfile
El primer pas és crear un Dockerfile
per a la teva aplicació. Aquest fitxer defineix com es construirà la imatge Docker de la teva aplicació.
# Exemple de Dockerfile per a una aplicació Node.js FROM node:14 # Estableix el directori de treball WORKDIR /app # Copia els fitxers de l'aplicació COPY package*.json ./ # Instal·la les dependències RUN npm install # Copia el codi de l'aplicació COPY . . # Exposa el port de l'aplicació EXPOSE 3000 # Comanda per executar l'aplicació CMD ["npm", "start"]
Pas 2: Configurar una eina de CI/CD
Jenkins
-
Instal·lar Jenkins: Pots instal·lar Jenkins en un contenidor Docker.
docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
-
Configurar un Job de Jenkins:
- Crea un nou Job de tipus "Pipeline".
- Defineix el pipeline utilitzant un
Jenkinsfile
.
pipeline { agent any stages { stage('Build') { steps { script { docker.build('my-app') } } } stage('Test') { steps { script { docker.image('my-app').inside { sh 'npm test' } } } } stage('Deploy') { steps { script { docker.image('my-app').push('my-repo/my-app:latest') } } } } }
GitLab CI/CD
-
Configurar
.gitlab-ci.yml
:stages: - build - test - deploy build: stage: build script: - docker build -t my-app . test: stage: test script: - docker run my-app npm test deploy: stage: deploy script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker push $CI_REGISTRY/my-repo/my-app:latest
GitHub Actions
-
Configurar
workflow.yml
:name: CI/CD Pipeline on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Build Docker image run: docker build -t my-app . - name: Test Docker image run: docker run my-app npm test - name: Push Docker image run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin docker push my-app:latest
Bones Pràctiques per a CI/CD amb Docker
- Utilitza imatges base lleugeres: Redueix la mida de les imatges utilitzant imatges base lleugeres com
alpine
. - Capa de caché: Aprofita la caché de Docker per accelerar la construcció d'imatges.
- Escaneja vulnerabilitats: Utilitza eines com Trivy per escanejar vulnerabilitats en les imatges Docker.
- Automatitza proves: Assegura't que totes les proves s'executin automàticament en el pipeline de CI/CD.
- Desplegament segur: Implementa mecanismes de rollback per a desplegaments fallits.
Exercici Pràctic
Objectiu
Configurar un pipeline CI/CD per a una aplicació Node.js utilitzant GitHub Actions.
Passos
- Crea un repositori a GitHub.
- Afegeix un
Dockerfile
al repositori. - Crea un fitxer
workflow.yml
a.github/workflows/
. - Defineix el pipeline CI/CD al
workflow.yml
. - Comprova que el pipeline s'executa correctament en fer un push al repositori.
Solució
-
Dockerfile:
FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["npm", "start"]
-
workflow.yml:
name: CI/CD Pipeline on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Build Docker image run: docker build -t my-app . - name: Test Docker image run: docker run my-app npm test - name: Push Docker image run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin docker push my-app:latest
Conclusió
En aquest tema, hem après com configurar un pipeline CI/CD utilitzant Docker. Hem explorat com integrar Docker amb diverses eines de CI/CD i hem implementat bones pràctiques per assegurar un pipeline eficient i segur. Amb aquests coneixements, estàs preparat per automatitzar la construcció, prova i desplegament de les teves aplicacions utilitzant Docker.
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