Saltar al contenido

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 instalado
2docker run python:3.12 python --version
3# Python 3.12.x
4
5# Ejecutar Node.js 20 sin instalarlo
6docker run node:20 node --version
7# v20.x.x
8
9# Ejecutar un shell interactivo dentro de Python
10docker run -it python:3.12 python
11# >>> 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 cierra
2docker run python:3.12 python -c "print('hola')"
3# hola (y se cierra)
4
5# Con -it: abre un shell interactivo
6docker run -it python:3.12 bash
7# root@a1b2c3d4:/# whoami
8# root
9# root@a1b2c3d4:/# python --version
10# Python 3.12.x
11# 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 MISMO
2docker ps
3# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4
5# Ver TODOS los contenedores (incluso los parados)
6docker ps -a
7# CONTAINER ID IMAGE COMMAND CREATED STATUS
8# a1b2c3d4e5f6 python:3.12 "python --version" 2 minutes ago Exited (0)
9# f6e5d4c3b2a1 hello-world "/hello" 10 minutes ago Exited (0)
10
11# Formato compacto — solo IDs
12docker ps -a -q
13# a1b2c3d4e5f6
14# 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 background
2docker run -d \
3 --name mi-postgres \
4 -e POSTGRES_PASSWORD=secreto123 \
5 -p 5432:5432 \
6 postgres:16
7
8# Verificar que está corriendo
9docker ps
10# CONTAINER ID IMAGE COMMAND PORTS NAMES
11# 7f8a9b0c1d2e postgres:16 "docker-entrypoint.s…" 0.0.0.0:5432->5432/tcp mi-postgres
12
13# 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-postgres
3
4# Ver que está parado pero existe
5docker ps -a
6# STATUS: Exited (0) 5 seconds ago
7
8# Arrancarlo de nuevo (mantiene los datos)
9docker start mi-postgres
10
11# Parar Y BORRAR un contenedor definitivamente
12docker stop mi-postgres
13docker rm mi-postgres
14
15# Atajo: borrar un contenedor que está corriendo
16docker rm -f mi-postgres
17
18# Limpiar TODOS los contenedores parados
19docker 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 contenedor
2docker logs mi-postgres
3
4# Seguir los logs en tiempo real (como tail -f)
5docker logs -f mi-postgres
6# PostgreSQL init process complete; ready for start up.
7# Ctrl+C para salir
8
9# Ver solo las últimas 20 líneas
10docker 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

[01]

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.

Cargando editor...
[02]

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.

Cargando editor...
[03]

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.

Cargando editor...

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...