1- imagen oficial de Nginx-Tutorial Docker: Servir una página web -volumes: - ./ruta/local:/ruta/en/contenedor

 El . significa "busca el Dockerfile en la carpeta actual".

¿Qué hace - ./:/var/www/html?

  • ./ es la carpeta actual de tu host (donde está el docker-compose.yml).

  • /var/www/html es la ruta dentro del contenedor.

  • Efecto: Todo lo que esté en ./ se ve dentro del contenedor en /var/www/html, y todo lo que se cree dentro del contenedor en /var/www/html aparecerá automáticamente en tu ./. Es una sincronización bidireccional y en tiempo real.

******************************************

Instalar Docker desde el repositorio oficial

Sigue estos pasos para configurar el repositorio oficial e instalar Docker.

  1. Actualiza los paquetes e instala las dependencias necesarias:

    bash
    sudo apt update
    sudo apt install ca-certificates curl -y
  2. Agrega la clave GPG oficial de Docker:

    bash
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
  3. Agrega el repositorio oficial de Docker a las fuentes de APT:

    bash
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. Actualiza el índice de paquetes e instala Docker:

    bash
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
    • docker-ce: El motor de Docker (Community Edition).

    • docker-compose-plugin: El plugin de Docker Compose, que es la forma moderna de usarlo (ya no necesitas instalar docker-compose por separado).


***********************

Instalar docker y grupo de usuraio

Tutorial Docker: Servir una página web personalizada con imagen oficial

En este tutorial aprenderás a usar una imagen oficial de Docker, estructurar tus archivos y visualizar tu propia página HTML en un contenedor. Utilizaremos la imagen oficial de Nginx, una de las más populares para servir contenido estático.


Requisitos previos

  • Tener Docker instalado en tu sistema.
    (Comprueba con docker --version)

  • Conocimientos básicos de línea de comandos.


Paso 1: Crear la estructura de archivos

Crea una carpeta para tu proyecto, por ejemplo mi-web-docker, y dentro de ella coloca tu archivo HTML personalizado.

bash
mkdir mi-web-docker
cd mi-web-docker

Dentro de esta carpeta, crea tu archivo index.html con el siguiente contenido:

bash
echo "<html><body><h1>¡Mi Web Personalizada!</h1><p>Usando imagen oficial</p></body></html>" > index.html

La estructura de archivos quedará así:

text
mi-web-docker/
└── index.html

Paso 2: Elegir la imagen oficial

Usaremos la imagen oficial de Nginx disponible en Docker Hub: nginx:latest. Esta imagen viene con una configuración por defecto que sirve los archivos estáticos desde /usr/share/nginx/html.


Paso 3: Ejecutar el contenedor con montaje de volumen

Para que Nginx sirva nuestro archivo index.html, debemos montar la carpeta local dentro del contenedor, reemplazando el contenido por defecto.

Ejecuta el siguiente comando:

bash
docker run -d -p 8080:80 --name mi-web -v $(pwd):/usr/share/nginx/html nginx:latest

Explicación de cada parte:

ParámetroDescripción
docker runComando para crear y ejecutar un contenedor.
-dModo detached (en segundo plano).
-p 8080:80Mapea el puerto 80 del contenedor al puerto 8080 de tu máquina.
--name mi-webAsigna un nombre al contenedor para manejarlo fácilmente.
-v $(pwd):/usr/share/nginx/htmlMonta la carpeta actual (pwd) dentro del contenedor en la ruta donde Nginx busca los archivos.
nginx:latestImagen oficial de Nginx.

Paso 4: Verificar que el contenedor está corriendo

Lista los contenedores activos:

bash
docker ps

Deberías ver algo como:

text
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                   NAMES
abcd1234...    nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   mi-web

Paso 5: Acceder a la página web

Abre tu navegador y ve a:

text
http://localhost:8080

Verás el mensaje:

¡Mi Web Personalizada!

Usando imagen oficial

¡Ya tienes tu sitio funcionando con Docker!


Paso 6: Modificar el contenido en tiempo real

Gracias al montaje de volumen, cualquier cambio que hagas en index.html se reflejará inmediatamente sin necesidad de reiniciar el contenedor.

Por ejemplo, edita el archivo:

bash
echo "<html><body><h1>Hola desde Docker</h1><p>Actualizado al instante</p></body></html>" > index.html

Refresca la página y verás los cambios al instante.


Paso 7: Detener y eliminar el contenedor

Cuando hayas terminado, detén y elimina el contenedor:

bash
docker stop mi-web
docker rm mi-web

O si quieres eliminar el contenedor al detenerlo:

bash
docker rm -f mi-web

Estructura final de archivos (resumen)

text
mi-web-docker/
└── index.html        # Tu archivo HTML personalizado

Variantes con otras imágenes oficiales

Puedes usar otras imágenes oficiales de servidores web:

  • Apache HTTP Server (httpd:latest): el punto de montaje es /usr/local/apache2/htdocs/.

  • Python HTTP Server (python:3-alpine): usa python -m http.server y monta en el directorio de trabajo.

Ejemplo con Apache:

bash
docker run -d -p 8080:80 --name mi-web-apache -v $(pwd):/usr/local/apache2/htdocs/ httpd:latest

Conclusión

Has aprendido a:

  1. Crear una estructura de archivos local.

  2. Usar una imagen oficial de Docker (Nginx).

  3. Montar un volumen para servir contenido personalizado.

  4. Visualizar la página en tu navegador.

  5. Modificar el contenido sin reconstruir el contenedor.

Este flujo es la base para desarrollar y probar sitios web estáticos con Docker de manera ágil y profesional.

**************************************************

 Tal como lo dices, gracias al volumen tipo bind (el -v $(pwd):/usr/share/nginx/html), tu carpeta local mi-web-docker/ está enlazada directamente dentro del contenedor.

Si quieres ingresar al contenedor para ver dónde está físicamente la página, la ruta interna es:

/usr/share/nginx/html/

Aquí te explico paso a paso cómo entrar y verificarlo:

1. Ingresar al contenedor (shell interactivo)

Como tu contenedor se llama mi-web (por el --name que usaste), ejecuta:

bash
docker exec -it mi-web /bin/bash

Nota: Si te da error porque no encuentra bash, prueba con sh (las versiones más ligeras de Nginx a veces solo traen sh):

bash
docker exec -it mi-web /bin/sh

2. Navegar hasta la carpeta de la página

Una vez dentro, ve a la ruta donde Nginx sirve los archivos por defecto:

bash
cd /usr/share/nginx/html

3. Listar los archivos

Ejecuta un ls -la y verás tu index.html:

bash
ls -la

La salida mostrará algo como:

text
total 4
drwxr-xr-x 2 root root 4096 ... .
drwxr-xr-x 1 root root 4096 ... ..
-rw-r--r-- 1 root root  100 ... index.html

4. Ver el contenido desde dentro

Puedes leerlo directamente con cat:

bash
cat index.html

Verás el texto: <html><body><h1>¡Mi Web Personalizada!</h1>...


Dato curioso (y muy útil)

Como es un volumen montado, cualquier cambio que hagas desde dentro del contenedor en esa ruta, se reflejará automáticamente en tu carpeta local mi-web-docker/ (y viceversa).

Por ejemplo, desde dentro del contenedor puedes modificar el archivo:

bash
echo "<h1>Editado desde dentro</h1>" > index.html

Sal del contenedor (exit), y si abres tu archivo index.html en tu máquina local, verás que también cambió.

Alternativa: Ver la ruta sin entrar al shell

Si solo quieres confirmar que el archivo existe sin necesidad de abrir una terminal interactiva, puedes ejecutar este comando directo desde tu máquina host:

bash
docker exec mi-web cat /usr/share/nginx/html/index.html

¡Así de sencillo! La magia de Docker es que esa carpeta es el punto de encuentro entre tu computadora y el contenedor

***********************************************SIN VOLUMENES

Cuando no usas volúmenes, el contenedor queda aislado y no tiene acceso a tu carpeta local. Para meter tu página ahí tienes dos formas principales (una más casual y otra profesional):


Método 1: Copiar el archivo al contenedor en marcha (docker cp)

Este método es rápido para hacer pruebas puntuales, pero no es permanente (si eliminas el contenedor, la página desaparece).

Paso a paso:

  1. Ejecuta un contenedor Nginx normal (sin montar nada):

    bash
    docker run -d -p 8080:80 --name mi-web-sin-vol nginx:latest
  2. Copia tu index.html desde tu máquina hacia adentro del contenedor:

    bash
    docker cp index.html mi-web-sin-vol:/usr/share/nginx/html/
  3. Abre el navegador en http://localhost:8080 y verás tu página.

⚠️ Limitaciones:

  • Si el contenedor se reinicia, el archivo sigue ahí (porque el sistema de archivos del contenedor persiste mientras existe).

  • Si eliminas el contenedor (docker rm), el archivo se pierde para siempre.

  • No hay sincronización: si cambias el archivo en tu PC, no se actualiza dentro del contenedor a menos que vuelvas a ejecutar docker cp.

Método 2: Construir tu propia imagen personalizada (¡La recomendada!)

Aquí empaquetas tu HTML dentro de la imagen. Es la forma profesional y portátil: puedes subir esa imagen a un registro (Docker Hub) y funcionará en cualquier lado sin depender de archivos externos.

Paso a paso:

  1. Crea un archivo llamado Dockerfile (sin extensión) en tu carpeta mi-web-docker/ con este contenido:

    dockerfile
    # Usamos la imagen oficial de Nginx como base
    FROM nginx:latest
    
    # Copiamos nuestro index.html desde la carpeta local hacia la ruta interna de Nginx
    COPY index.html /usr/share/nginx/html/
  2. Construye (build) tu imagen personalizada:

    bash
    docker build -t mi-web-personalizada .

    El . significa "busca el Dockerfile en la carpeta actual".

  3. Ejecuta un contenedor basado en tu nueva imagen (sin volúmenes):

    bash
    docker run -d -p 8080:80 --name mi-web-propia mi-web-personalizada
  4. Abre el navegador en http://localhost:8080 y ¡voilá!

Ventajas de este método:

  • La página viaja dentro de la imagen. Puedes compartirla con otros o desplegarla en producción sin carpetas externas.

  • Es idempotente: cada vez que crees un contenedor de esta imagen, tendrá tu página.

Desventaja:

  • Si quieres cambiar el texto del HTML, tienes que reconstruir la imagen (docker build de nuevo) y reiniciar el contenedor. No es "en caliente" como con los volúmenes.


Comparativa rápida

CaracterísticaCon Volumen (-v)Con docker cpCon Dockerfile (COPY)
SincronizaciónInmediata (en ambos sentidos)No sincronizaNo sincroniza
Persistencia al eliminarLos archivos quedan en tu PCSe pierdenViajan dentro de la imagen
Ideal paraDesarrollo / Live-reloadPruebas rápidas y puntualesProducción / Distribución
Cambios en calienteSí (editas en PC y se ve al refrescar)No (toca copiar de nuevo)No (toca reconstruir)

¿Y si quiero inspeccionar dónde quedó la página sin volúmenes?

El procedimiento es idéntico al que te expliqué antes: la ruta interna siempre es /usr/share/nginx/html/ (en Nginx). Si entras al contenedor con:

bash
docker exec -it mi-web-propia /bin/bash
cd /usr/share/nginx/html
cat index.html

Verás tu archivo, pero si intentas modificarlo desde dentro, no se reflejará en tu carpeta local porque no hay un enlace (volumen) entre ambas.


En resumen:
Sin volúmenes, el contenedor es una "cápsula" cerrada. Si solo es para probar, usa docker cp. Si es para un proyecto serio o desplegar, construye tu propia imagen con un Dockerfile (Método 2). ¿Cuál de los dos te gustaría probar primero


************************************************************

************************************************

Limpieza completa del tutorial "Imagen oficial + volumen"

Este tutorial mezcla dos cosas: la instalación de Docker y el proyecto de la web con Nginx usando imagen oficial y montaje de volumen. Aquí tienes cómo dejar todo limpio, por partes.


🟢 Parte A: Limpiar el proyecto de la web (contenedor + carpeta)

Paso 1: Detener y eliminar el contenedor

Si el contenedor sigue corriendo:

bash
docker stop mi-web
docker rm mi-web

O en un solo comando (forzando):

bash
docker rm -f mi-web

⚠️ El tutorial menciona un contenedor llamado mi-web. Si creaste el de Apache, se llama mi-web-apache. Elimínalo también si existe:

bash
docker rm -f mi-web-apache

Paso 2: Verificar que ya no existe

bash
docker ps -a

No deberías ver mi-web ni mi-web-apache en la lista.

Paso 3: Eliminar la carpeta del proyecto

Linux / macOS:

bash
cd ..
rm -rf mi-web-docker

Windows (PowerShell):

powershell
cd ..
Remove-Item -Recurse -Force mi-web-docker

Windows (CMD):

cmd
cd ..
rmdir /s /q mi-web-docker

💡 Aquí no hay imagen que borrar porque usaste nginx:latest directamente (imagen oficial). A diferencia del otro tutorial, no construiste una imagen propia con docker build. Por eso no hay docker rmi mi-web:v1 que hacer.

Paso 4: ¿Quieres borrar también la imagen oficial nginx:latest?

Solo si no la usas en otros proyectos:

bash
docker rmi nginx:latest

Si usaste Apache:

bash
docker rmi httpd:latest

🟡 Parte B: ¿Desinstalar Docker por completo?

Si lo que quieres es eliminar Docker del sistema (porque ya no lo necesitas), aquí está el procedimiento para Ubuntu/Debian:

Paso 1: Detener el servicio de Docker

bash
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd

Paso 2: Eliminar los paquetes de Docker

bash
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

Paso 3: Eliminar dependencias huérfanas

bash
sudo apt autoremove -y

Paso 4: Eliminar los datos de Docker (⚠️ borra todo: imágenes, volúmenes, contenedores)

bash
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Paso 5: Eliminar el repositorio y la clave GPG de Docker

bash
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc

Paso 6: Eliminar el grupo docker y el usuario del grupo

bash
sudo groupdel docker

Si agregaste tu usuario al grupo con sudo usermod -aG docker $USER, al borrar el grupo ya no perteneces a él. No hace falta hacer nada más.

Paso 7: Actualizar el índice de paquetes

bash
sudo apt update

Paso 8: Verificar que Docker ya no está

bash
docker --version

Debería decir algo como:

text
bash: docker: command not found

✅ Docker quedó completamente desinstalado.


🧾 Resumen rápido

Solo limpiar el proyecto (dejar Docker instalado)

bash
docker rm -f mi-web mi-web-apache 2>/dev/null
cd ..
rm -rf mi-web-docker
# Opcional: docker rmi nginx:latest

Desinstalar Docker por completo (Ubuntu/Debian)

bash
sudo systemctl stop docker docker.socket containerd
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo apt autoremove -y
sudo rm -rf /var/lib/docker /var/lib/containerd
sudo rm /etc/apt/sources.list.d/docker.list /etc/apt/keyrings/docker.asc
sudo groupdel docker
sudo apt update

⚠️ Notas importantes

  1. La carpeta mi-web-docker solo contiene index.html. Si lo creaste con echo, no hay nada más. Bórrala sin miedo.

  2. El contenedor mi-web no guarda datos persistentes porque usaba un bind mount (-v $(pwd):/usr/share/nginx/html), no un volumen de Docker. Al borrar la carpeta del host, desaparece todo.

  3. Si usaste --rm al hacer docker run, el contenedor ya se habría eliminado solo al detenerse. En ese caso docker rm mi-web dará error "No such container"; ignóralo.

  4. Si borras Docker, perderás todas las imágenes, contenedores y volúmenes de todos tus proyectos, no solo los de este tutorial. Asegúrate de no necesitarlos.

  5. La clave GPG que borras en /etc/apt/keyrings/docker.asc es la que usaste en la instalación. Si algún día reinstalas Docker, tendrás que repetir el proceso desde el inicio.

Comentarios

Entradas más populares de este blog

12. Hola Mundo en Docker.

2.1-Instalación de Docker (nuevo método oficial), configuración de un proyecto Laravel con Nginx y MySQL en contenedores

11¿Qué es Docker? y ¿Por qué debo saberlo?