Guía completa de Docker en español
Introducción a Docker
Docker es una plataforma de contenedores que empaqueta aplicaciones y sus dependencias en unidades ligeras y portables. Así garantizas consistencia entre entornos, aislamiento, eficiencia al compartir el kernel del sistema operativo, portabilidad y escalado sencillo.
Beneficios clave
Consistencia de ejecución en cualquier entorno. Portabilidad total donde Docker esté instalado. Arranque veloz y menor consumo que máquinas virtuales. Escalabilidad simple y segura gracias al aislamiento.
Contenedores vs máquinas virtuales
Los contenedores comparten el kernel del host, son ligeros en MB, arrancan rápido y usan recursos de forma más eficiente. Las máquinas virtuales incluyen un sistema operativo completo, pesan GB, inician más lento y tienen mayor sobrecarga.
Arquitectura de Docker
Componentes núcleo: Cliente Docker con el comando docker, Daemon dockerd que gestiona contenedores, Imágenes de solo lectura como plantillas, Contenedores como instancias de imágenes y Registro para almacenar imágenes como Docker Hub u otros.
Instalación
Linux Ubuntu o Debian
Actualizar índice: sudo apt-get update
Instalar prerequisitos: sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Añadir clave GPG de Docker: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Agregar repositorio estable de Docker para tu versión de Ubuntu con lsb_release -cs y el archivo docker.list en sources.list.d
Instalar Docker: sudo apt-get update y luego sudo apt-get install docker-ce docker-ce-cli containerd.io
Agregar tu usuario al grupo docker: sudo usermod -aG docker USUARIO
macOS
Con Homebrew: brew install --cask docker
Windows
Instala Docker Desktop desde el sitio oficial y sigue el asistente.
Verificar instalación
docker --version y docker run hello-world
Imágenes de Docker
Las imágenes son plantillas de solo lectura construidas por capas a partir de un Dockerfile.
Comandos básicos de imágenes
Listar imágenes: docker images o docker image ls
Descargar imagen: docker pull ubuntu:20.04 o docker pull nginx:alpine
Eliminar imagen: docker rmi ubuntu:20.04 o docker image rm nginx:alpine
Construir imagen: docker build -t miapp:1.0 .
Historial: docker history ubuntu:20.04
Inspección: docker inspect ubuntu:20.04
Búsqueda: docker search nginx
Convención de nombres
registro-opcional usuario repositorio:tag por ejemplo nginx:latest, ubuntu:20.04, gcr.io proyecto mi-app:v1.0 o localhost:5000/miapp:dev
Contenedores de Docker
Los contenedores son instancias en ejecución de imágenes.
Ciclo de vida
Ejecutar contenedor: docker run ubuntu:20.04
Modo desacoplado: docker run -d nginx:alpine
Modo interactivo: docker run -it ubuntu:20.04 /bin/bash
Listar en ejecución: docker ps, listar todos: docker ps -a
Detener: docker stop id_contenedor o nombre_contenedor
Iniciar detenido: docker start id_contenedor
Reiniciar: docker restart id_contenedor
Eliminar: docker rm id_contenedor y para todos docker rm $(docker ps -aq)
Ejecutar comando dentro: docker exec -it id_contenedor /bin/bash
Opciones útiles
Mapeo de puertos: docker run -p 8080:80 nginx
Montaje de volúmenes: docker run -v ruta_host:ruta_contenedor ubuntu
Variables de entorno: docker run -e MI_VAR=valor ubuntu
Nombre personalizado: docker run --name mi_contenedor ubuntu
Límites de recursos: docker run -m 512m --cpus=1.5 ubuntu
Gestión de contenedores
Logs: docker logs id_contenedor y seguimiento con docker logs -f id_contenedor
Estadísticas: docker stats o docker stats id_contenedor
Procesos: docker top id_contenedor
Inspección: docker inspect id_contenedor
Copiar archivos: docker cp archivo.txt id_contenedor:/ruta/archivo.txt y docker cp id_contenedor:/ruta/archivo.txt ./archivo.txt
Dockerfile
Un Dockerfile es un conjunto de instrucciones para construir una imagen. Instrucciones típicas: FROM para base, RUN para ejecutar comandos, COPY para copiar, WORKDIR para definir directorio, EXPOSE para puertos, ENV para variables, USER para cambiar usuario, CMD o ENTRYPOINT para el proceso principal.
Ejemplo resumido
FROM ubuntu:20.04
WORKDIR /app
RUN apt-get update && apt-get install -y python3 python3-pip && rm -rf /var/lib/apt/lists/*
COPY . .
RUN pip3 install -r requirements.txt
EXPOSE 8000
USER appuser
CMD python3 app.py
Compilaciones multi etapa
Usa una imagen pesada para construir dependencias y otra mínima para producción. Copia solo lo necesario desde la fase builder para reducir tamaño y superficie de ataque.
Construcción de imágenes
Build estándar: docker build -t miapp:1.0 .
Especificar Dockerfile: docker build -f Dockerfile.prod -t miapp:prod .
Argumentos de build: docker build --build-arg VERSION=1.0 -t miapp .
Sin caché: docker build --no-cache -t miapp .
Volúmenes de Docker
Persisten datos más allá del ciclo del contenedor.
Tipos: volúmenes con nombre gestionados por Docker, bind mounts al sistema de archivos del host y tmpfs en memoria.
Comandos de volúmenes
Crear: docker volume create mi_volumen
Listar: docker volume ls
Inspeccionar: docker volume inspect mi_volumen
Eliminar: docker volume rm mi_volumen
Limpiar no usados: docker volume prune
Uso
Con nombre: docker run -v mi_volumen:/data ubuntu
Bind mount: docker run -v ruta_host:ruta_contenedor ubuntu
Solo lectura: docker run -v ruta_host:ruta_contenedor:ro ubuntu
tmpfs: docker run --tmpfs /tmp ubuntu
Redes de Docker
Tipos: bridge por defecto, host usa la red del host, none sin red y overlay para múltiples hosts en Swarm.
Comandos de red
Listar: docker network ls
Crear: docker network create mi_red o docker network create --driver bridge mi_bridge
Inspeccionar: docker network inspect mi_red
Conectar contenedor: docker network connect mi_red mi_contenedor
Desconectar: docker network disconnect mi_red mi_contenedor
Eliminar: docker network rm mi_red
Ejemplo
docker network create --driver bridge red_app
docker run -d --name db --network red_app -e POSTGRES_PASSWORD=clave postgres:13
docker run -d --name web --network red_app -p 8080:80 mi_web_app
Docker Compose
Orquesta aplicaciones multicontenedor con un archivo YAML declarativo. Instalación en Linux con binario de GitHub o via pip, y verificación con docker-compose --version. Comandos frecuentes: docker-compose up para iniciar, -d para modo desacoplado, docker-compose down para detener y limpiar, build para construir, logs para ver registros, exec para entrar en un servicio, ps para listar y restart para reiniciar. También puedes escalar servicios con docker-compose up -d --scale web=3.
Registro de Docker
Docker Hub
Iniciar sesión: docker login
Etiquetar: docker tag miapp:latest usuario/miapp:latest
Subir: docker push usuario/miapp:latest
Descargar: docker pull usuario/miapp:latest
Registro privado
Levantar local: docker run -d -p 5000:5000 --name registry registry:2
Etiquetar local: docker tag miapp:latest localhost:5000/miapp:latest
Push y pull: docker push localhost:5000/miapp:latest y docker pull localhost:5000/miapp:latest
Autenticación
docker login mi-registro.com o pasar credenciales con password-stdin
Mejores prácticas
Usa imágenes base oficiales y minimalistas como alpine. Minimiza capas uniendo comandos RUN y limpia cachés apt. Incluye .dockerignore para excluir node_modules, archivos de logs y repositorios. Evita ejecutar como root creando un usuario no privilegiado. Aprovecha compilaciones multi etapa para reducir el tamaño final.
Seguridad
Escanea imágenes con docker scan. Mantén imágenes actualizadas con docker pull. No incluyas secretos en Dockerfile ni en imágenes, emplea variables de entorno seguras, secretos de Swarm o gestores externos. Usa imágenes base reducidas para disminuir superficie de ataque.
Rendimiento
Optimiza la caché copiando primero archivos de dependencias y luego el código. Elimina archivos innecesarios tras la instalación de paquetes. Revisa el tamaño de imágenes con docker images --format table y reduce donde sea posible.
Resolución de problemas
Si un contenedor no inicia, revisa docker logs id_contenedor y docker inspect id_contenedor. Si un puerto está en uso, identifica el proceso y mapea otro puerto con -p 8081:80. Permiso denegado en Linux se corrige agregando tu usuario al grupo docker y reiniciando la sesión. Si falta espacio, limpia con docker container prune, docker image prune, docker volume prune o docker system prune -a.
Diagnóstico
Información del sistema con docker system info y uso de disco con docker system df. Depura contenedores con docker exec -it, logs -f y docker stats. Para redes, lista e inspecciona con docker network ls y docker network inspect bridge.
Temas avanzados
Docker Swarm
Inicializa con docker swarm init, une nodos con docker swarm join, despliega con docker stack deploy -c archivo.yml pila, lista servicios con docker service ls y escala con docker service scale servicio=5.
Healthchecks
Define HEALTHCHECK con intervalos, tiempos de espera y un comando que verifique la salud de la app, por ejemplo curl -f a una ruta de salud.
Build multi plataforma
Con buildx crea un builder y compila para linux amd64 y arm64 con docker buildx build --platform linux/amd64,linux/arm64 -t miapp:latest --push .
Secretos en Swarm
Crea un secreto con echo secreto | docker secret create nombre - y asócialo con docker service create --secret nombre imagen.
Límites de recursos
Con docker run usa -m 512m y --cpus=1.5. En compose define límites dentro de deploy resources limits.
BuildKit
Habilita características avanzadas como caché de compilación por directorios y montajes temporales para acelerar builds y reducir capas.
Comandos útiles de limpieza y monitoreo
Eliminar contenedores detenidos con docker container prune, imágenes sin usar con docker image prune -a, volúmenes con docker volume prune, redes con docker network prune y todo con docker system prune -a --volumes. Monitorear con docker system info, docker system df, docker stats, docker top servicio y docker events.
Backup y restore
Exporta contenedores con docker export contenedor > backup.tar e impórtalos con docker import backup.tar miapp:backup. Guarda imágenes con docker save miapp:latest > miapp.tar y cárgalas con docker load < miapp.tar.
Q2BSTUDIO y Docker para tu negocio
En Q2BSTUDIO integramos Docker en flujos DevOps modernos para acelerar entregas, mejorar la fiabilidad y optimizar costes. Diseñamos aplicaciones a medida y software a medida listos para contenedores, llevamos tus despliegues a nubes líderes y reforzamos la seguridad desde la base de las imágenes hasta la operación. Descubre cómo nuestros servicios cloud AWS y Azure impulsan la portabilidad, escalabilidad y automatización de tus plataformas, y cómo combinamos contenedores con pipelines CI CD y observabilidad.
Si buscas construir o modernizar soluciones nativas en la nube, nuestros equipos de arquitectura y desarrollo crean microservicios orquestados y entornos de pruebas aislados, alineando tus objetivos de negocio con la eficiencia del runtime de contenedores. También te acompañamos a diseñar y contenedorizAR tus aplicaciones a medida para acelerar la entrega continua.
Palabras clave y capacidades
Aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi, automatización y orquestación con contenedores, infraestructura como código, CI CD, seguridad de la cadena de suministro de software y observabilidad integral.
Consejo final
Empieza por contenerizar un servicio simple, practica con volúmenes y redes, orquesta con Compose, y luego avanza a build multi etapa, seguridad y despliegues en la nube. Con práctica y buenas prácticas, Docker se convierte en un pilar para la agilidad y la confiabilidad de tus plataformas.