Una de las cargas de trabajo más comunes de Docker es usarlo para contener servidores web como NGINX y Apache para ejecutar una flota de entrega de contenido de alto rendimiento que se puede escalar y administrar fácilmente. Le mostraremos cómo configurarlo con NGINX.
Configuración de NGINX Inside Docker
Docker es una plataforma de contenedorización, que se utiliza para empaquetar su aplicación y todo su código en una imagen de contenedor fácilmente administrable. El proceso para hacer esto es bastante similar a cómo se configuraría un nuevo servidor: el contenedor es una pizarra en blanco, por lo que deberá instalar dependencias, compilar su código, copiar los artefactos de compilación y copiar cualquier configuración. Afortunadamente, no es necesario automatizar tanto. NGINX ya tiene un contenedor Docker disponible públicamente, que puede utilizar como punto de partida para su aplicación.
Por supuesto, dependiendo de la aplicación que esté contenedorizando, esto puede ser un poco más complicado. Si está implementando un CMS como WordPress, es probable que necesite tener una base de datos externa, ya que los contenedores no están diseñados para ser persistentes. Un buen lugar para comenzar con WordPress, en particular, sería Contenedor Docker de WordPress.
Con el propósito de tener algo un poco más complicado que una simple página web de Hello World, crearemos un nuevo directorio de proyecto e inicializaremos una aplicación básica de Vue.js. Su configuración será diferente según el contenido que esté sirviendo, pero la idea general es la misma.
En la raíz de su proyecto, cree un nuevo archivo simplemente llamado Dockerfile
sin extensión. Esto actuará como la configuración de construcción. De forma predeterminada, el contenedor está vacío y solo incluye las aplicaciones y dependencias que vienen instaladas con la imagen base. Deberá copiar el código de su aplicación; Si solo está ofreciendo contenido estático, esto es fácil, pero si está trabajando con aplicaciones del lado del servidor como WordPress, es posible que deba instalar dependencias adicionales.
La siguiente configuración es bastante básica. Debido a que esta es una aplicación de nodo, necesitamos ejecutar npm run build
para obtener una construcción lista para la distribución. Podemos manejar todo esto en el Dockerfile, configurando una compilación de contenedor de dos partes:
FROM node:latest as build-stage WORKDIR /src COPY package*.json ./ RUN npm install COPY ./ . RUN npm run build FROM nginx as production-stage RUN mkdir /src COPY --from=build-stage /src/dist /src COPY nginx.conf /etc/nginx/nginx.conf
La primera linea FROM
comando tira del node
contenedor de Docker Hub y crea un nuevo contenedor llamado build-stage
. El siguiente cd
está en ese directorio y copia el package.json
. Entonces, corre npm install
, luego copia el código de la aplicación e inicia el proceso de compilación. Si su aplicación necesita construirse desde la fuente, querrá hacer algo similar a esto.
El siguiente estado tira del nginx
contenedor para que sirva como despliegue de producción. Hace que el src
directorio y luego copia, desde el build-stage
contenedor, el /src/dist/
carpeta que contiene los artefactos de compilación, a la /src
carpeta del contenedor de producción. Luego copia un archivo de configuración NGINX.
También querrá crear un nuevo archivo llamado .dockerignore
, decirle que ignore node_modules
así como cualquier artefacto de construcción de construcciones locales.
**/node_modules **/dist
El Dockerfile hace referencia a un nginx.conf
, que también deberá crear. Si está ejecutando una configuración más compleja con varias configuraciones en /sites-available
, es posible que desee crear una nueva carpeta para su configuración de NGINX y copiarla.
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /src; index index.html; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
Este es solo un servidor web HTTP. La forma más sencilla de configurar HTTPS sería ejecutar el certbot de LetsEncrypt localmente y copiar el certificado de /etc/letsencrypt/live/example.com/fullchain.pem
en el contenedor de producción. Estos certificados son válidos por 90 días, por lo que deberá renovarlos con regularidad. Usted puede Automatizar esto como parte del proceso de construcción del contenedor..
Una vez que todo esté en orden, puede ejecutar la compilación de Docker:
docker build . -t my-app
Esto construirá el contenedor como my-app
, después de lo cual puede etiquetarlo y enviarlo a ECS oa un registro de contenedor para su eventual implementación. Por supuesto, primero debe probarlo localmente con docker run
vinculante localhost:8080
al puerto 80 de la instancia NGINX:
docker run -d -p 8080:80 my-app
Una vez que tenga una imagen construida, implementarla en producción es bastante simple. Puede leer nuestra guía para configurar un Implementación de contenedores de escalado automático en AWS ECS para obtener más información o lea nuestra guía sobre configurar una canalización de CI / CD con contenedores para manejar construcciones e implementaciones automatizadas.
RELACIONADA: ¿Qué es un archivo PEM y cómo se usa?