Docker

Curso de programación con Docker

Docker simplifica el desarrollo, despliegue y ejecución de aplicaciones en contenedores. Aprende a usar Docker para mejorar la eficiencia de tus proyectos.

Aprende Docker GRATIS y certifícate

Docker es una plataforma de código abierto que simplifica el desarrollo, despliegue y ejecución de aplicaciones mediante el uso de contenedores.

Estos contenedores permiten empaquetar una aplicación con todas sus dependencias, garantizando que se ejecute de manera consistente en cualquier entorno.

¿Qué es un contenedor?

Un contenedor es una unidad estandarizada de software que agrupa el código y todas las bibliotecas necesarias para que una aplicación funcione. A diferencia de las máquinas virtuales, los contenedores comparten el sistema operativo del host, lo que los hace más ligeros y eficientes.

Ventajas de utilizar Docker

  • Portabilidad: Los contenedores pueden ejecutarse en cualquier sistema que tenga Docker instalado, independientemente de las diferencias en las configuraciones del entorno.
  • Aislamiento: Cada contenedor opera de forma independiente, evitando conflictos entre aplicaciones y dependencias.
  • Escalabilidad: Facilita la creación y gestión de múltiples instancias de una aplicación, permitiendo un escalado sencillo según las necesidades.
  • Eficiencia: Al compartir el kernel del sistema operativo, reduce el uso de recursos comparado con las máquinas virtuales tradicionales.

Componentes clave de Docker

Imágenes Docker

Una imagen es una plantilla de solo lectura que contiene las instrucciones para crear un contenedor. Se construyen a partir de un archivo llamado Dockerfile y pueden ser compartidas a través de repositorios como Docker Hub.

Dockerfile

Es un archivo de texto que define paso a paso cómo construir una imagen. Cada línea en un Dockerfile es una instrucción que Docker ejecuta para configurar el entorno de la aplicación.

Contenedores

Son instancias en ejecución de imágenes Docker. Pueden ser creados, iniciados, detenidos y eliminados utilizando comandos simples de Docker.

Uso básico de Docker

Instalación

Para empezar a utilizar Docker, es necesario instalarlo en el sistema operativo:

  • Linux: Disponible en los repositorios oficiales de la mayoría de distribuciones.
  • Windows y macOS: Se puede descargar Docker Desktop desde la página oficial.

Creación de un Dockerfile

Un ejemplo sencillo de un Dockerfile para una aplicación web en Python podría ser:

# Usar una imagen base de Python
FROM python:3.8-slim-buster

# Establecer el directorio de trabajo
WORKDIR /app

# Copiar los archivos de requisitos
COPY requirements.txt .

# Instalar las dependencias
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el código de la aplicación
COPY . .

# Exponer el puerto en el que la aplicación escuchará
EXPOSE 5000

# Definir el comando de inicio
CMD ["python", "app.py"]

Construcción de la imagen

Para construir una imagen a partir del Dockerfile, se utiliza el comando:

docker build -t mi-aplicacion:latest .

Este comando crea una imagen con el nombre mi-aplicacion y la etiqueta latest.

Ejecución de un contenedor

Una vez creada la imagen, se puede ejecutar un contenedor con:

docker run -d -p 5000:5000 mi-aplicacion:latest

Este comando ejecuta el contenedor en segundo plano (-d) y mapea el puerto 5000 del host al puerto 5000 del contenedor.

Gestión de contenedores

Algunos comandos útiles para gestionar contenedores son:

  • Listar contenedores en ejecución: docker ps
  • Detener un contenedor: docker stop <container_id>
  • Eliminar un contenedor: docker rm <container_id>

Trabajando con repositorios de imágenes

Docker Hub es el repositorio público más utilizado, donde se pueden encontrar imágenes oficiales y de la comunidad. Para subir una imagen al repositorio:

  1. Iniciar sesión en Docker Hub:

    docker login
    
  2. Etiquetar la imagen:

    docker tag mi-aplicacion:latest usuario/mi-aplicacion:latest
    
  3. Subir la imagen:

    docker push usuario/mi-aplicacion:latest
    

Orquestación y escalado

Para gestionar múltiples contenedores y aplicaciones más complejas, se utilizan herramientas de orquestación como Docker Compose o Kubernetes. Estas permiten definir y configurar servicios, redes y volúmenes de manera declarativa.

Docker Compose

Es una herramienta que permite definir y ejecutar aplicaciones multicontenedor. Un archivo docker-compose.yml describe cómo deben comportarse los servicios.

Ejemplo básico de docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

Para iniciar los servicios definidos:

docker-compose up

Volúmenes y persistencia de datos

Los contenedores, por defecto, no mantienen el estado una vez detenidos o eliminados. Para persistir datos, Docker ofrece volúmenes.

Tipos de volúmenes

  • Volúmenes gestionados: Docker administra la ubicación y gestión del volumen.
  • Montajes de enlace (Bind mounts): Se enlaza una ruta específica del sistema de archivos del host al contenedor.

Ejemplo de uso de un volumen:

docker run -d -p 5000:5000 -v mi-volumen:/datos mi-aplicacion:latest

O utilizando un montaje de enlace:

docker run -d -p 5000:5000 -v /ruta/host:/datos mi-aplicacion:latest

Redes en Docker

Docker permite crear redes personalizadas para aislar y controlar la comunicación entre contenedores.

Creación de una red personalizada

docker network create mi-red

Al ejecutar un contenedor en una red específica:

docker run -d --network mi-red mi-aplicacion:latest

Esto permite que los contenedores en la misma red se comuniquen utilizando el nombre del contenedor como hostname.

Mejores prácticas en Docker

  • Utilizar imágenes oficiales y verificadas: Reduce el riesgo de vulnerabilidades.
  • Minimizar el tamaño de las imágenes: Elimina paquetes innecesarios y limpia las cachés.
  • Especificar versiones de las dependencias: Evita inconsistencias entre entornos.
  • No almacenar datos sensibles en imágenes: Utiliza variables de entorno o herramientas de gestión de secretos.
  • Optimizar el uso de capas en el Dockerfile: Combina comandos cuando sea apropiado.

Seguridad en entornos Docker

La seguridad es un aspecto crítico al trabajar con contenedores.

Recomendaciones de seguridad

  • Actualizar regularmente: Mantén Docker y las imágenes actualizadas.
  • Ejecutar contenedores con usuarios no root: Reduce el impacto potencial en caso de compromisos.
  • Limitar los recursos asignados: Controla el uso de CPU y memoria para evitar abusos.
  • Utilizar escáneres de seguridad: Herramientas como Trivy o Clair ayudan a detectar vulnerabilidades.

Registro y monitorización

Para mantener la salud de las aplicaciones, es esencial registrar y monitorizar su comportamiento.

Logs de contenedores

Accede a los logs de un contenedor específico:

docker logs <id_contenedor>

Monitorización

Herramientas populares:

  • Prometheus: Sistema de monitorización y alertas.
  • Grafana: Plataforma de análisis y visualización de métricas.
  • ELK Stack: Suite para gestionar y analizar logs (Elasticsearch, Logstash y Kibana).

Docker Swarm

Es una herramienta de orquestación nativa de Docker que permite convertir un grupo de máquinas en un cluster manejado como un solo sistema virtual.

Iniciando un Swarm

docker swarm init

Para añadir nodos al cluster, se proporciona un token generado por el comando anterior.

Desplegando servicios en Swarm

Ejemplo de despliegue de un servicio replicado:

docker service create --name mi-servicio --replicas 3 -p 80:80 mi-imagen:latest

Integración continua y despliegue continuo (CI/CD)

Docker facilita la creación de pipelines de CI/CD al proporcionar un entorno consistente para construir y probar aplicaciones.

Integración con herramientas de CI/CD

  • Jenkins: Plugin de Docker para integrar en pipelines.
  • GitLab CI/CD: Soporta Docker de forma nativa.
  • Travis CI: Permite ejecutar pruebas en contenedores Docker.

Ejemplo de configuración en .gitlab-ci.yml:

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t usuario/mi-aplicacion:$CI_COMMIT_SHA .
  only:
    - main

test:
  stage: test
  script:
    - docker run usuario/mi-aplicacion:$CI_COMMIT_SHA pytest
  only:
    - main

deploy:
  stage: deploy
  script:
    - docker push usuario/mi-aplicacion:$CI_COMMIT_SHA
    - kubectl set image deployment/mi-aplicacion mi-aplicacion=usuario/mi-aplicacion:$CI_COMMIT_SHA
  only:
    - main

Multi-stage builds

Para optimizar las imágenes y reducir su tamaño, Docker permite crear multi-stage builds en el Dockerfile.

Ejemplo de multi-stage build

# Etapa de construcción
FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o mi-aplicacion

# Etapa final
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/mi-aplicacion .
CMD ["./mi-aplicacion"]

Esto permite incluir solo los binarios necesarios en la imagen final, excluyendo las dependencias de compilación.

Gestión de múltiples entornos

Docker facilita el despliegue de aplicaciones en diferentes entornos (desarrollo, pruebas, producción) manteniendo la consistencia.

Utilizando variables de entorno

Puedes definir variables en el Dockerfile o al ejecutar el contenedor:

docker run -e ENTORNO=produccion mi-aplicacion:latest

En el Dockerfile:

ENV ENTORNO desarrollo

Archivos de configuración separados

Utiliza archivos de configuración específicos para cada entorno y móntalos en el contenedor según sea necesario.

Herramientas complementarias

  • Docker Machine: Permite instalar Docker en hosts virtuales y gestionarlos.
  • Docker Registry: Servicio para almacenar y distribuir imágenes Docker.
  • Notary: Proporciona firma de contenido y verificación para imágenes.

Recursos adicionales

Para profundizar en Docker y contenedores:

Aprende Docker GRATIS online

Tutoriales de Docker

Aprende Docker con tutoriales de programación en Docker.

Ejercicios de programación de Docker

Evalúa tus conocimientos en Docker con ejercicios de programación Docker de tipo Test, Puzzle, Código y Proyecto con VSCode.

Tipo de tecnología

Herramienta de virtualización

Categoría laboral

DevOps

Año de lanzamiento

2013

Developers

Docker Inc

Todos los módulos de Docker

Ver todos los módulos de Docker

Otras tecnologías

Vue.js
Vuejs

Vuejs

Frontend

Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.

Selenium

Selenium

Testing / QA (Quality Assurance)

Suite de herramientas open-source para automatizar navegadores web y pruebas de software de interfaz de usuario.

TypeScript
TypeScript

TypeScript

Full Stack

Superconjunto de JavaScript con tipado estático.

Java

Java

Backend

Lenguaje de programación versátil y multiplataforma.

Seaborn

Seaborn

Ciencia de Datos e Inteligencia artificial

Biblioteca de visualización de datos para Python.

CSharp

CSharp

Backend

Lenguaje de programación de Microsoft para aplicaciones robustas.

Spring Boot
SpringBoot

SpringBoot

Backend

Framework para desarrollo rápido de aplicaciones Java.

NestJS
Nest

Nest

Backend

Framework Node.js para crear aplicaciones escalables y eficientes.

Git
Git

Git

DevOps

Sistema de control de versiones distribuido.

React
React

React

Frontend

Librería framework para frontend interfaces de usuario.

Go
Go

Go

Backend

Lenguaje de programación eficiente y concurrente creado por Google.

SQL

SQL

Administración de bases de datos

Lenguaje para gestionar bases de datos relacionales.

Tailwind CSS
TailwindCSS

TailwindCSS

Frontend

Framework de utilidades CSS para diseños rápidos y personalizables.

Kotlin
Kotlin

Kotlin

Backend

Lenguaje de programación moderno y seguro para aplicaciones Android.

HTML5
HTML

HTML

Frontend

Lenguaje de marcado para estructurar contenido web.

NumPy
Numpy

Numpy

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para computación científica y matrices.

GNU Bash
Bash

Bash

Administración de sistemas

Intérprete de comandos para sistemas Unix y Linux.

2022-09-27T22:26:51.030457 image/svg+xml Matplotlib v3.6.0, https://matplotlib.org/
Matplotlib

Matplotlib

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para crear gráficos y visualizaciones.

Acceder a todas las tecnologías