31/12/2022
En el vertiginoso mundo del desarrollo y la administración de sistemas, la eficiencia y la portabilidad son clave. Aquí es donde la combinación de NGINX, el servidor web y proxy inverso de alto rendimiento, y Docker, la plataforma de contenedorización líder, se convierte en una alianza estratégica. Docker permite empaquetar una aplicación con todas sus dependencias en una unidad estandarizada para el desarrollo de software, mientras que NGINX se encarga de servir contenido estático, actuar como proxy inverso o balanceador de carga con una eficiencia excepcional. Juntos, ofrecen una solución robusta, escalable y fácilmente gestionable. Este artículo es una guía exhaustiva que te llevará de la mano para desplegar, configurar y administrar tanto NGINX Open Source como la versión comercial NGINX Plus utilizando Docker, cubriendo desde los conceptos básicos hasta las técnicas de gestión más avanzadas.

- ¿Por qué utilizar NGINX con Docker?
- Despliegue de NGINX Open Source con Docker
- Despliegue de NGINX Plus en Docker
- Gestión de Configuración y Contenido
- Administración de Logs
- Controlando el Proceso de NGINX dentro del Contenedor
- Tabla Comparativa: Despliegue en Docker
- Preguntas Frecuentes (FAQ)
- Conclusión
¿Por qué utilizar NGINX con Docker?
Antes de sumergirnos en los comandos y configuraciones, es fundamental entender los beneficios de esta dupla tecnológica. La contenedorización con Docker proporciona un entorno aislado y consistente, eliminando el clásico problema de "en mi máquina funciona". Al ejecutar NGINX en un contenedor, te aseguras de que se comportará de la misma manera en desarrollo, pruebas y producción. Esto simplifica enormemente los despliegues y reduce los errores. Además, la naturaleza ligera de los contenedores permite escalar horizontalmente con una facilidad asombrosa, lanzando nuevas instancias de NGINX en segundos para manejar picos de tráfico.
Despliegue de NGINX Open Source con Docker
La versión de código abierto de NGINX es increíblemente popular y su despliegue en Docker es un proceso muy sencillo gracias a la imagen oficial disponible en Docker Hub.
Paso 1: Obtener la Imagen Oficial
El primer paso es descargar la imagen de NGINX desde el repositorio público de Docker Hub. Esto se hace con un simple comando:
docker pull nginxEste comando buscará la etiqueta `latest` por defecto, descargando la versión más reciente de la imagen oficial de NGINX.
Paso 2: Iniciar un Contenedor NGINX
Una vez que tienes la imagen en tu sistema local, puedes lanzar un contenedor. El siguiente comando inicia una instancia de NGINX en segundo plano, mapeando el puerto 80 del contenedor al puerto 80 de tu máquina host.
docker run --name mi-nginx -p 80:80 -d nginxDesglosemos los parámetros utilizados:
- `--name mi-nginx`: Asigna un nombre legible al contenedor, en este caso, "mi-nginx". Esto facilita su gestión posterior.
- `-p 80:80`: Mapea el puerto 80 del host (el primer número) al puerto 80 del contenedor (el segundo número). Si el puerto 80 de tu host ya está en uso, puedes cambiarlo, por ejemplo, a `-p 8080:80`.
- `-d`: Ejecuta el contenedor en modo "detached" o desacoplado, lo que significa que se ejecuta en segundo plano.
- `nginx`: Es el nombre de la imagen que se utilizará para crear el contenedor.
Paso 3: Verificar el Funcionamiento
Para confirmar que tu contenedor está en ejecución, puedes usar el comando `docker ps`:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcd1fb01b145 nginx:latest "nginx -g 'daemon of…" 16 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp mi-nginxSi ves una salida similar, ¡felicidades! Tu contenedor NGINX está funcionando. Ahora puedes abrir un navegador web y visitar `http://localhost` para ver la página de bienvenida de NGINX.
Despliegue de NGINX Plus en Docker
NGINX Plus es la versión comercial con características avanzadas de balanceo de carga, monitoreo en tiempo real y soporte empresarial. Su despliegue en Docker requiere algunos pasos adicionales, ya que las imágenes no son públicas.
Requisitos Previos
Para obtener la imagen de NGINX Plus, necesitas una suscripción activa. Desde el portal de clientes MyF5, deberás descargar tus credenciales de acceso al repositorio privado. Tienes dos opciones:
- JSON Web Token (JWT): Un archivo `.jwt` que contiene tus credenciales de acceso.
- Certificado y Clave SSL: Los archivos `nginx-repo.crt` y `nginx-repo.key`.
Paso 1: Autenticación en el Registro Privado
Debes iniciar sesión en el registro privado de NGINX (`private-registry.nginx.com`). Si usas un JWT, el proceso es el siguiente:
docker login private-registry.nginx.com --username=<contenido_del_archivo_jwt> --password=noneSi utilizas certificado y clave SSL, primero debes ubicarlos en un directorio específico para que Docker los reconozca:
mkdir -p /etc/docker/certs.d/private-registry.nginx.com cp <ruta_a_tu_nginx-repo.crt> /etc/docker/certs.d/private-registry.nginx.com/client.cert cp <ruta_a_tu_nginx-repo.key> /etc/docker/certs.d/private-registry.nginx.com/client.key docker login private-registry.nginx.comPaso 2: Descargar la Imagen de NGINX Plus
Una vez autenticado, puedes descargar la imagen deseada. Las imágenes están etiquetadas por versión y sistema operativo base (Alpine, Debian, UBI).
docker pull private-registry.nginx.com/nginx-plus/base:<etiqueta-version>Por ejemplo, `r36-alpine`.
Paso 3: Subir la Imagen a tu Propio Registro Privado
¡Atención! Por motivos de licencia, nunca debes subir imágenes de NGINX Plus a un repositorio público como Docker Hub. Debes utilizar tu propio registro privado.
# Etiquetar la imagen para tu registro docker tag private-registry.nginx.com/nginx-plus/base:<etiqueta> <tu-registro-privado>/nginx-plus:<etiqueta> # Subir la imagen docker push <tu-registro-privado>/nginx-plus:<etiqueta>Paso 4: Iniciar el Contenedor de NGINX Plus
Para iniciar el contenedor, debes proporcionar tu licencia, que también se descarga desde el portal MyF5 en formato JWT (por ejemplo, `license.jwt`), a través de una variable de entorno.
sudo docker run \ --env=NGINX_LICENSE_JWT=$(cat license.jwt) \ --name mi-nginx-plus -p 80:80 \ -d <tu-registro-privado>/nginx-plus:<etiqueta>Gestión de Configuración y Contenido
Un servidor web no es útil sin contenido y configuración personalizada. Existen varias estrategias para gestionar estos archivos en un entorno Docker.
Método 1: Montaje de Volúmenes del Host (Bind Mounts)
Este es el método más común para desarrollo. Permite mapear un directorio de tu máquina host directamente a un directorio dentro del contenedor. Cualquier cambio en los archivos del host se refleja instantáneamente en el contenedor.
docker run --name mi-nginx-contenido \ --mount type=bind,source=/ruta/local/web,target=/usr/share/nginx/html,readonly \ --mount type=bind,source=/ruta/local/conf,target=/etc/nginx/conf.d,readonly \ -p 8080:80 -d nginx- `source`: La ruta en tu máquina host.
- `target`: La ruta dentro del contenedor.
- `readonly`: (Opcional) Hace que el directorio sea de solo lectura desde dentro del contenedor, una buena práctica de seguridad.
Método 2: Copiar Archivos a la Imagen (Dockerfile)
Para entornos de producción, es preferible construir una imagen personalizada que contenga tu aplicación y la configuración de NGINX. Esto crea un artefacto inmutable y versionable. Se logra mediante un `Dockerfile`.
Crea un archivo llamado `Dockerfile`:
# Usar la imagen base de NGINX FROM nginx:alpine # Eliminar la configuración por defecto RUN rm /etc/nginx/conf.d/default.conf # Copiar los archivos de configuración personalizados COPY nginx.conf /etc/nginx/nginx.conf # Copiar el contenido del sitio web COPY html /usr/share/nginx/htmlLuego, construye tu imagen y ejecútala:
# Construir la imagen docker build -t mi-nginx-personalizado . # Ejecutar un contenedor desde la nueva imagen docker run --name mi-app -p 80:80 -d mi-nginx-personalizadoAdministración de Logs
Por defecto, NGINX en Docker envía sus logs de acceso y error a la salida estándar (`stdout`) y error estándar (`stderr`). Docker captura estas salidas, lo que te permite ver los logs de un contenedor con un simple comando:
docker logs mi-nginxPara ver los logs en tiempo real, similar a un `tail -f`, puedes agregar el flag `-f`:
docker logs -f mi-nginxSi necesitas una gestión de logs más avanzada (por ejemplo, enviarlos a un sistema centralizado como ELK o Splunk), puedes configurar un `logging driver` en Docker o montar un volumen en `/var/log/nginx` dentro del contenedor y gestionar los archivos de log desde allí.
Controlando el Proceso de NGINX dentro del Contenedor
A menudo necesitarás interactuar con el proceso de NGINX, por ejemplo, para recargar la configuración después de un cambio. Como no tienes un shell directo, no puedes ejecutar `nginx -s reload` de la forma tradicional. En su lugar, envías señales al proceso a través de Docker.
- Recargar configuración: Para aplicar cambios en los archivos de configuración sin reiniciar el servidor, se envía la señal `HUP`.
docker kill -s HUP mi-nginx- Reiniciar NGINX: La forma más sencilla y recomendada de reiniciar el proceso es reiniciando el contenedor completo.
docker restart mi-nginxTabla Comparativa: Despliegue en Docker
| Característica | NGINX Open Source | NGINX Plus |
|---|---|---|
| Fuente de la Imagen | Docker Hub (Público) | private-registry.nginx.com (Privado) |
| Autenticación | No requerida | Requerida (JWT o Certificado/Clave SSL) |
| Licencia en Ejecución | No aplica | Requerida (Variable de entorno `NGINX_LICENSE_JWT`) |
| Costo | Gratuito | Suscripción de pago |
| Proceso de Despliegue | Directo y simple | Requiere pasos adicionales de autenticación y gestión de licencias |
Preguntas Frecuentes (FAQ)
- ¿Cómo expongo un puerto diferente al 80?
- Al ejecutar el contenedor, modifica el mapeo de puertos con el flag `-p`. Por ejemplo, para usar el puerto 8080 del host, utiliza `-p 8080:80`.
- ¿Puedo usar NGINX como balanceador de carga para otros contenedores?
- ¡Absolutamente! Es uno de sus casos de uso más potentes. Deberás crear una red de Docker para que los contenedores puedan comunicarse entre sí y luego configurar NGINX como proxy inverso (`proxy_pass`) apuntando a los nombres de los otros contenedores en esa red.
- ¿Qué pasa si mi contenedor NGINX se detiene?
- Para asegurar que tu contenedor se reinicie automáticamente en caso de fallo o reinicio del sistema, utiliza la política de reinicio `--restart=always` en tu comando `docker run`. Por ejemplo: `docker run --name mi-nginx -p 80:80 -d --restart=always nginx`.
- ¿Es seguro pasar mi licencia de NGINX Plus como variable de entorno?
- Si bien es el método estándar, debes ser cuidadoso. Asegúrate de que el acceso al host de Docker esté securizado. En entornos de orquestación como Kubernetes, es preferible utilizar "Secrets" para gestionar este tipo de información sensible.
Conclusión
Ejecutar NGINX en Docker no es solo una posibilidad, es una práctica recomendada que aporta flexibilidad, escalabilidad y consistencia a tus despliegues. Ya sea que estés utilizando la robusta versión Open Source para un proyecto personal o la potente NGINX Plus para una aplicación empresarial crítica, la contenedorización simplifica el ciclo de vida completo de tu aplicación. Dominar las técnicas de gestión de configuración, logs y control del proceso te permitirá aprovechar al máximo esta poderosa combinación tecnológica, construyendo arquitecturas modernas, resilientes y de alto rendimiento.
Si quieres conocer otros artículos parecidos a NGINX en Docker: Guía de Despliegue Definitiva puedes visitar la categoría Automovilismo.

