Introducción
La integración continua (CI) y la entrega continua (CD) son prácticas esenciales en el desarrollo de software moderno. Docker facilita estas prácticas al proporcionar un entorno consistente y reproducible para construir, probar y desplegar aplicaciones. En esta sección, aprenderás cómo integrar Docker en tus pipelines de CI/CD para mejorar la eficiencia y la fiabilidad de tus despliegues.
Objetivos
- Entender los conceptos básicos de CI/CD.
- Configurar un pipeline de CI/CD utilizando Docker.
- Integrar Docker con herramientas populares de CI/CD como Jenkins, GitLab CI y GitHub Actions.
- Automatizar la construcción, prueba y despliegue de aplicaciones Dockerizadas.
Conceptos Básicos de CI/CD
Integración Continua (CI)
La integración continua es una práctica de desarrollo de software en la que los desarrolladores integran su código en un repositorio compartido varias veces al día. Cada integración es verificada por una build automatizada (incluyendo pruebas) para detectar errores lo antes posible.
Entrega Continua (CD)
La entrega continua es una extensión de la integración continua que asegura que el código puede ser desplegado en producción en cualquier momento. Esto se logra automatizando el proceso de despliegue para que las aplicaciones puedan ser lanzadas de manera rápida y segura.
Configurando un Pipeline de CI/CD con Docker
Paso 1: Preparar el Repositorio
-
Estructura del Proyecto: Asegúrate de que tu proyecto esté organizado de manera que sea fácil de construir y desplegar. Un ejemplo de estructura de proyecto podría ser:
my-app/ ├── Dockerfile ├── src/ ├── tests/ ├── .gitlab-ci.yml └── .github/ └── workflows/ └── ci-cd.yml
-
Dockerfile: Define un
Dockerfile
para construir la imagen de tu aplicación.# Dockerfile FROM python:3.8-slim WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
Paso 2: Configurar Jenkins para CI/CD
-
Instalar Jenkins: Si no tienes Jenkins instalado, puedes usar Docker para instalarlo rápidamente.
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
-
Configurar Jenkins Pipeline: Crea un nuevo pipeline en Jenkins y configura el
Jenkinsfile
.pipeline { agent any stages { stage('Build') { steps { script { docker.build('my-app') } } } stage('Test') { steps { script { docker.image('my-app').inside { sh 'pytest tests/' } } } } stage('Deploy') { steps { script { docker.image('my-app').push('my-repo/my-app:latest') } } } } }
Paso 3: Configurar GitLab CI/CD
-
Archivo
.gitlab-ci.yml
: Define el pipeline en el archivo.gitlab-ci.yml
.stages: - build - test - deploy build: stage: build script: - docker build -t my-app . test: stage: test script: - docker run my-app pytest tests/ deploy: stage: deploy script: - docker tag my-app my-repo/my-app:latest - docker push my-repo/my-app:latest
Paso 4: Configurar GitHub Actions
-
Archivo de Workflow: Define el workflow en
.github/workflows/ci-cd.yml
.name: CI/CD on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Build Docker image run: docker build -t my-app . - name: Run tests run: docker run my-app pytest tests/ - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Push Docker image run: docker push my-repo/my-app:latest
Ejercicio Práctico
Ejercicio 1: Configurar un Pipeline de CI/CD con GitHub Actions
- Objetivo: Configurar un pipeline de CI/CD para una aplicación Dockerizada utilizando GitHub Actions.
- Instrucciones:
- Crea un repositorio en GitHub.
- Añade un
Dockerfile
y un archivo de workflow en.github/workflows/ci-cd.yml
. - Configura el workflow para construir, probar y desplegar la imagen Docker.
- Asegúrate de que el pipeline se ejecute correctamente al hacer push a la rama
main
.
Solución
-
Crear Repositorio: Crea un nuevo repositorio en GitHub.
-
Añadir Dockerfile: Añade el siguiente
Dockerfile
al repositorio.FROM python:3.8-slim WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
-
Añadir Workflow: Añade el siguiente archivo de workflow en
.github/workflows/ci-cd.yml
.name: CI/CD on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Build Docker image run: docker build -t my-app . - name: Run tests run: docker run my-app pytest tests/ - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Push Docker image run: docker push my-repo/my-app:latest
-
Configurar Secretos: Añade los secretos
DOCKER_USERNAME
yDOCKER_PASSWORD
en la configuración del repositorio en GitHub. -
Probar Pipeline: Haz push a la rama
main
y verifica que el pipeline se ejecute correctamente.
Conclusión
En esta sección, has aprendido cómo configurar un pipeline de CI/CD utilizando Docker. Has visto ejemplos prácticos de cómo integrar Docker con Jenkins, GitLab CI y GitHub Actions. Estas habilidades te permitirán automatizar la construcción, prueba y despliegue de tus aplicaciones Dockerizadas, mejorando la eficiencia y fiabilidad de tus despliegues.
En el próximo módulo, profundizaremos en la orquestación de contenedores con Docker Swarm y Kubernetes, lo que te permitirá gestionar aplicaciones complejas en producción.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga