Día 36 - Desplegar contenedor Nginx con Docker
Problema / Desafío
El equipo DevOps de Nautilus necesita desplegar un contenedor Nginx en el App Server 3 (stapp03). Requisitos:
- Crear un contenedor llamado
nginx_3 - Usar la imagen
nginxcon el tagalpine - El contenedor debe estar en estado
running
Conceptos clave
Imagen vs Contenedor
Imagen (nginx:alpine) → Contenedor (nginx_3)
plantilla de solo → instancia en ejecución
lectura con su propio filesystem,
red y proceso
Una imagen puede generar múltiples contenedores. El tag alpine especifica qué variante de la imagen usar.
nginx:alpine vs nginx:latest
nginx:alpine |
nginx:latest |
|
|---|---|---|
| Base OS | Alpine Linux | Debian |
| Tamaño | ~40 MB | ~190 MB |
| Uso en producción | Muy común | Menos preferido |
| Superficie de ataque | Mínima | Mayor |
Flags de docker run
| Flag | Significado |
|---|---|
-d |
Detached — libera la terminal, el contenedor corre en background |
--name |
Nombre propio del contenedor (sin esto Docker asigna uno random) |
-p <host>:<container> |
Mapea un puerto del host a un puerto del contenedor |
daemon off en Nginx
El proceso principal de Nginx normalmente se lanza en background (daemon). En Docker, el proceso principal debe correr en foreground — si termina, el contenedor se detiene. Por eso la imagen oficial usa nginx -g "daemon off;" como CMD.
docker run nginx:alpine
↓
/docker-entrypoint.sh (inicializa config)
↓
nginx -g "daemon off;" (proceso principal, foreground)
↓
contenedor vivo mientras nginx corra
Pasos
- Verificar que Docker está instalado en App Server 3
- Ejecutar el contenedor con los parámetros correctos
- Verificar que está en estado
running - Probar conectividad con
curl localhost
Comandos / Código
1. Verificar Docker
2. Ejecutar el contenedor
Docker imprime el ID completo del contenedor al crearlo.
3. Verificar estado
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f781b2ce076 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp nginx_3
STATUS: Up confirma que el contenedor está running.
4. Probar conectividad
Nginx respondiendo en el puerto 80 del host.
5. Inspeccionar el contenedor
{
"Id": "9f781b2ce076c046f6b07d5e087fa20efb1030361849f48b6677831d457fe0ee",
"Created": "2026-04-23T10:34:08.947626464Z",
"Path": "/docker-entrypoint.sh",
"Args": ["nginx", "-g", "daemon off;"],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"ExitCode": 0,
"StartedAt": "2026-04-23T10:34:09.474779414Z"
}
}
inspect devuelve todos los metadatos del contenedor en JSON: estado, red, volúmenes, variables de entorno, entrypoint, etc.
Referencia rápida de comandos Docker útiles
docker ps # contenedores en ejecución
docker ps -a # todos los contenedores (incluye detenidos)
docker ps -aq # solo los IDs de todos los contenedores
docker logs nginx_3 # logs del contenedor
docker logs $(docker ps -aq -f "name=nginx_3") # logs filtrando por nombre
docker inspect <id|name> # metadata completa del contenedor
docker stop nginx_3 # detener el contenedor
docker rm nginx_3 # eliminar el contenedor (debe estar detenido)
docker exec -it nginx_3 sh # abrir shell dentro del contenedor
Filtros útiles con docker ps -f
docker ps -f "name=nginx_3" # filtrar por nombre
docker ps -f "status=running" # filtrar por estado
docker ps -f "ancestor=nginx" # filtrar por imagen base
Troubleshooting
| Problema | Solución |
|---|---|
port is already allocated al hacer -p 80:80 |
El puerto 80 del host está ocupado — cambiar el puerto host: -p 8080:80 |
Conflict. The container name "nginx_3" is already in use |
Eliminar el contenedor existente: docker rm -f nginx_3 |
| Contenedor se detiene inmediatamente | El proceso principal terminó — revisar con docker logs nginx_3 |
docker: permission denied |
Agregar el usuario al grupo docker: sudo usermod -aG docker $USER |