🐋
Apuntes Sistemas
  • ⚓Presentación
  • 📊Sistemas y Servidores
    • Personalizar el prompt de Windows
    • Utilidad de manejo de apps para Windows
    • PRACTICA: Arranque dual Windows y Ubuntu
    • 🚧SysLinuxOS: el SO para ASIX
    • Comandos Linux
      • PRACTICA - Ejercicio de práctica comandos
      • 🚧Instalación de paquetes
      • Apuntes Linux: blue/red team
      • Ejemplos de bash
      • Listado de comandos de Linux
    • Comandos Windows
      • 🚧Apuntes Powershell
      • Bucles FOR con batch
      • Scripts de práctica de Windows
    • Prácticas con Windows 10
    • Configuración de netplan
    • Terminal shell
      • SSH
      • 🚧Ghostty
      • 🚧Warp: la terminal inteligente
      • tmux: paneles de terminal
      • Tabby: Mejorar terminal
      • Conexión SSH en red NAT con VirtualBox
      • TheFuck!: Corrección de comandos
      • Wave: Mejorar terminal Linux
      • 🚧Registros de sesiones
    • Instalación manual de Wordpress en CDMON
    • 🏗️Proxmox
    • 🚧TrueNAS
    • Docker
      • Instalación de Docker
      • Dockerfiles
      • Volúmenes de docker
      • Deployment web con Docker con ejemplos
        • 🚧PRACTICA: Node.js con docker
      • Docker Compose
        • Ejemplo 1: Implantación de Wordpress
        • Ejemplo 2: Implementación de servidor con Nginx, Flask y mySQL
        • Ejemplo 3: Implantación de onlyoffice
        • 🚧Ejemplo 4: Passbolt
        • 🚧PRACTICA: Creando una web de emulación de juegos con docker-compose
      • Monitorización con Grafana en Docker
      • Pi-hole con docker
      • Actividad clase: Deployment app
      • Proyectos self-hosted de docker
    • 🚧Ansible
      • Configuración de laboratorio de ansible
    • 🚧Monitorización de servicios y redes
      • Servicios y cronjobs
      • 1Panel
      • 🚧WatchYourLAN
      • 🚧Uptime-kuma
      • 🚧Netdata
      • 🚧Prometheus + Grafana + Loki
    • LDAP
      • 🚧Gestión gráfica de LDAP
      • Carpetas compartidas NFS
      • PRACTICA: Infraestructura LDAP
  • 🗃️Servicios
    • 🚧Servidor hosting público
    • DHCP
      • DHCP con Ubuntu
      • 🦖DHCP & DNS script
      • DHCP con Alpine
        • Alpine - configuración de red
    • DNS
      • 😡Comprobación DNS
      • Script para enumeración DNS
      • DNS con ubuntu server
      • 🏗️DNSmasq
      • 🚧Securizar servidor DNS
    • Web
      • IIS con Windows server
      • Apache
        • Instalación de LAMP en Ubuntu
          • Prueba de servidor LAMP
          • 🚧Configuración de seguridad de Ubuntu
          • Creación de un VirtualHost en LAMP
          • Creación de varios VirtualHosts en LAMP
          • 🚧Instalación por script de LAMP
        • Aplicaciones con LAMP
          • Instalación de WP en entorno LAMP
          • 🚧Instalación de MantisBT en LAMP
            • 👷Guía de MantisBT
          • 🚧Instalación de QDPM con LAMP
      • Nginx
        • Virtualhosts
        • Instalando Wordpress en nginx
      • 👷MEAN stack
      • 👷‍♂️Caddy
      • 🚧Plesk
      • 🚧Ajenti -Web interface
    • 🏗️Proxy
      • Nginx como proxy inverso y balanceador
      • 🚧Zoraxy
    • Mailing
      • 🚧Servidor Mail con cloudfare
      • 🚧Reenvío de correos de root
      • 🚧Roundcube como MUA
      • Comprobación ESMTP
      • 🚧Seguridad en mailing
      • 🚧Mailhog
    • 🏗️File transfer
      • 🚧FTP
      • Git
    • Sistemas de comunicación instantánea
      • Comunicación mediante CLI
      • Ejabberd - XMPP
        • 🚧Ejabberd con docker
      • 🚧Openfire - XMPP
      • 🚧Comunicaciones servidor-móvil
    • 🏗️Multimedia services
      • Stremio
      • Ver anime por CLI
      • Jellyfin
      • 🚧HLS sobre Apache
      • 🚧Servicio autohospedado de videoconferencia
      • 🚧Morphos: Conversor docs
      • 🚧Reproductores de música en CLI
      • 🚧Icecast - música en streaming
      • 🚧RTMP-HLS server
      • 🚧Guacamole
  • 🖱️Hardware
    • 🚧Identificando conectores
    • Curso de electrónica analógica
    • Alcanzar los 3200MHz con la RAM
    • Calculadora de cuellos de botella
    • 🚧PXE: Bootear sistemas en red
    • 🚧PRÁCTICA - Clonación de disco con Clonezilla
    • Logitech iFixit
  • 🕸️Redes
    • Apuntes IPv4 Alina
    • ¿Cómo diferenciar tantos elementos de red?
    • 🚧IPv6
    • PRÁCTICA - Subneteo con IPcalc en Linux
    • PRÁCTICA - Comandos de red en Windows
    • 🚧PRÁCTICA - Comandos de red en Linux
    • Herramientas de red
      • 🚧TCPDump: analizado de paquetes en red
      • PRÁCTICA - Netsh
      • 🚧PRÁCTICA - mtr.ping.pe
      • 🚧Netcat
    • Wireshark
    • VPN y escritorio remoto
      • Comunicación punto a punto con ngrok
      • 🚧VPN
    • Escaneo de red
      • PRÁCTICA - Mapeado de red con Draw.io
      • 🚧PRÁCTICA - Nmap/Zenmap
    • Redes inalámbricas
      • Wi-fi
        • 🚧PRÁCTICA - Configuración de router
        • 🚧PRÁCTICA - Como hacer un Wifi Heatmap
        • 🚧Seguridad de redes inalámbricas
        • PRÁCTICA - Crackear la contraseña del Wifi con WPA/WPA2
    • PRÁCTICA - Usar SSH en Cisco packet tracer
  • 🛑Ciberseguridad
    • 🚧Securizando un servidor Linux
      • Protégete de ataques de fuerza bruta con Fail2ban
      • Firewall
        • UFW (uncomplicated firewall)
          • GUFW - Interfaz gráfica de ufw
        • 🚧IPTables
        • 🚧PFsense
          • 🚧DMZ con PFsense
      • 🚧Passbolt: gestor de contraseñas autohospedado
      • 🚧Hashes y encriptación
      • 🚧Certificados SSL/TLS
      • Copias de seguridad
    • 🚧Alerta de escaneo de puertos
    • 🚧Google dorks
    • 🚧Enumeración DNS
    • Comandos destructivos de linux
    • Webs enseñanza cyber
    • Wireless Pentesting CheatSheet Github
    • The password game!
    • Personal Security Checklist
  • 🔌Arduino
    • Termómetro e higrómetros digitales y online con Arduino
    • Construyendo un coche multipropósito
      • Multi
      • Montaje del auto
    • Arduino con Sigfox para IoT
    • 10 proyectos de Arduino
  • 📚Recursos y libros
    • Media library: libros varios
    • Herramientas básicas de sysadmin
  • 🌍Sostenibilidad y digitalización
    • Portfolio curso digitalización MOOC
    • 🚧Explotación de recursos por IA
    • 🚧Nuevas tecnologias y comunicaciones
    • 🚧Enlaces sobre Inteligencia artificial
Con tecnología de GitBook
En esta página
  • 1) Ejemplo con php
  • 2) Monitor web con docker
  • 3) Página web en docker
  1. Sistemas y Servidores
  2. Docker

Deployment web con Docker con ejemplos

AnteriorVolúmenes de dockerSiguientePRACTICA: Node.js con docker

Última actualización hace 1 día

Ya hemos visto lo que es Docker, una plataforma de código abierto para desarrollar, enviar y ejecutar aplicaciones. Es una tecnología que permite incorporar y almacenar su código y sus dependencias en un pequeño paquete llamado imagen.

Vamos a realizar dos ejemplos, uno con una imagen ya creada y la otra más libre:

1) Ejemplo con php

Primero revisaremos de que images dispone DockerHub de lo que nos interesa:

docker search php

Para descargar la imagen podemos hace run pull:

docker pull php

Sin descargar la imagen, también podemos directamente ejecutar un contenedor. Como ejemplo podemos probar a instalar una imagen ya creada de php8 con el siguiente comando:

docker run -d hazardco/anaya-php8:v1.0.1 

Docker intenta localizar esa imagen dentro de su disco duro. Si no la encuentra, la busca en una base de datos de imágenes llamada y la descarga. Cuando ya está la imagen en el disco, procede a ejecutarla en segundo plano gracias al parámetro -d.

Después de ejecutar la imagen de PHP 8 en este caso, lo que obtenemos es un contenedor que está iniciado, pero que no es visible a priori. Además del contenedor que está ejecutándose, Docker guarda de forma local una copia de la imagen descargada. Se puede obtener un listado de imágenes con el comando:

docker image list

Y es posible ver los contenedores que están funcionando con el comando:

docker ps

Después de lanzar el comando, obtendremos información de todos los contenedores que se encuentran activos. Lo más importante es el atributo CONTAINER_ID, que identifica al contenedor de manera unívoca, y el IMAGE, que muestra la imagen desde la que se creó. Desde este punto, es posible entrar en el contenedor para comprobar que está funcionando.

Esto se hace con el comando:

docker exec -it [CONTAINER_ID] sh

Una vez ejecutado, verás que accedes a un shell del container donde puedes ejecutar otros comandos. Prueba a sacar la versión con:

php --version

O prueba a sacar la fecha con:

php -r 'echo date("d/m/y")."/n";'

Para salir del shell simplemente usa el comando exit.


2) Monitor web con docker

Para este ejemplo vamos a crear tres contenedores, vamos a ponernos en el supuesto que deseamos un sitio web que esté estrechamente monitorizado. Queremos gestionar nuestras propias operaciones, por lo que queremos que la solución envíe correos electrónicos a un equipo cuando el servidor esté caído. Para estos tres contenedores:

  • El primero ejecutará NGINX

  • El segundo ejecutará un programa llamado "mailer" (sistema de envío de correos). Ambos funcionarán como contenedores .

  • Un tercer programa, llamado "agent" (agente), se ejecutará en un contenedor interactivo.

Tanto el "mailer" como el "agent" son pequeños scripts creados para este ejemplo.

Vamos primero a crear el contenedor de nginx:

 docker run --detach \ 
    --name web nginx:latest

Ahora con un docker ps podemos ver el contenedor en activo y crearemos el mailer:

 docker run -d \  
    --name mailer \

Vamos ahora con el contenedor interactivo, el que tendrá shell de terminal para gestionar:

docker run --interactive --tty \ 
    --link web:web \
    --name web_test \
    busybox:latest /bin/sh

El comando utiliza dos opciones en la instrucción run: --interactive (o -i) y --tty (o -t).

  • La opción --interactive le indica a Docker que mantenga abierto el flujo de entrada estándar (stdin) para el contenedor, incluso si no hay un terminal conectado.

  • La opción --tty le indica a Docker que asigne un terminal virtual al contenedor, lo cual te permitirá enviar señales al contenedor.

Tan importante como estas opciones interactivas, es que al iniciar este contenedor especificaste el programa que debía ejecutarse dentro de él. En este caso, ejecutamos un programa de shell llamado sh. Desde la shell podemos comprobar si funciona el servidor web:

wget -O - http://web:80/

Si ves el mensaje de "welcome to nginx" es que esta correcto.

Esta bien aclarar que puedes ejecutar un proceso en esta terminal y luego llevarlo a segundo plano manteniendo presionada la tecla Ctrl y presionando P y después Q. Esto solo funcionará si has usado la opción --tty.

Para terminar el trabajo necesitamos iniciar un agente. Este es un agente de monitoreo que comprobará el servidor web, como hicimos antes, y enviará un mensaje usando el "mailer" si el servidor web se detiene. Este comando iniciará el agente en un contenedor interactivo usando las flags acortadas (--interactive --tty):

docker run -it \ 
    --name agent \
    --link web:insideweb \
    --link mailer:insidemailer \
    dockerinaction/ch2_agent

Cuando se ejecute, el contenedor testeara el contenedor web cada segundo y mostrará un mensaje de system up. Ahora ya puedes desacoplar la terminal con Ctrl + P + Q


3) Página web en docker

1- Crear un Archivo HTML

Creamos un archivo HTML simple que será el contenido de tu sitio web. Puedes utilizar un editor de texto para crear un archivo llamado index.html. Por ejemplo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Este es mi Sitio Web en Docker</title>
</head>
    <body>
        <h1>¡Hola desde mi servidor web Dockerizado!</h1>
    </body>
</html>

2- Crear el Dockerfile

Crea un archivo llamado Dockerfile en el mismo directorio que tu archivo HTML. Este archivo define cómo se construirá tu imagen de Docker. Puedes usar la imagen oficial de Nginx y copiar tu archivo HTML dentro de ella.

# Usa la imagen oficial de Nginx como base
FROM nginx

# Copia tu archivo HTML al directorio de contenido estático de Nginx
COPY index.html /usr/share/nginx/html

# Puerto en el que Nginx escuchará
EXPOSE 80

# Comando para iniciar Nginx en primer plano
CMD ["nginx", "-g", "daemon off;"]

3- Construir la Imagen de Docker

Abre una terminal en el directorio que contiene tu Dockerfile y el archivo index.html. Ejecuta el siguiente comando para construir la imagen:

docker build -t mi-sitio-web-dockerizado .

Elige un nombre significativo para tu imagen (en este caso, mi-sitio-web-dockerizado).

4- Ejecutar el Contenedor

Después de construir la imagen, puedes ejecutar un contenedor basado en ella:

docker run -d -p 8080:80 mi-sitio-web-dockerizado

Esto ejecutará el contenedor en segundo plano (-d), redirigiendo el puerto 8080 de tu máquina host al puerto 80 del contenedor. Puedes cambiar el número del puerto según tus preferencias.

5- Verificar

Abre un navegador web y visita http://IPDELHOST:8080 (el puerto configurado antes). Deberías ver tu página web HTML servida por Nginx desde el contenedor de Docker.

📊
Ejemplo con php
Ejemplo web
dockerhub
Page cover image
Creación del contenedor
Sistema de tres contenedores, extraído de Docker in action por Jeff Nickoloff
Funcionamiento de la web