GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo ejecutar NGINX Inside Docker (para fácil escalado automático)

Una de las cargas de trabajo más comunes de Docker es utilizarlo 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 automáticamente fácilmente. Le mostraremos cómo configurarlo con NGINX.

Configuración de NGINX dentro de Docker

Docker es una plataforma de creación de contenedores, que se utiliza para empaquetar su aplicación y todo su código en una imagen de contenedor fácilmente manejable. El proceso de hacer esto es bastante similar a cómo 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 tienes que automatizar tanto. NGINX ya tiene un contenedor Docker disponible públicamente, que puede usar como punto de partida para su aplicación.

Por supuesto, dependiendo de la aplicación que esté en contenedores, esto puede ser un poco más complicado. Si está implementando un CMS como WordPress, probablemente necesitará 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 el contenedor Docker de WordPress.

Con el fin de tener algo un poco más complicado que una simple página web de Hello World, crearemos un nuevo directorio de proyectos e inicializaremos una aplicación Vue.js básica. 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 compilació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á sirviendo 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 compilació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 línea es FROM el comando extrae el node contenedor de Docker Hub y crea un nuevo contenedor llamado build-stage . El siguiente cd ‘s a ese directorio, y copia sobre el package.json . Luego, ejecuta 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 extrae el nginx contenedor para que sirva como implementación 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 /src carpeta del contenedor de producción. Luego copia sobre un archivo de configuración NGINX.

También querrá crear un nuevo archivo llamado .dockerignore , para decirle que ignore node_modules así como cualquier artefacto de compilación de compilaciones 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;
    }
  }
}

Esto 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 desde /etc/letsencrypt/live/example.com/fullchain.pem en el contenedor de producción. Estos certificados son válidos durante 90 días, por lo que deberá renovarlos periódicamente. Puede automatizar esto como parte del proceso de creació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 o a un registro de contenedores para su eventual implementación. Por supuesto, primero debe probarlo localmente con docker run enlace 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 una implementación de contenedor de escalado automático en AWS ECS para obtener más información, o leer nuestra guía sobre cómo configurar una canalización de CI/CD con contenedores para manejar compilaciones e implementaciones automatizadas.

RELACIONADO: ¿Qué es un archivo PEM y cómo se usa?


Docker
  1. Cómo ejecutar Nginx en un contenedor Docker:una guía paso a paso

  2. ¿Cómo ejecutar un programa dentro de un contenedor Docker?

  3. Cómo implementar microservicios con Docker

  4. Cómo ejecutar MySQL en un contenedor Docker

  5. ¿Cómo ejecutar Nginx dentro de un contenedor Docker sin detenerse?

Cómo ejecutar una aplicación .NET en Docker

Cómo ejecutar NGINX Inside Docker (para fácil escalado automático)

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo crear imágenes de Docker en una canalización de GitLab CI

Cómo ejecutar contenedores Docker