En mi ordenador funciona
Lucía trabaja en una tienda online de ropa en Valencia. Prepara un cambio en la web y lo prueba en su portátil. Todo va bien.
El lunes el cambio llega al servidor y la página de pago falla. El servidor tiene una versión antigua de Python.
Lucía dice la frase más repetida del sector: "En mi ordenador funciona". Esta lección explica cómo se evita.
Al final de esta lección
Nota
Puedo explicar qué es un contenedor y por qué lo usan los equipos.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Dependencia | un programa que tu aplicación necesita para funcionar | flask 3.0 |
| Imagen | un paquete con la aplicación y todo lo que necesita | |
| Contenedor | una imagen en marcha, aislada del resto del equipo | |
| Dockerfile | el archivo de instrucciones para crear una imagen | |
| Registro | un almacén de imágenes en la red |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dos equipos casi iguales no son iguales
Una aplicación nunca va sola. Necesita un lenguaje, unas librerías y algunos ajustes del sistema. Cada una de esas piezas es una dependencia.
Si el portátil y el servidor tienen versiones distintas, la aplicación puede fallar en uno y no en el otro.
Ejecuta el bloque siguiente. Compara las dependencias de los dos equipos de Lucía.
Comparar el portátil y el servidor
mkdir -p tienda && cd tienda
printf 'python 3.12\nflask 3.0\npillow 10.4\n' > portatil.txt
printf 'python 3.8\nflask 2.0\npillow 10.4\n' > servidor.txt
# diff enseña las líneas que no coinciden entre los dos equipos
diff portatil.txt servidor.txt && echo "Los dos equipos son iguales"
# Cambia servidor.txt para que use python 3.12 y flask 3.0,
# vuelve a pulsar Ejecutar y lee el mensaje final.
Una imagen lleva la aplicación y sus dependencias
La solución es empaquetar la aplicación junto con todas sus dependencias. Ese paquete se llama imagen.
La receta de la imagen se escribe en un Dockerfile. Cada línea es una instrucción: de qué sistema partir, qué instalar, qué copiar y cómo arrancar.
Cuando la imagen se pone en marcha, tienes un contenedor. Es la misma imagen en el portátil y en el servidor.
Leer un Dockerfile
mkdir -p tienda && cd tienda
cat > Dockerfile <<'FIN'
# La imagen base: un sistema pequeño con Python 3.12 ya instalado
FROM python:3.12-slim
WORKDIR /app
# Primero las dependencias, luego el código
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
FIN
# Cuenta las instrucciones: cada línea que empieza en mayúsculas
grep -c '^[A-Z]' Dockerfile
grep '^FROM' Dockerfile
Tres órdenes de Docker muy habituales
Docker es la herramienta de contenedores más usada. Este entorno no tiene Docker, así que aquí tienes una salida real.
docker build crea la imagen y le pone un nombre con versión. docker run arranca un contenedor. docker ps lista los contenedores en marcha.
Construir, arrancar y listar
$ docker build -t tienda:1.4 .
=> [1/5] FROM python:3.12-slim
=> [3/5] RUN pip install -r requirements.txt
=> naming to docker.io/library/tienda:1.4
$ docker run -d -p 8000:8000 tienda:1.4
3f9c1a7e52b0
$ docker ps
CONTAINER ID IMAGE STATUS PORTS
3f9c1a7e52b0 tienda:1.4 Up 8 seconds 0.0.0.0:8000->8000/tcpUn error frecuente
Advertencia
Mucha gente cree que un contenedor es una máquina virtual pequeña. No lo es. Una máquina virtual lleva su propio sistema operativo completo. Un contenedor comparte el sistema del equipo y solo aísla la aplicación. Por eso arranca en segundos.
Máquina virtual y contenedor
| Máquina virtual | Contenedor | |
|---|---|---|
| Sistema operativo | Uno propio, completo | Comparte el del equipo |
| Tamaño habitual | Varios GB | Decenas o cientos de MB |
| Tiempo de arranque | Minutos | Segundos |
| Uso típico | Separar sistemas enteros | Empaquetar una aplicación |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.