Alpine Linux
Alpine Linux es una distribución de Linux extremadamente ligera y segura, diseñada específicamente para entornos containerizados como Docker.
Características principales de Alpine:
Tamaño mínimo: La imagen oficial de Alpine ocupa solo ~5MB
Seguridad: Diseñada con seguridad en mente, superficie de ataque reducida
Rendimiento: Arranque rápido y consumo mínimo de recursos
Basada en musl libc: En lugar de glibc, lo que la hace más ligera
Gestor de paquetes:
apk(Alpine Package Keeper)
Por qué se usa Alpine en Docker:
# Comparación de tamaños:
alpine:latest ≈ 5MB
ubuntu:latest ≈ 70MB
debian:latest ≈ 120MB
centos:latest ≈ 200MBEn tu ejemplo:
# Alpine - muy ligero docker run alpine echo "Hola Mundo desde Docker!" # Ubuntu - más pesado pero más compatible docker run ubuntu echo "Hola Mundo desde Docker con Ubuntu!"
Ventajas de usar Alpine:
Descargas más rápidas
Menos consumo de disco
Menor exposición a vulnerabilidades
Ideal para microservicios y aplicaciones minimalistas
Desventajas:
Algunas aplicaciones pueden no ser compatibles con musl libc
Menos paquetes disponibles comparado con Ubuntu/Debian
Alpine es la opción preferida
Esos ejemplos son didácticos, no de uso real
Esos comandos son solo para demostración del concepto básico de Docker, pero no representan un uso real en producción.
¿Qué está pasando realmente en esos ejemplos?
# Esto NO es "contenerizar Alpine" docker run alpine echo "Hola Mundo" # Lo que realmente hace: # 1. Descarga imagen alpine (si no existe) # 2. Crea contenedor temporal # 3. Ejecuta el comando `echo` # 4. El contenedor se detiene (porque echo termina)
Uso real vs. Ejemplo didáctico
❌ Ejemplo didáctico (poco útil):
docker run ubuntu echo "Hola Mundo" # Descarga 70MB solo para ejecutar un echo
✅ Uso real (en producción):
# Dockerfile real para una aplicación FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["npm", "start"]
Casos reales donde SÍ usarías alpine o ubuntu directamente:
1. Debugging o troubleshooting:
# Para inspeccionar problemas docker run -it --rm alpine sh docker run -it --rm ubuntu bash
2. Scripting o tareas temporales:
# Procesar archivos temporalmente docker run --rm -v $(pwd):/data alpine sh -c "cd /data && process-files.sh"
3. Como base para tu Dockerfile:
FROM alpine RUN apk add --no-cache python3 COPY app.py . CMD ["python3", "app.py"]
En resumen:
Sí, es raro hacer
docker run alpine/ubuntudirectamente en producciónSí, es común usar
alpine/ubuntucomo base en DockerfilesLos ejemplos de "Hola Mundo" son solo educativos
En la vida real, contenerizas aplicaciones, no SOs completos
Tu intuición es correcta: No tiene sentido práctico crear contenedores solo para ejecutar comandos básicos en un SO.
El Dockerfile que muestras ya está usando una base específica, solo que no es visible directamente.
¿Qué pasa en tu ejemplo?
FROM php:8.2-fpm # Esta imagen YA tiene un sistema base incluido
La imagen php:8.2-fpm está construida sobre alguna base (probablemente Debian), por eso puedes usar apt-get.
Para saber qué base usa una imagen:
# Inspeccionar la imagen docker image inspect php:8.2-fpm | grep -A5 "RootFS" # O ejecutar y verificar docker run --rm php:8.2-fpm cat /etc/os-release
Diferentes variantes de la misma imagen:
# Diferentes bases para la misma versión de PHP: # 1. Basada en Debian (default) - usa apt-get FROM php:8.2-fpm RUN apt-get update && apt-get install -y git # 2. Basada en Alpine - usa apk FROM php:8.2-fpm-alpine RUN apk add --no-cache git # 3. Basada en Ubuntu FROM php:8.2-fpm-bullseye
En tu caso específico:
FROM php:8.2-fpm
# Esta imagen probablemente usa Debian como base
# Por eso FUNCIONA apt-get
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev¿Cuándo SÍ especificar el sistema?
Cuando quieres control explícito:
# Opción 1: Quieres máxima ligereza
FROM php:8.2-fpm-alpine
RUN apk add --no-cache \
git \
curl
# Opción 2: Quieres máxima compatibilidad
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y \
git \
curlResumen:
No es obligatorio especificar el sistema
La imagen base ya decide el sistema subyacente
Tu Dockerfile actual está bien como está
Solo especifica
-alpinesi necesitas esa variante específica
Comentarios
Publicar un comentario