16. Variables de entorno
docker --version
Variables de Entorno en Docker
¿Qué son las Variables de Entorno?
Analogía: Imagina que estás entrando a una habitación con diferentes configuraciones de luz, temperatura y sonido. Las variables de entorno son como los interruptores y controles que ajustan cómo se comporta todo dentro de esa habitación (contenedor).
Definición simple
Son valores configurables que afectan cómo se ejecutan los programas dentro de un contenedor Docker. Son pares clave-valor que pasamos al contenedor cuando lo iniciamos.
¿Por qué usar Variables de Entorno?
1. Configuración Dinámica
# Ejemplo: Configurar una base de datos
docker run -e DB_PASSWORD=mi_clave_secreta mysql2. Seguridad
Separar configuración del código
No hardcodear credenciales
Diferentes valores para desarrollo/producción
3. Portabilidad
Mismo contenedor, diferente comportamiento según las variables.
Cómo usar Variables de Entorno
Método 1: Directamente en el comando
docker run -e VARIABLE=valor nombre_imagenEjemplo práctico:
# Levantar PostgreSQL con contraseña
docker run --name mi-db \
-e POSTGRES_PASSWORD=clave123 \
-d postgresMétodo 2: Archivo .env
# Crear archivo .env
echo "POSTGRES_PASSWORD=clave_segura" > .env
echo "POSTGRES_USER=mi_usuario" >> .env
# Usar el archivo
docker run --env-file .env postgresMétodo 3: Variables del sistema
# Usar variable del sistema host
export DB_PASS=mi_secreto
docker run -e PASSWORD=$DB_PASS mi_appDiagrama Visual (ASCII)
┌─────────────────────────────────────────┐
│ HOST (Tu Computadora) │
│ │
│ ┌───────────────────────────────────┐ │
│ │ Terminal │ │
│ │ $ docker run -e VAR=valor imagen │ │
│ └───────────────────────────────────┘ │
│ │ │
│ ▼ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ CONTENEDOR DOCKER │
│ │
│ ┌───────────────────────────────────┐ │
│ │ Variables de Entorno: │ │
│ │ • VAR = "valor" │ │
│ │ • PATH = "/usr/bin" │ │
│ │ • HOME = "/root" │ │
│ └───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────┐ │
│ │ Aplicación │ │
│ │ Usa process.env.VAR │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘Ejemplos Paso a Paso
Ejemplo 1: WordPress con MySQL
# Base de datos MySQL
docker run --name wordpress-db \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-d mysql:5.7
# WordPress
docker run --name wordpress \
--link wordpress-db:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass \
-e WORDPRESS_DB_NAME=wordpress \
-p 8080:80 \
-d wordpressEjemplo 2: Aplicación Node.js
# Dockerfile para la aplicación
# (Contenido hipotético)
# FROM node:14
# COPY . .
# CMD ["node", "app.js"]
docker run -d \
-e NODE_ENV=production \
-e PORT=3000 \
-e API_KEY=abc123def456 \
-p 3000:3000 \
mi-app-nodeBuenas Prácticas
✅ RECOMENDADO
Usar nombres descriptivos en MAYÚSCULAS
Documentar las variables necesarias
Usar archivos .env para múltiples variables
Validar variables requeridas al iniciar
❌ NO RECOMENDADO
Guardar contraseñas en Dockerfiles
Usar valores por defecto inseguros
Exponer variables sensibles en logs
Ignorar variables faltantes
Caso de Estudio: PostgreSQL
1. Buscar documentación oficial
# Ver en Docker Hub qué variables soporta
# Visitar: https://hub.docker.com/_/postgres2. Variables comunes de PostgreSQL
POSTGRES_PASSWORD (OBLIGATORIA)
POSTGRES_USER (opcional, default: postgres)
POSTGRES_DB (opcional)
POSTGRES_INITDB_ARGS (opcional)3. Ejecutar con variables personalizadas
# Descargar imagen
docker pull postgres
# Ejecutar con configuración
docker run --name mi-postgres \
-e POSTGRES_PASSWORD=SuperSecreto123 \
-e POSTGRES_USER=admin \
-e POSTGRES_DB=mi_base_datos \
-p 5432:5432 \
-d postgres:alpine
# Verificar
docker logs mi-postgresPreguntas Frecuentes
❓ ¿Dónde veo qué variables acepta una imagen?
Consulta la documentación en Docker Hub o el README del repositorio.
❓ ¿Las variables persisten?
No, son específicas para cada ejecución del contenedor.
❓ ¿Puedo cambiar variables sin reiniciar?
Generalmente no, se requieren al inicio.
❓ ¿Son seguras las variables?
Sí, pero evita pasarlas en scripts públicos o logs.
Cuestionario
Preguntas
¿Qué son las variables de entorno en Docker?
a) Archivos de configuración del sistema
b) Valores que afectan la ejecución de programas en contenedores
c) Comandos de Docker
d) Imágenes preconfiguradas¿Cuál es la forma CORRECTA de pasar una variable al iniciar un contenedor?
a)docker run --variable NAME=value imagen
b)docker run -e NAME=value imagen
c)docker run --env NAME:value imagen
d)docker run -v NAME=value imagen¿Por qué es mejor usar variables de entorno que hardcodear valores?
a) Porque es más rápido
b) Por seguridad y portabilidad
c) Porque ocupa menos memoria
d) Porque Docker lo exige¿Qué hace el parámetro
--env-file?
a) Crea un archivo de variables
b) Lee variables desde un archivo
c) Envía variables al host
d) Encripta las variablesEn el comando
docker run -e DB_PASS=1234 -e PORT=3000 app, ¿cuántas variables se pasan?
a) 0
b) 1
c) 2
d) 3¿Cuál es una buena práctica para variables con contraseñas?
a) Usar "password" como valor por defecto
b) Guardarlas en el Dockerfile
c) Usar archivos .env y no versionarlos
d) Mostrarlas en los logs para debugging¿Qué ocurre si una variable obligatoria falta?
a) El contenedor no inicia
b) Docker usa un valor aleatorio
c) La aplicación puede fallar
d) Ambas a y cPara PostgreSQL, ¿qué variable es OBLIGATORIA?
a) POSTGRES_USER
b) POSTGRES_DB
c) POSTGRES_PASSWORD
d) POSTGRES_PORT
Respuestas
b) Valores que afectan la ejecución de programas en contenedores
b)
docker run -e NAME=value imagenb) Por seguridad y portabilidad
b) Lee variables desde un archivo
c) 2 (DB_PASS y PORT)
c) Usar archivos .env y no versionarlos
d) Ambas a y c (El contenedor no inicia y la aplicación puede fallar)
c) POSTGRES_PASSWORD
Tutorial Mejorado: Variables de Entorno en Docker
🎯 Concepto Claro y Simple
Las variables de entorno son como "instrucciones de configuración" que le damos a un contenedor Docker cuando lo iniciamos. Piensa en ellas como los ajustes que haces al arrancar un videojuego: idioma, dificultad, resolución...
🔍 ¿Para qué sirven?
Escenario Práctico:
Imagina que tienes una aplicación que necesita conectarse a una base de datos. En lugar de poner la contraseña directamente en el código (¡peligroso!), usas una variable de entorno:
# MAL ❌ (contraseña en el código)
conexión = "usuario:contraseña123@servidor"
# BIEN ✅ (usando variable de entorno)
conexión = f"usuario:{os.getenv('DB_PASS')}@servidor"🚀 Cómo Empezar PASO a PASO
Paso 1: Entender la sintaxis básica
# Estructura básica
docker run -e NOMBRE_VARIABLE=VALOR nombre_imagen
# Ejemplo real
docker run -e LANG=es_MX -e TZ=America/Mexico_City ubuntuPaso 2: Probar con un ejemplo sencillo
# Usar la imagen 'alpine' (muy liviana)
docker run -e SALUDO="Hola Mundo" alpine env | grep SALUDO
# Output: SALUDO=Hola Mundo📁 Tres Métodos para Pasar Variables
Método A: Una por una (para pocas variables)
docker run \
-e USUARIO=admin \
-e CLAVE=secreta \
mi-appMétodo B: Archivo de configuración (para muchas)
# 1. Crear archivo config.env
USUARIO=admin
CLAVE=secreta
MODO=produccion
PUERTO=3000
# 2. Usarlo
docker run --env-file config.env mi-appMétodo C: Desde tu sistema (avanzado)
# En tu terminal
export TOKEN_API=abc123
# En Docker (se pasa automáticamente)
docker run -e TOKEN_API mi-app🐘 Ejemplo REAL: PostgreSQL
Buscar información oficial:
Busca "Environment Variables"
Encuentras las variables soportadas
Ejecutar PostgreSQL correctamente:
# ¡IMPORTANTE! PostgreSQL EXIGE una contraseña
docker run -d \
--name mi-bd \
-e POSTGRES_PASSWORD=UnaClaveSegura123! \
-e POSTGRES_USER=mi_usuario \
-e POSTGRES_DB=mi_base \
-p 5432:5432 \
postgres:alpine # ← Versión más pequeña
# Verificar que funciona
docker logs mi-bd🛡️ Seguridad - Lo MÁS IMPORTANTE
REGLA DE ORO: Nunca hagas esto
# ❌ PELIGROSO - Queda en el historial de comandos
docker run -e PASSWORD=1234 app
# ❌ PELIGROSO - Visible con 'docker inspect'
docker run -e PASSWORD=1234 appHacerlo BIEN:
# ✅ SEGURO - Usar archivo .env (agregar a .gitignore)
echo "DB_PASSWORD=$(openssl rand -base64 32)" > .env.secreto
docker run --env-file .env.secreto app
# ✅ SEGURO - Pedir al usuario
read -s -p "Contraseña DB: " db_pass
docker run -e DB_PASSWORD="$db_pass" app📊 Resumen Visual
TU COMPUTADORA
│
├─ Archivo .env (configuraciones)
│
└─ Comando: docker run -e VAR=valor
│
▼
CONTENEDOR DOCKER
│
├─ VAR = "valor" ✓
├─ App los lee
└─ Se comporta según config💡 Consejos para Principiantes
Empieza simple: Prueba con 1-2 variables primero
Nombres claros: USAR_MAYÚSCULAS_Y_GUIONES_BAJO
Documenta: Crea un archivo
.env.examplecon ejemplosPrueba errores: ¿Qué pasa si falta una variable?
Usa valores por defecto en tu código cuando sea posible
🎮 Ejercicio Práctico
Crear un contenedor Nginx personalizado:
# 1. Crear archivo de configuración
cat > nginx-config.env << EOF
NGINX_PORT=8080
NGINX_HOST=localhost
SERVER_NAME=mi_sitio
EOF
# 2. Ejecutar (usando imagen oficial)
docker run -d \
--env-file nginx-config.env \
-p 8080:80 \
nginx:alpine
# 3. Verificar
curl http://localhost:8080❓ Preguntas para Reflexionar
¿Qué variables necesitaría una app web típica?
¿Cómo manejarías desarrollo vs producción?
¿Dónde guardarías las variables más sensibles?
📚 Recursos Adicionales
Documentación oficial Docker:
docker run --helpBusca "[nombre-imagen] environment variables" en Google
Practica con imágenes oficiales (postgres, mysql, nginx, node)
Recuerda: Las variables de entorno son tu amiga para hacer aplicaciones flexibles y seguras. ¡Empieza con ejemplos simples y ve avanzando gradualmente!
Comentarios
Publicar un comentario