Editor : Los Dockerfiles NGINX Plus para Alpine Linux y Debian se actualizaron en noviembre de 2021 para reflejar las últimas versiones del software. También (junto con las instrucciones revisadas) utilizan secretos de Docker para pasar información de licencia al crear una imagen NGINX Plus.
Docker es una plataforma abierta para crear, enviar y ejecutar aplicações distribuidas como contenedores (paquetes de software livianos, independientes y ejecutables que incluyen todo lo necesario para ejecutar una aplicação). Los contenedores, a su vez, pueden implementarse y orquestarse mediante plataformas de orquestación de contenedores como Kubernetes . (Además de la tecnología de contenedores Docker analizada en este blog, NGINX proporciona el controlador de ingreso F5 NGINX en versiones basadas en NGINX Open Source y NGINX Plus; para los suscriptores de NGINX Plus, el soporte está incluido sin costo adicional).
Como aplicações de software, NGINX Open Source y F5 NGINX Plus son excelentes casos de uso para Docker, y publicamos una imagen de NGINX Open Source en Docker Hub , el repositorio de imágenes de Docker. Esta publicación explica cómo:
La plataforma abierta Docker incluye Docker Engine, el entorno de ejecución de código abierto que crea, ejecuta y orquesta contenedores, y Docker Hub, un servicio alojado donde las aplicações Dockerizadas se distribuyen, comparten y colaboran entre toda la comunidad de desarrollo o dentro de los límites de una organización específica.
Los contenedores Docker permiten a los desarrolladores centrar sus esfuerzos en el “contenido” de las aplicação separándolas de las limitaciones de la infraestructura. Las aplicações Dockerizadas son instantáneamente portables a cualquier infraestructura (computadora portátil, servidor físico, máquina virtual o nube), lo que las convierte en componentes modulares que pueden ensamblarse y reensamblarse fácilmente en aplicações distribuidas con todas las funciones e innovarse continuamente en tiempo real.
Para obtener más información sobre Docker, consulte ¿Por qué Docker? o la documentación completa de Docker .
Puede crear una instancia NGINX en un contenedor Docker utilizando la imagen de código abierto NGINX de Docker Hub.
Comencemos con un ejemplo muy sencillo. Para iniciar una instancia de NGINX ejecutándose en un contenedor y utilizando la configuración predeterminada de NGINX, ejecute este comando:
# ejecutar docker --nombre mynginx1 -p 80:80 -d nginx fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d
Este comando crea un contenedor llamado mynginx1 basado en la imagen NGINX. El comando devuelve la forma larga del ID del contenedor, que se utiliza en el nombre de los archivos de registro; consulte Administración del registro .
La opción -p
le indica a Docker que asigne el puerto expuesto en el contenedor por la imagen NGINX (puerto 80) al puerto especificado en el host Docker. El primer parámetro especifica el puerto en el host Docker, mientras que el segundo parámetro se asigna al puerto expuesto en el contenedor.
La opción -d
especifica que el contenedor se ejecuta en modo separado, lo que significa que continúa ejecutándose hasta que se detiene, pero no responde a los comandos que se ejecutan en la línea de comandos. En la siguiente sección explicamos cómo interactuar con el contenedor.
Para verificar que el contenedor se creó y se está ejecutando, y para ver las asignaciones de puertos, ejecutamos docker
ps
. (Hemos dividido la salida en varias líneas aquí para que sea más fácil de leer).
# docker ps ID DEL CONTENEDOR IMAGEN COMANDO CREADO ESTADO ... fcd1fb01b145 nginx:latest "nginx -g 'daemon de hace 16 segundos Activo 15 segundos ... ... NOMBRES DE PUERTOS... 0.0.0.0:80->80/tcp mynginx1
El campo PUERTOS
en la salida informa que el puerto 80 en el host Docker está asignado al puerto 80 en el contenedor. Otra forma de verificar que NGINX está ejecutándose es realizar una solicitud HTTP a ese puerto. Aparece el código de la página de bienvenida predeterminada de NGINX:
# rizo http://localhost<!DOCTYPE html>
<html>
<head>
<title>¡Bienvenido a nginx!</title>
<style>
body {
width: 35em; margen: 0 automático; familia de fuentes: Tahoma, Verdana, Arial, sans-serif; } Se requiere configuración adicional.
Ahora tenemos un contenedor Docker NGINX en funcionamiento, pero ¿cómo administramos el contenido y la configuración de NGINX? ¿Y qué pasa con el registro?
Es común habilitar el acceso SSH a las instancias de NGINX, pero la imagen de NGINX no tiene OpenSSH instalado, porque los contenedores Docker generalmente están destinados a un solo propósito (en este caso, ejecutar NGINX). En su lugar, utilizaremos otros métodos compatibles con Docker.
Como alternativa a los siguientes comandos, puede ejecutar el siguiente comando para abrir un shell interactivo en un contenedor NGINX en ejecución (en lugar de iniciar una sesión SSH). Sin embargo, recomendamos esto sólo para usuarios avanzados.
En sistemas Alpine Linux:
# docker exec -it ID_del_contenedor_NGINX sh
En sistemas Debian:
# docker exec -it ID_del_contenedor_NGINX bash
Hay varias formas de administrar tanto el contenido proporcionado por NGINX como los archivos de configuración de NGINX. Aquí cubrimos algunas de las opciones.
Cuando se crea el contenedor, podemos indicarle a Docker que monte un directorio local en el host de Docker en un directorio del contenedor. La imagen NGINX utiliza la configuración NGINX predeterminada, que utiliza /usr/share/nginx/html como directorio raíz del contenedor y coloca los archivos de configuración en /etc/nginx . Para un host Docker con contenido en el directorio local /var/www y archivos de configuración en /var/nginx/conf , ejecute este comando (que aparece en varias líneas aquí solo para mayor legibilidad):
# docker run --name mynginx2 --mount tipo=bind origen=/var/www,destino=/usr/share/nginx/html,solo lectura --mount tipo=bind,origen=/var/nginx/conf,destino=/etc/nginx/conf,solo lectura -p 80:80 -d nginx
Ahora, cualquier cambio realizado en los archivos en los directorios locales /var/www y /var/nginx/conf en el host Docker se refleja en los directorios /usr/share/nginx/html y /etc/nginx en el contenedor. La opción de solo lectura
significa que estos directorios se pueden cambiar únicamente en el host Docker, no desde dentro del contenedor.
Otra opción es que Docker copie el contenido y los archivos de configuración de un directorio local en el host de Docker durante la creación del contenedor. Una vez que se crea un contenedor, los archivos se mantienen creando un nuevo contenedor cuando los archivos cambian o modificando los archivos en el contenedor. Una forma sencilla de copiar los archivos es crear un Dockerfile con comandos que se ejecutan durante la generación de una nueva imagen de Docker basada en la imagen NGINX de Docker Hub. Para los comandos de copia de archivos ( COPY
) en el Dockerfile , la ruta del directorio local es relativa al contexto de compilación donde se encuentra el Dockerfile .
En nuestro ejemplo, el contenido está en el directorio content y los archivos de configuración están en el directorio conf , ambos subdirectorios del directorio donde se encuentra el Dockerfile . La imagen NGINX incluye archivos de configuración NGINX predeterminados como /etc/nginx/nginx.conf y /etc/nginx/conf.d/default.conf . Como en lugar de ello queremos utilizar los archivos de configuración del host, incluimos un comando RUN
que elimina los archivos predeterminados:
DESDE nginx
EJECUTAR rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPIAR contenido /usr/share/nginx/html
COPIAR conf /etc/nginx
Creamos nuestra propia imagen NGINX ejecutando el siguiente comando desde el directorio donde se encuentra el Dockerfile . Tenga en cuenta el punto (”.”) al final del comando. Define el directorio actual como el contexto de compilación, que contiene el Dockerfile y los directorios que se copiarán.
# docker build -t mynginx_image1 .
Ahora ejecutamos este comando para crear un contenedor llamado mynginx3 basado en la imagen mynginx_image1 :
# docker run --name mynginx3 -p 80:80 -d mynginx_image1
Si queremos realizar cambios en los archivos del contenedor, utilizamos un contenedor auxiliar como se describe en la Opción 3.
Como se menciona en Una nota sobre SSH , no podemos usar SSH para acceder al contenedor NGINX, por lo que si queremos editar el contenido o los archivos de configuración directamente, tenemos que crear un contenedor auxiliar que tenga acceso de shell. Para que el contenedor auxiliar tenga acceso a los archivos, debemos crear una nueva imagen que tenga los volúmenes de datos de Docker adecuados definidos para la imagen. Suponiendo que queremos copiar archivos como en la Opción 2 y al mismo tiempo definir volúmenes, usamos el siguiente Dockerfile :
DESDE nginxEJECUTAR rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPIAR contenido /usr/share/nginx/html
COPIAR conf /etc/nginx
VOLUMEN /usr/share/nginx/html
VOLUMEN /etc/nginx
Luego creamos la nueva imagen NGINX ejecutando el siguiente comando (nuevamente note el punto final):
# docker build -t mynginx_image2 .
Ahora ejecutamos este comando para crear un contenedor NGINX ( mynginx4 ) basado en la imagen mynginx_image2 :
# docker run --name mynginx4 -p 80:80 -d mynginx_image2
Luego ejecutamos el siguiente comando para iniciar un contenedor auxiliar mynginx4_files que tiene un shell, lo que nos permite acceder a los directorios de contenido y configuración del contenedor mynginx4 que acabamos de crear:
# docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash root@b1cbbad63dd1:/#
El nuevo contenedor auxiliar mynginx4_files se ejecuta en primer plano con una entrada estándar persistente (la opción -i
) y una tty (la opción -t
). Todos los volúmenes definidos en mynginx4 se montan como directorios locales en el contenedor auxiliar.
El argumento debian
significa que el contenedor auxiliar utiliza la imagen Debian de Docker Hub. Dado que la imagen NGINX también usa Debian (y todos nuestros ejemplos hasta ahora usan la imagen NGINX), es más eficiente usar Debian para el contenedor auxiliar, en lugar de que Docker cargue otro sistema operativo. El argumento /bin/bash
significa que el shell bash
se ejecuta en el contenedor auxiliar, presentando un indicador de shell que puede usar para modificar archivos según sea necesario.
Para iniciar y detener el contenedor, ejecute los siguientes comandos:
# docker inicia mynginx4_files # docker detiene mynginx4_files
Para salir del shell pero dejar el contenedor en ejecución, presione Ctrl+p
seguido de Ctrl+q
. Para recuperar el acceso del shell a un contenedor en ejecución, ejecute este comando:
# docker adjuntar archivos mynginx4
Para salir del shell y finalizar el contenedor, ejecute el comando exit
.
Puede configurar el registro predeterminado o personalizado.
La imagen NGINX está configurada para enviar los registros principales de acceso y errores de NGINX al recopilador de registros de Docker de forma predeterminada. Esto se hace vinculándolos a stdout
y stderr
respectivamente; todos los mensajes de ambos registros se escriben en el archivo /var/lib/docker/containers/ container-ID / container-ID -json.log en el host Docker, donde container-ID es el ID de formato largo que se devuelve cuando se crea un contenedor. Para el contenedor inicial que creamos en Uso de la imagen Docker de código abierto NGINX , por ejemplo, es fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d .
Para recuperar el ID del contenedor de un contenedor existente, ejecute este comando, donde container‑name
es el valor establecido por el parámetro --name
cuando se crea el contenedor (para el ID del contenedor anterior, por ejemplo, es mynginx1 ):
# docker inspect --format '{{ .Id }}' nombre-del-contenedor
Aunque puedes ver los registros abriendo directamente el archivo container-ID -json.log , normalmente es más fácil ejecutar este comando:
# registros de Docker nombre-del-contenedor
También puede utilizar la API de Docker Engine para extraer los mensajes de registro, emitiendo una solicitud GET
contra el socket Unix de Docker. Este comando devuelve tanto el registro de acceso (representado por stdout=1
) como el registro de errores ( stderr=1
), pero también puedes solicitarlos individualmente:
curl --unix-socket /var/run/docker-sock http://localhost/containers/ nombre-del-contenedor /logs?stdout=1&stderr=1
Para obtener más información sobre otros parámetros de consulta, consulte la documentación de la API de Docker Engine (busque “Obtener registros de contenedores” en esa página).
Si desea implementar otro método de recopilación de registros, o si desea configurar el registro de manera diferente en ciertos bloques de configuración (como server{}
y location{}
), defina un volumen Docker para el directorio o directorios en los que almacenar los archivos de registro en el contenedor, cree un contenedor auxiliar para acceder a los archivos de registro y use las herramientas de registro que desee. Para implementar esto, cree una nueva imagen que contenga el volumen o los volúmenes para los archivos de registro.
Por ejemplo, para configurar NGINX para almacenar archivos de registro en /var/log/nginx/log , podemos comenzar con el Dockerfile de la Opción 3 y simplemente agregar una definición de VOLUME
para este directorio:
DESDE nginxRUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPIAR contenido /usr/share/nginx/html
COPIAR conf /etc/nginx
VOLUMEN /var/log/nginx/log
Luego podemos crear una imagen como se describe arriba y usarla para crear un contenedor NGINX y un contenedor auxiliar que tengan acceso al directorio de registro. El contenedor auxiliar puede tener instaladas cualquier herramienta de registro deseada.
Dado que no tenemos acceso directo a la línea de comandos del contenedor NGINX, no podemos usar el comando nginx
para controlar NGINX. Afortunadamente, podemos usar señales para controlar NGINX, y Docker proporciona el comando kill
para enviar señales a un contenedor.
Para recargar la configuración de NGINX, ejecute este comando:
# docker kill -s HUP nombre-del-contenedor
Para reiniciar NGINX, ejecute este comando para reiniciar el contenedor:
# docker restart nombre-del-contenedor
Hasta ahora hemos hablado de Docker para NGINX de código abierto, pero también puedes usarlo con el producto comercial, NGINX Plus. La diferencia es que primero debes crear una imagen NGINX Plus, porque como oferta comercial, NGINX Plus no está disponible en Docker Hub. Afortunadamente, esto es bastante fácil de hacer.
Para generar una imagen NGINX Plus, primero cree un Dockerfile . Los ejemplos que proporcionamos aquí utilizan Alpine Linux 3.14 y Debian 11 (Bullseye) como imágenes base de Docker. Antes de poder crear la imagen Docker de NGINX Plus, debe descargar su versión de los archivos nginx-repo.crt y nginx-repo.key . Los clientes de NGINX Plus pueden encontrarlos en el portal del cliente ; si está realizando una prueba gratuita de NGINX Plus, se le proporcionarán con su paquete de prueba. Copie los archivos al directorio donde se encuentra el Dockerfile (el contexto de compilación de Docker).
Al igual que con NGINX Open Source, de forma predeterminada los registros de acceso y errores de NGINX Plus están vinculados al recopilador de registros de Docker. No se especifican volúmenes, pero puedes agregarlos si lo deseas, o se puede usar cada Dockerfile para crear imágenes base a partir de las cuales puedes crear nuevas imágenes con volúmenes especificados, como se describió anteriormente.
Intencionalmente no especificamos una versión de NGINX Plus en los Dockerfiles de muestra, para que no tenga que editar el archivo cuando actualice a una nueva versión de NGINX Plus. Sin embargo, hemos incluido versiones comentadas de las instrucciones relevantes para que pueda descomentarlas si desea que la versión del archivo sea específica.
De manera similar, hemos incluido instrucciones (comentadas) que instalan módulos dinámicos oficiales para NGINX Plus .
De forma predeterminada, no se copian archivos del host Docker cuando se crea un contenedor. Puede agregar definiciones de COPIA
a cada Dockerfile , o la imagen que cree se puede utilizar como base para otra imagen como se describe anteriormente.
Con los archivos Dockerfile , nginx-repo.crt y nginx-repo.key en el mismo directorio, ejecute el siguiente comando allí para crear una imagen de Docker llamada nginxplus (como antes, tenga en cuenta el punto final):
# DOCKER_BUILDKIT=1 docker build --no-cache -t nginxplus --secret id=nginx-crt,src= su_archivo_de_certificado --secret id=nginx-key,src= su_archivo_de_clave .
El indicador DOCKER_BUILDKIT=1
indica que estamos usando Docker BuildKit para construir la imagen, como se requiere al incluir la opción --secret
que se analiza a continuación.
La opción --no-cache
le dice a Docker que construya la imagen desde cero y asegura la instalación de la última versión de NGINX Plus. Si el Dockerfile se utilizó previamente para crear una imagen y no incluye la opción --no-cache
, la nueva imagen utiliza la versión de NGINX Plus del caché de Docker. (Como se señaló, deliberadamente no especificamos una versión de NGINX Plus en el Dockerfile para que el archivo no necesite cambiar en cada nueva versión de NGINX Plus). Omita la opción --no-cache
si es aceptable utilizar la versión NGINX Plus de la imagen creada previamente.
La opción --secret
pasa el certificado y la clave de su licencia NGINX Plus al contexto de compilación de Docker sin correr el riesgo de exponer los datos o que los datos persistan entre las capas de compilación de Docker. Los valores de los argumentos id
no se pueden cambiar sin alterar el Dockerfile base, pero debe establecer los argumentos src
en la ruta a su certificado NGINX Plus y los archivos de clave (el mismo directorio donde está creando la imagen de Docker si siguió las instrucciones anteriores).
Una salida como la siguiente del comando docker
images
nginxplus
indica que la imagen se creó correctamente:
# imágenes de Docker nginxplus REPOSITORIO ETIQUETA ID DE LA IMAGEN CREADA TAMAÑO VIRTUAL nginxplus último ef2bf65931cf hace 6 segundos 91,2 MB
Para crear un contenedor llamado mynginxplus basado en esta imagen, ejecute este comando:
# docker run --name mynginxplus -p 80:80 -d nginxplus
Puede controlar y administrar los contenedores NGINX Plus de la misma manera que los contenedores NGINX Open Source .
NGINX, NGINX Plus y Docker funcionan muy bien juntos. Ya sea que use la imagen de código abierto NGINX de Docker Hub o cree su propia imagen NGINX Plus, puede crear fácilmente nuevas instancias de NGINX y NGINX Plus en contenedores Docker e implementarlas en su entorno de Kubernetes. También puedes crear fácilmente nuevas imágenes de Docker a partir de las imágenes base, lo que hace que tus contenedores sean aún más fáciles de controlar y administrar. Asegúrese de que todas las instancias de NGINX Plus que se ejecutan en sus contenedores Docker estén cubiertas por su suscripción. Para obtener más detalles, comuníquese con el equipo de ventas de NGINX .
Hay mucho más sobre Docker de lo que hemos podido cubrir en este artículo. Para obtener más información, descargue nuestro libro electrónico gratuito de O'Reilly: Redes de contenedores: De Docker a Kubernetes , o visite www.docker.com .
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.