Can I run nginx on Docker?

NGINX en Docker: Guía de Despliegue Definitiva

31/12/2022

Valoración: 4.88 (1093 votos)

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.

Can I run nginx on Docker?
You can create an NGINX instance in a Docker container using the NGINX Open Source image from the Docker Hub.
Índice de Contenido

¿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 nginx

Este 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 nginx

Desglosemos 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-nginx

Si 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:

  1. JSON Web Token (JWT): Un archivo `.jwt` que contiene tus credenciales de acceso.
  2. 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=none

Si 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.com

Paso 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/html

Luego, 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-personalizado

Administració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-nginx

Para ver los logs en tiempo real, similar a un `tail -f`, puedes agregar el flag `-f`:

docker logs -f mi-nginx

Si 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-nginx

Tabla Comparativa: Despliegue en Docker

CaracterísticaNGINX Open SourceNGINX Plus
Fuente de la ImagenDocker Hub (Público)private-registry.nginx.com (Privado)
AutenticaciónNo requeridaRequerida (JWT o Certificado/Clave SSL)
Licencia en EjecuciónNo aplicaRequerida (Variable de entorno `NGINX_LICENSE_JWT`)
CostoGratuitoSuscripción de pago
Proceso de DespliegueDirecto y simpleRequiere 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.

Subir