lección 3
Tu primer contenedor: ejecutar cosas sin instalarlas
docker run, docker ps, docker stop. Ejecutar Python, Node y PostgreSQL sin instalar absolutamente nada.
⏱ 55 min
Aquí es donde Docker pasa de ser un concepto interesante a ser una herramienta que te cambia la vida. En esta lección vas a ejecutar Python, Node.js y hasta un servidor PostgreSQL completo — sin instalar NINGUNO de ellos en tu ordenador. Sin conflictos de versiones, sin contaminar tu sistema, sin "a ver si esto me rompe lo otro que tengo instalado". Cada programa corre aislado en su contenedor, feliz y sin molestar a nadie.
Imagina que tu ordenador es un edificio de apartamentos. Cada contenedor es un inquilino independiente: tiene su propia cocina, su propio baño, su propia decoración. No importa si el vecino del 3ºB tiene la casa llena de gatos — eso no afecta a tu apartamento. Así funcionan los contenedores: cada uno tiene sus propias librerías, su propia versión de Python, su propia configuración — completamente aislado del host y de otros contenedores.
### El comando docker run: tu navaja suiza
docker run es EL comando más importante de Docker. Lo vas a usar miles de veces en tu carrera. Su forma más simple es: docker run <imagen>. Pero tiene decenas de opciones que iremos descubriendo poco a poco.
1# Ejecutar Python 3.12 sin tenerlo instalado2docker run python:3.12 python --version3# Python 3.12.x45# Ejecutar Node.js 20 sin instalarlo6docker run node:20 node --version7# v20.x.x89# Ejecutar un shell interactivo dentro de Python10docker run -it python:3.12 python11# >>> print("¡Hola desde un contenedor!")12# ¡Hola desde un contenedor!13# >>> exit()
Ejecutar lenguajes sin instalarlos — la magia de Docker
Vamos a descomponer lo que acaba de pasar. Cuando ejecutas docker run python:3.12 python --version, Docker hace esto: (1) Busca la imagen python:3.12 en tu disco (si no la tiene, la descarga de Docker Hub). (2) Crea un contenedor nuevo a partir de esa imagen. (3) Dentro del contenedor, ejecuta el comando python --version. (4) Te muestra la salida. (5) El contenedor se detiene porque el comando terminó.
### La flag -it: modo interactivo
Habrás notado el -it en el ejemplo del shell de Python. Esas dos letras son cruciales: -i significa "interactivo" (mantén la entrada estándar abierta) y -t significa "terminal" (asigna un pseudo-terminal). Sin -it, el contenedor ejecuta el comando y se cierra inmediatamente. Con -it, puedes interactuar con él como si estuvieras sentado frente a ese ordenador.
1# Sin -it: ejecuta y se cierra2docker run python:3.12 python -c "print('hola')"3# hola (y se cierra)45# Con -it: abre un shell interactivo6docker run -it python:3.12 bash7# root@a1b2c3d4:/# whoami8# root9# root@a1b2c3d4:/# python --version10# Python 3.12.x11# root@a1b2c3d4:/# exit
La diferencia entre modo batch y modo interactivo
Consejo de senior: el flag -it es como la diferencia entre enviar un email y hacer una llamada telefónica. Sin -it envías un mensaje (ejecutas un comando) y recibes una respuesta. Con -it abres una conversación en tiempo real donde puedes seguir preguntando cosas.
### Tags de imágenes: elegir la versión exacta
Cuando escribes python:3.12, el ":3.12" es el TAG — la versión específica de la imagen. Es como elegir la edición de un libro. Los tags más comunes siguen este patrón:
- python:3.12 — Python 3.12, imagen completa con Debian como base (~900 MB)
- python:3.12-slim — Python 3.12, imagen reducida sin extras (~150 MB)
- python:3.12-alpine — Python 3.12, imagen mínima con Alpine Linux (~50 MB)
- python:latest — La última versión estable (EVITA esto en producción)
- python (sin tag) — Equivale a python:latest
NUNCA uses "latest" en producción o en proyectos serios. latest hoy es Python 3.12, mañana será 3.13, y tu código puede romperse sin que hayas tocado nada. SIEMPRE especifica la versión exacta. En datos, la reproducibilidad es sagrada.
### docker ps: ¿qué está corriendo ahora mismo?
docker ps es tu comando para ver qué contenedores están activos en este momento. Es como el "Administrador de tareas" de Windows o el "Monitor de actividad" de Mac, pero solo para contenedores Docker.
1# Ver contenedores corriendo AHORA MISMO2docker ps3# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES45# Ver TODOS los contenedores (incluso los parados)6docker ps -a7# CONTAINER ID IMAGE COMMAND CREATED STATUS8# a1b2c3d4e5f6 python:3.12 "python --version" 2 minutes ago Exited (0)9# f6e5d4c3b2a1 hello-world "/hello" 10 minutes ago Exited (0)1011# Formato compacto — solo IDs12docker ps -a -q13# a1b2c3d4e5f614# f6e5d4c3b2a1
docker ps: tu ventana a los contenedores activos y pasados
### Ejecutar PostgreSQL: un servidor real en 10 segundos
Ahora viene lo realmente potente. Vamos a levantar un servidor PostgreSQL completo y funcional — la base de datos que usan Netflix, Spotify, Instagram y miles de empresas — con un solo comando. Sin instalador, sin configuración de paths, sin conflictos.
1# Levantar PostgreSQL 16 en background2docker run -d \3 --name mi-postgres \4 -e POSTGRES_PASSWORD=secreto123 \5 -p 5432:5432 \6 postgres:1678# Verificar que está corriendo9docker ps10# CONTAINER ID IMAGE COMMAND PORTS NAMES11# 7f8a9b0c1d2e postgres:16 "docker-entrypoint.s…" 0.0.0.0:5432->5432/tcp mi-postgres1213# Conectarte desde tu ordenador (si tienes psql instalado)14# psql -h localhost -U postgres -p 5432
PostgreSQL en 10 segundos — esto antes tomaba 30 minutos de instalación
Vamos a descomponer las flags nuevas: -d (detached) ejecuta el contenedor en background — no bloquea tu terminal. --name le da un nombre amigable al contenedor. -e define una variable de entorno (PostgreSQL necesita POSTGRES_PASSWORD). -p 5432:5432 mapea el puerto 5432 del contenedor al puerto 5432 de tu ordenador, para que puedas conectarte desde fuera.
### docker stop, docker start, docker rm: control total
1# Parar un contenedor (lo congela, no lo borra)2docker stop mi-postgres34# Ver que está parado pero existe5docker ps -a6# STATUS: Exited (0) 5 seconds ago78# Arrancarlo de nuevo (mantiene los datos)9docker start mi-postgres1011# Parar Y BORRAR un contenedor definitivamente12docker stop mi-postgres13docker rm mi-postgres1415# Atajo: borrar un contenedor que está corriendo16docker rm -f mi-postgres1718# Limpiar TODOS los contenedores parados19docker container prune
El ciclo de vida de un contenedor: crear, parar, arrancar, borrar
Consejo de senior: siempre nombra tus contenedores con --name. Sin nombre, Docker les asigna nombres aleatorios tipo "cranky_einstein" o "happy_curie" que son divertidos pero imposibles de recordar. Con nombres descriptivos como "mi-postgres" o "redis-cache" sabes exactamente qué es cada contenedor.
### docker logs: ver qué dice tu contenedor
1# Ver los logs de un contenedor2docker logs mi-postgres34# Seguir los logs en tiempo real (como tail -f)5docker logs -f mi-postgres6# PostgreSQL init process complete; ready for start up.7# Ctrl+C para salir89# Ver solo las últimas 20 líneas10docker logs --tail 20 mi-postgres
docker logs: tu ventana al interior del contenedor
Los logs son tu herramienta de diagnóstico número uno. Cuando algo no funciona, lo primero que haces es docker logs <nombre>. Ahí verás mensajes de error, advertencias, y el estado del servicio. Es el equivalente a abrir el capó del coche cuando hace un ruido raro.
## ejercicios
Ejecuta Python sin instalarlo
QA necesita probar en Python 3.11. Tres comandos: ejecutar un script, abrir el REPL interactivo y verificar la versión. Usa --rm para no dejar basura.
Levanta y gestiona PostgreSQL
PostgreSQL 15 en background: password "data2024", puerto 5433 de tu máquina al 5432 del contenedor. Los cinco pasos del ciclo de vida.
Inventario y limpieza
Tu disco está al 90%. Limpia Docker en el orden correcto: primero los contenedores parados (que retienen las imágenes), después las imágenes.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...