- Introducción
- Conceptos Fundamentales
- Instalaciones
- Flujo de Trabajo en Docker
- Comandos Esenciales
- Recursos Adicionales
Docker (WEB) 🌐: Develop faster. Run anywhere. Accelerate how you build, share, and run applications
¿Qué es Docker? 👉 un conjunto de herramientas, servicios y entornos que permiten desarrollar, ejecutar o gestionar aplicaciones.
🚀 Docker permite empaquetar aplicaciones con todas sus dependencias, como librerías y versiones de lenguajes, en contenedores ligeros. Esto asegura que la aplicación funcione igual en cualquier entorno, evitando problemas de compatibilidad entre desarrollo y producción.
👨💻 El creador de Docker, Solomon Hykes, quería resolver justamente ese problema: que el código funcionara de la misma forma en desarrollo y en producción. Aunque los contenedores ya existían en Linux, Docker los hizo simples y accesibles para todos. Su popularidad creció rápidamente, pero la empresa tuvo dificultades para monetizar y en 2020 vendió parte de su negocio.
💻 Antes de Docker, las máquinas virtuales (VMs) eran la opción para aislar aplicaciones. Las VMs emulan un sistema operativo completo, lo que las hace más pesadas y lentas. Además, ocupan más espacio y consumen más recursos que Docker, lo que dificulta la escalabilidad y el rendimiento.

🚨 ¿Entendemos para qué sirve? ¿Qué puede pasar en el caso de no usar? ¿Qué se usaba antes? 🚨
📖 Dockerfile: Es como una receta que especifica, paso a paso, cómo preparar un entorno en el que se ejecutará una aplicación.
🖼️ Imágenes: Una imagen es una plantilla que contiene todo lo necesario para ejecutar un contenedor: el código de la aplicación, el entorno de ejecución, las dependencias, etc. Las imágenes pueden ser compartidas a través de repositorios como Docker Hub. Las imágenes se crean a partir de un Dockerfile y se pueden ejecutar como contenedores.
Note
Una imagen de Docker no es magia, son archivos en tu disco que contienen:
- Sistema base + Dependencias y librerías + Tu código + Metadatos
📦 Contenedores: Un contenedor es una instancia en ejecución de una imagen. Es el entorno aislado en el que se ejecuta la aplicación. Cada contenedor tiene su propio sistema de archivos, procesos, redes y espacio de CPU/memoria. Piensa en el contenedor como una "caja" donde vive y se ejecuta la aplicación, separada del resto del sistema.
Note
El contenedor es la imagen en ejecución, levantada, activa.
Una imagen se convierte en contenedor cuando Docker la levanta y la hace funcionar.
📜 Docker Compose: Docker Compose es una herramienta que permite definir y ejecutar aplicaciones multicontenedor. Se utiliza un archivo docker-compose.yml
para configurar los servicios de una aplicación, como bases de datos, servidores, etc., y luego se ejecutan con un solo comando.
💾 Volúmenes : Los volúmenes en Docker se utilizan para persistir datos más allá del ciclo de vida de los contenedores, los cuales son efímeros y pueden ser eliminados fácilmente. Los volúmenes permiten que los datos persistan incluso después de que el contenedor haya sido destruido. Además, también se pueden utilizar para mapear código entre el sistema anfitrión y el contenedor, lo que facilita la edición en tiempo real dentro del contenedor.
Note
Un volumen es un directorio en el sistema de archivos del host que Docker administra
Es habitual que se confundan los términos de imágen y contenedor e incluso usarse únicamente el término contenedor para hacer referencia a ambos. Pero la realidad es que nunca se puede construir un contenedor o descargar uno, ya que los contenedores solo existen durante el tiempo de ejecución. Las imágenes, por otro lado, son archivos inmutables: no puedes editar una imagen después de haberla creado.
La
imagen
es un plato pre-cocinado y congelado.El
contenedor
es el delicioso manjar.
Docker es como una cápsula del tiempo que congela tu aplicación con todo lo necesario para que siempre funcione igual, aquí o en cualquier otro sitio.
- Guarda no solo tu código, sino también el sistema operativo base, librerías, runtimes y dependencias.
- Esa “foto” (la imagen) siempre se comportará igual, sin importar si pasan meses o años.
- Cuando corres el contenedor, básicamente “revives” ese mismo entorno exacto en el que funcionaba tu proyecto.
👉 La diferencia con una máquina virtual es que Docker no “congela” un ordenador entero con su kernel, sino que empaqueta solo lo necesario para tu app 💁♂️mucho más ligero y portátil.
🚨 🚨 ¿Sabemos qué es una imagen, un contenedor, un volumen y lo que hace el docker compose? 🚨 🚨
-
Docker Desktop (para Windows y macOS)
-
Es una interfaz gráfica (o aplicación local) que facilita la creación, ejecución y gestión de contenedores en tu computadora.Es una plataforma todo-en-uno que incluye:
Docker Engine
: El motor que permite construir y correr contenedores localmenteDocker Compose
: Una herramienta para definir y correr aplicaciones multi-contenedor mediante un archivo docker-compose.ymlMáquina virtual
: En macOS y Windows, Docker Desktop utiliza una VM (máquina virtual) para ejecutar Linux, ya que Docker depende del kernel de Linux
-
Entre las funciones de Docker Desktop está construir imágenes Docker desde un Dockerfile y ejecutar y gestionar contenedores localmente.
-
-
Docker CLI (para Linux)
-
Docker Hub (para la nube)
- Es el repositorio oficial donde se almacenan y comparten imágenes de Docker.Los usuarios pueden descargar imágenes públicas o almacenar las suyas propias.Es un recurso clave para obtener imágenes oficiales de sistemas operativos, aplicaciones y servicios.Su función es similar a un repositorio de código como GitHub o GitLab.
- Docker Hub nos permite:
- Almacenar y compartir imágenes Docker públicamente o de manera privada (2 con la cuenta privada)
- Distribuir tus imágenes a otras personas o sistemas (en un entorno de producción, CI/CD, etc.)
- Descargar imágenes preconstruidas de aplicaciones populares (Nginx, Redis, MongoDB, Node.js, etc.), que puedes usar como base para tus propios contenedores
Son 3 pasos:
- Disponer de un Dockerfile
- Construir la imagen a partir del dockerfile con
docker build
- Levantar un contenedor de la imagen creada con
docker run
El flujo de trabajo en Docker sigue varios pasos clave que van desde la creación de una imagen hasta la ejecución de un contenedor. A continuación, te explicamos el proceso paso a paso, además de algunos conceptos relacionados con la configuración de variables y el ciclo de vida de los contenedores.
Se puede hacer con docker init
te detecta el code que tienes
Ejemplo básico de un Dockerfile:
FROM python:3.8-slim # Instalamos una imagen
COPY . /app # Copiamos un directorio
WORKDIR /app # Creamos un directorio
RUN pip install -r requirements.txt # Instalamos
CMD ["python", "app.py"] # Ejecutamos
docker build -t mi-aplicacion:latest .
Durante la ejecución de un contenedor, puedes pasar variables de entorno para personalizar la configuración sin modificar el código. Puedes definir variables directamente en el Dockerfile o pasar valores al momento de ejecutar el contenedor.
# En el dockerfile
ENV API_KEY=myapikey
# O pasarla en momento de ejecución
docker run -e API_KEY=myapikey mi-aplicacion
📌 Importante diferenciar entre ARG y ENV. ARG define variables que se pasan en tiempo de construcción. ENV define variables que se usan en tiempo de ejecución dentro del contenedor.
ARG BUILD_ENV=development
ENV APP_ENV=${BUILD_ENV}
RUN echo "Building for environment: ${APP_ENV}``
docker run -d --name mi-contenedor -p 8080:80 mi-aplicacion
Este comando ejecuta el contenedor en segundo plano (-d), asigna el nombre mi-contenedor, y mapea el puerto 80 del contenedor al puerto 8080 del host (-p 8080:80).
En Docker Compose, un servicio es una definición que describe un contenedor que deseas ejecutar. Cada servicio corresponde a un contenedor, y en el archivo docker-compose.yaml, puedes definir varios servicios para que trabajen juntos como parte de una aplicación más grande
Cuando ejecutas docker-compose up
o docker compose up --build
(Fuerza la reconstrucción de las imágenes antes de levantar los contenedores), Docker Compose realiza las siguientes tareas: Crea y ejecuta los contenedores para cada servicio, Asigna una red. Monta volúmenes y expone puertos.
Ejemplo de Docker compose:
services:
app:
image: mi-aplicacion:latest
- "8080:8080"
depends_on:
- db # 'app' depende del servicio 'db'
db:
image: postgres:13 # Este servicio es la base de datos
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=mi_bd
📌 Importante recordar que docker-compose puede acceder al .env
🚨 🚨 ¿Podemos explicar el flujo de trabajo con Docker? ¿Diferenciamos entre ARG y ENV? ¿Entendemos la función de docker-compose? 🚨 🚨
docker --version
: Verifica la versión de Docker instalada.docker pull <imagen>
: Descarga una imagen de Docker del repositorio de Docker Hub.docker push <imagen>
: Sube una imagen a un registro (registry).docker images
: Lista todas las imágenes descargadas en tu máquina.docker run <imagen>
: Ejecuta un contenedor a partir de una imagen.docker ps
: Muestra todos los contenedores en ejecución.docker ps -a
: Muestra todos los contenedores, incluso los que no están en ejecución.docker stop <id-contenedor>
: Detiene un contenedor en ejecución.docker start <id-contenedor>
: Inicia un contenedor que ha sido detenido.docker rm <id-contenedor>
: Elimina un contenedor detenido.docker rmi <imagen>
: Elimina una imagen de Docker.docker build -t <nombre>:<tag> <directorio>
: Construye una imagen a partir de un Dockerfile.docker exec -it <id-contenedor> <comando>
: Ejecuta un comando dentro de un contenedor en ejecución.docker logs <id-contenedor>
: Muestra los logs de un contenedor.docker-compose up
: Inicia los contenedores definidos en un archivodocker-compose.yml
.docker-compose down
: Detiene y elimina los contenedores definidos endocker-compose.yml
.docker inspect <id-contenedor>
: Muestra detalles de un contenedor o una imagen.docker stats
: Muestra el uso de recursos de los contenedores en ejecución.docker prune
: Elimina imágenes no utilizadas.
🚨 🚨 ¿Me suenan los comandos esenciales? 🚨 🚨
- Haces login con
docker login
- Subes tu imagen a Docker hub etiquetada correctamente. Ejemplo:
docker tag nombre-de-tag:latest tu-username/nombre-de-imagen:latest
- Trabajar con etiquetas
- Ejemplo de node en /node_docker
- Ejemplo con Python en /python_docker
- Introduction to Docker (PDF)
- Curso práctico de Docker y Kubernetes