NGINX es un software popular de código abierto que se utiliza para servicios web, proxy inverso, almacenamiento en caché, equilibrio de carga, transmisión de medios y más. También puede funcionar como servidor proxy para correo electrónico (IMAP, POP3 y SMTP) y como proxy inverso y balanceador de carga para servidores HTTP, TCP y UDP. Nginx es bastante popular y se utiliza en muchos sitios web de alto tráfico en la actualidad. En este tutorial, aprenderemos cómo ejecutar Nginx en un contenedor usando DockerAbordaremos cómo descargar y ejecutar la imagen, crear varios contenedores a partir de esa imagen, aprender sobre las tareas en primer plano y en segundo plano y ver cómo inspeccionar los registros.


Imagen Vs Contenedor

  • Una imagen es una aplicación que desea ejecutar
  • Un contenedor es una instancia de la imagen que se ejecuta como un proceso
  • Puede haber muchos contenedores ejecutándose a través de la misma imagen
  • Docker Hub es el registro principal de imágenes en hub.docker.com

Lanzar un contenedor

Podemos lanzar un nuevo contenedor usando el siguiente comando.

ejecución del contenedor de Docker --publish 80:80 nginx

Es posible que vea alguna salida en el terminal similar a esta.

$ docker container run --publish 80:80 nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ no está vacío, intentará realizar la configuración
/docker-entrypoint.sh: buscando scripts de shell en /docker-entrypoint.d/
/docker-entrypoint.sh: Ejecutando /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: obteniendo la suma de comprobación de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: escucha habilitada en IPv6 en /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Ejecutando /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuración completa; listo para empezar

El panel de Docker también mostrará el contenedor en ejecución.

contenedor nginx docker en ejecución

Abra un navegador para visitar http: // localhost y deberíamos ver un servidor web Nginx ofreciendo felizmente la página web predeterminada.

página web nginx a través de Docker

En la terminal, también veremos algunos registros del navegador que realiza solicitudes desde el servidor web.

172.17.0.1 - - [28 / Sep / 2020: 15: 10: 03 +0000] "GET / HTTP / 1.1" 304 0 "-" "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML , como Gecko) Chrome / 85.0.4183.121 Safari / 537.36 "" - "

Cómo funciona

Ejecutar contenedor de Docker: publicar 80:80 nginx

Cuando se activa el comando anterior, el motor Docker realiza una serie de pasos.

  1. Descargue la imagen de Nginx desde Docker Hub, si aún no está en la caché local
  2. Comenzó un nuevo contenedor a partir de la imagen de Nginx
  3. Puerto 80 abierto en la IP del host
  4. Enruta el tráfico del host del puerto 80 al puerto IP del contenedor 80

Ejecución en modo independiente

La razón por la que pudimos ver la salida del registro del contenedor de inmediato es porque el contenedor se está ejecutando en primer plano. Muchas veces solo desea que el contenedor se ejecute en segundo plano. Esto es lo que se conoce como modo independiente . Primero, debemos detener el contenedor en ejecución. Podemos hacer esto encontrando primero el ID o el nombre del contenedor con docker ps , luego usando el comando docker stop para detenerlo.

$ docker ps
ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
902affce585b nginx "/docker-entrypoint.…" Hace 2 horas Hasta 2 horas 0.0.0.0:80->80/tcp sharp_hoover

Según el resultado anterior, podemos detener el contenedor con cualquiera de los dos siguientes:

  • Docker stop sharp_hoover
  • parada de la ventana acoplable 902affce585b
  • Ahora ejecutemos la imagen nuevamente, creando un nuevo contenedor que se ejecuta en modo separado. Tenga en cuenta el uso de la bandera –detach.

    $ docker container run --publish 80:80 --detach nginx

    Detach le dice a Docker que ejecute el contenedor en segundo plano, y la única salida a la terminal, en este caso, es la identificación única del contenedor. Cada vez que ejecuta un nuevo contenedor, obtiene una nueva identificación única. Veamos los contenedores que se ejecutan nuevamente usando el contenedor docker ls.

    $ contenedor docker ls
    ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
    d62595efbb6c nginx "/docker-entrypoint.…" Hace 4 minutos Hasta 4 minutos 0.0.0.0:80->80/tcp quizzical_hermann

    Nuestro nuevo contenedor Nginx que se ejecuta en segundo plano tiene el nombre quizzical_hermann .

    Podemos detener el contenedor con la ventana acoplable contenedor dejar de pasar solo los primeros dos caracteres del ID del contenedor.

    $ docker contenedor parada d62
    d62

    Listado de contenedores

    En el pasado, podía usar docker ps para mostrar contenedores. La forma más apropiada de enumerar contenedores ahora es usando el contenedor docker ls . Al enumerar nuestros contenedores, no vemos ninguno.

    $ contenedor docker ls
    ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS

    Esto se debe a que si un contenedor no se está ejecutando, no se mostrará. Para ver todos los contenedores, incluso los que no se están ejecutando, debe agregar la marca -a .

    $ contenedor docker ls -a
    ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
    d62595efbb6c nginx "/docker-entrypoint.ΓǪ" Hace 14 minutos Salió (0) Hace 4 minutos quizzical_hermann
    902affce585b nginx "/docker-entrypoint.ΓǪ" hace 2 horas Salió (0) hace 16 minutos sharp_hoover
    

    Ahora vemos ambos contenedores. Esos nombres divertidos se crean automáticamente si no especifica un nombre para el contenedor durante la creación. Al igual que cada ID es único para los contenedores, también se requiere que el nombre sea único. Docker genera aleatoriamente el nombre a partir de una lista de código abierto de adjetivos y hackers notables de científicos. Entonces, ¿cómo podemos darle nuestro propio nombre a un contenedor? Podemos hacer esto especificando la bandera –name.

    $ docker container run --publish 80:80 --detach --name my_nginx_server nginx
    4402b968a91567195e690ca4c5c7d79525c5823f640ff0d2cceb6ee045d2a8d6
    
    $ contenedor docker ls -a
    ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
    4402b968a915 nginx "/docker-entrypoint.…" Hace 8 segundos Hasta 7 segundos 0.0.0.0:80->80/tcp my_nginx_server
    d62595efbb6c nginx "/docker-entrypoint.ΓǪ" Hace 19 minutos Salió (0) Hace 10 minutos quizzical_hermann
    902affce585b nginx "/docker-entrypoint.ΓǪ" hace 2 horas Salió (0) hace 21 minutos sharp_hoover
    

    Visualización de registros de contenedores en modo independiente

    Si un contenedor se está ejecutando en segundo plano, no vemos ningún resultado de los registros en la terminal. Si queremos ver esos registros, podemos hacerlo con el comando docker container logs.

    $ contenedor docker registra my_nginx_server
    /docker-entrypoint.sh: /docker-entrypoint.d/ no está vacío, intentará realizar la configuración
    /docker-entrypoint.sh: buscando scripts de shell en /docker-entrypoint.d/
    /docker-entrypoint.sh: Ejecutando /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: obteniendo la suma de comprobación de /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: escucha habilitada en IPv6 en /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Ejecutando /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Configuración completa; listo para empezar
    172.17.0.1 - - [28 / Sep / 2020: 17: 18: 38 +0000] "GET / HTTP / 1.1" 304 0 "-" "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML , como Gecko) Chrome / 85.0.4183.121 Safari / 537.36 "" - "
    172.17.0.1 - - [28 / Sep / 2020: 17: 18: 39 +0000] "GET / HTTP / 1.1" 304 0 "-" "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML , como Gecko) Chrome / 85.0.4183.121 Safari / 537.36 "" - "

    Trabajar con contenedores

    Estos son los comandos con los que querrá familiarizarse cuando trabaje con sus contenedores.

    $ contenedor docker
    
    Uso: COMANDO contenedor docker
    
    Administrar contenedores
    
    Comandos:
      adjuntar Adjuntar flujos de entrada, salida y error estándar local a un contenedor en ejecución
      commit Crea una nueva imagen a partir de los cambios de un contenedor
      cp Copia archivos / carpetas entre un contenedor y el sistema de archivos local
      crear Crea un nuevo contenedor
      diff Inspecciona cambios en archivos o directorios en el sistema de archivos de un contenedor
      exec Ejecuta un comando en un contenedor en ejecución
      exportar Exportar el sistema de archivos de un contenedor como un archivo tar
      inspeccionar Mostrar información detallada sobre uno o más contenedores
      kill Mata a uno o más contenedores en ejecución
      registros Obtener los registros de un contenedor
      ls Contenedores de lista
      pause Pausa todos los procesos dentro de uno o más contenedores
      puerto Lista de asignaciones de puertos o una asignación específica para el contenedor
      podar Quitar todos los recipientes parados
      renombrar Cambiar el nombre de un contenedor
      reiniciar Reiniciar uno o más contenedores
      rm Retire uno o más contenedores
      ejecutar Ejecutar un comando en un nuevo contenedor
      start Iniciar uno o más contenedores detenidos
      stats Muestra una transmisión en vivo de estadísticas de uso de recursos de contenedores
      detener Detener uno o más contenedores en ejecución
      arriba Muestra los procesos en ejecución de un contenedor
      anular la pausa Reanudar todos los procesos dentro de uno o más contenedores
      actualizar Actualizar la configuración de uno o más contenedores
      espere Bloquear hasta que uno o más contenedores se detengan, luego imprima sus códigos de salida
    
    Ejecute 'docker container COMMAND --help' para obtener más información sobre un comando.
    

    Retirar contenedores

    En este punto, tenemos 3 contenedores en total. Uno está funcionando y los otros dos están inactivos. Intentemos eliminarlos todos de una sola vez.

    $ contenedor estibador rm 440 d62 902
    d62
    902
    Respuesta de error del daemon: no puede eliminar un contenedor en ejecución 4402b968a91567195e690ca4c5c7d79525c5823f640ff0d2cceb6ee045d2a8d6. Detenga el contenedor antes de intentar retirarlo o forzarlo.

    Se eliminaron dos de los contenedores, sin embargo, podemos ver por el mensaje de error que un contenedor en ejecución no se puede eliminar sin detenerlo primero o forzar la eliminación. Aquí usamos la bandera -f para forzar la eliminación del contenedor en ejecución.

    $ contenedor docker rm 440 -f
    440

    Finalmente, enumeramos todos los contenedores una vez más, y podemos ver que nuestro patio de recreo está limpio.

    $ contenedor docker ls -a
    ID DE CONTENEDOR COMANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS


    Resumen

    Aprendimos sobre algunos comandos básicos para trabajar con Nginx y Docker. Los comandos con los que queremos estar familiarizados después de este tutorial se enumeran aquí.

    ejecución de contenedor dockerEjecuta un comando en un contenedor nuevo
    contenedor docker lsLista de contenedores
    parada de contenedor de dockerDetenga uno o más contenedores en ejecución
    Inicio del contenedor DockerInicie uno o más contenedores detenidos
    registros de contenedor de DockerCoge los registros de un contenedor
    parte superior del contenedor dockerMostrar los procesos en ejecución de un contenedor
    contenedor docker rmRetire uno o más contenedores