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.
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:
Iniciar sesión en Docker Hub:
docker login
Etiquetar la imagen:
docker tag mi-aplicacion:latest usuario/mi-aplicacion:latest
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:
- Documentación oficial de Docker: docs.docker.com
Tutoriales de Docker
Aprende Docker con tutoriales de programación en Docker.
Introducción A Docker
Introducción Y Entorno Docker
Instalación De Docker
Introducción Y Entorno Docker
Descargar Imágenes De Hub.docker.com
Imágenes Docker
Crear Imágenes Con Dockerfile
Imágenes Docker
Contenedores Docker
Contenedores Docker
Volúmenes Docker
Volúmenes Docker
Redes Docker
Redes Docker
Creación De Archivos Docker Compose
Docker Compose
Docker Compose Para Varios Servicios
Docker Compose
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.
Crear un archivo Docker Compose con un servicio
Crear un archivo Docker Compose con varios servicios
Descargar imágenes de hub.docker.com
Instalación de Docker
Introducción a Docker
Crear imagen Dockerfile
Creación de contenedores
Creación de volumen Docker
Crear y usar redes Docker
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
Docker
Introducción y entorno Docker
Docker
Imágenes Docker
Docker
Contenedores Docker
Docker
Volúmenes Docker
Docker
Redes Docker
Docker
Docker Compose
Docker
Seguridad Docker
Otras tecnologías
Vuejs
Vuejs
Frontend
Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.
TypeScript
TypeScript
Full Stack
Superconjunto de JavaScript con tipado estático.
Java
Java
Backend
Lenguaje de programación versátil y multiplataforma.
SpringBoot
SpringBoot
Backend
Framework para desarrollo rápido de aplicaciones Java.
CSharp
CSharp
Backend
Lenguaje de programación de Microsoft para aplicaciones robustas.
Git
Git
DevOps
Sistema de control de versiones distribuido.
React
React
Frontend
Librería framework para frontend interfaces de usuario.
Nest
Nest
Backend
Framework Node.js para crear aplicaciones escalables y eficientes.
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.
TailwindCSS
TailwindCSS
Frontend
Framework de utilidades CSS para diseños rápidos y personalizables.
HTML
HTML
Frontend
Lenguaje de marcado para estructurar contenido web.
Numpy
Numpy
Ciencia de Datos e Inteligencia artificial
Biblioteca Python para computación científica y matrices.
Bash
Bash
Administración de sistemas
Intérprete de comandos para sistemas Unix y Linux.
Matplotlib
Matplotlib
Ciencia de Datos e Inteligencia artificial
Biblioteca Python para crear gráficos y visualizaciones.
Bootstrap
Bootstrap
Frontend
Framework CSS para diseños web responsive y modernos.
Hibernate
Hibernate
Backend
ORM para Java, simplifica el acceso a bases de datos.
JavaScript
JavaScript
Full Stack
Lenguaje de scripting para desarrollo web interactivo.