Curso de Ubuntu 26.04 / Ejecutar una aplicación con Docker Compose: datos y puertos
Los contenedores ejecutan aplicaciones a partir de imágenes y comparten el kernel del equipo que ejecuta Docker; los datos persistentes y los puertos publicados requieren configuración aparte. Esta práctica instala Docker Engine y Compose en una VM dedicada con Ubuntu 26.04 y ejecuta Nginx con datos en un volumen. El puerto se limita a la propia VM Ubuntu que actúa como host de Docker.
Determinar la ruta de instalación y permisos
En servidores que ya utilizan Docker, containerd o Kubernetes, no se deben eliminar paquetes ni mezclar rutas de instalación. Investigue los contenedores, volúmenes y almacenamiento existentes y elabore un plan de cambios por separado. A continuación se muestra el procedimiento para una nueva VM Ubuntu sin almacenamiento Docker. No lo ejecute si ya existen /etc/apt/sources.list.d/docker.sources y /etc/apt/keyrings/docker.asc.
El acceso al grupo docker y al socket de Docker otorga permisos muy elevados en el host. Este artículo especifica sudo para los comandos necesarios y no concede permisos 777 al socket ni añade a todos los usuarios al grupo docker. Ejecutar imágenes no confiables no es lo mismo que abrir archivos simples.
Instalación desde el repositorio oficial
Guarde el código completo en un archivo nuevo ~/install-docker-lab.sh y ejecútelo con bash ~/install-docker-lab.sh. Si el nombre ya existe, elija otro y ajuste la ejecución. El script se detiene si no es Ubuntu 26.04 o si encuentra los archivos de repositorio indicados. La clave del repositorio se enlaza como Signed-By solo para ese repositorio.
set -eu
. /etc/os-release
if [ "$ID" != ubuntu ] || [ "$VERSION_ID" != 26.04 ]; then
printf "This lab requires Ubuntu 26.04.\n" >&2
exit 1
fi
if [ -e /etc/apt/sources.list.d/docker.sources ] || [ -e /etc/apt/keyrings/docker.asc ]; then
printf "Inspect the existing Docker repository first.\n" >&2
exit 1
fi
sudo apt update
sudo apt install ca-certificates curl
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
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: ${UBUNTU_CODENAME:-$VERSION_CODENAME}
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world
Cuando la instalación haya terminado, verifique la versión del cliente y del servidor y el mensaje de éxito de hello-world. No ignore los errores de apt, de firma o de red ni pase al siguiente paso. La versión instalada real se registra en el historial de operación, y eliminar el repositorio no eliminará el motor ni los datos instalados.
Ejemplo de configuración de sitio Nginx mantiene el puerto 8080 y separa el puerto host del contenedor en 8081. Mantenga el 80 dentro del contenedor. Si el 8081 también está en uso, verifique el propietario con ss y compose ps y use de manera consistente otro puerto verificado en todos los ejemplos de Compose y curl.
Crear archivo Compose y volúmenes
Cree el directorio nuevo ~/compose-lab y guarde allí compose.yaml; si ya existe, use otro nombre coherente en todas las instrucciones. Compruebe con ss -lnt que 127.0.0.1:8081 está libre. Al omitir la IP de ports se puede publicar en otras interfaces. El aislamiento de puertos publicados en localhost se aplica a Engine 28.0.0 o posterior: la documentación de publicación de puertos de Docker advierte que versiones anteriores permitían acceso desde el mismo segmento de red. Compruebe la versión registrada durante la instalación.
services:
web:
image: nginx:stable-alpine
ports:
- "127.0.0.1:8081:80"
volumes:
- lab-html:/usr/share/nginx/html
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
lab-html:
lab-html es un volumen con nombre separado de la capa de escritura del contenedor. Al montar por primera vez un volumen vacío en la ruta de Nginx, Docker copia allí el contenido existente de la imagen, salvo que se configure lo contrario; consulte la inicialización de volúmenes de Docker. La práctica reemplaza su index.html. La etiqueta stable-alpine puede cambiar: registre el digest descargado y planifique las actualizaciones. Ajuste también los límites de registros a la carga real.
Verificar ejecución, recreación y retención de datos
(
set -eu
cd ~/compose-lab
sudo docker compose config
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs --tail 30 web
)
Compruebe que la configuración, la descarga y el arranque terminaron correctamente antes de continuar. Use sudo docker compose ps -q web para obtener el ID del contenedor y consulte sus montajes con sudo docker inspect ID_DEL_CONTENEDOR --format '{{json .Mounts}}'. Registre el nombre del volumen y su destino y repita la consulta después de recrearlo. El archivo que se escribe a continuación pertenece exclusivamente al proyecto nuevo; no use proyectos o volúmenes de producción.
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose exec web sh -c 'printf "volume-lab\n" > /usr/share/nginx/html/index.html'
curl --fail http://127.0.0.1:8081/
sudo docker compose up -d --force-recreate
curl --fail http://127.0.0.1:8081/
sudo docker image inspect nginx:stable-alpine --format '{{json .RepoDigests}}'
)
Los bloques con paréntesis cambian a ~/compose-lab solo durante su ejecución; use siempre el mismo archivo Compose y proyecto. Obtener volume-lab antes y después es compatible con la persistencia esperada, y la comparación del identificador del volumen confirma qué almacenamiento se montó. Esto no prueba una copia de seguridad ni toda la aplicación. Pruebe desde la propia VM Ubuntu: 127.0.0.1 en el PC físico representa otro equipo. Compruebe la publicación con ss y docker compose ps.
Distinguir entre detener y eliminar datos
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose down
sudo docker volume ls
)
down limpia los contenedores y la red de este proyecto, pero los volúmenes con nombre se mantienen por defecto. Puede comprobar si obtiene la misma respuesta después de ejecutar up -d nuevamente. down -v y volume prune pueden eliminar datos, por lo que no se usan como simples comandos de cierre. La copia de seguridad de volúmenes requiere ajustar la escritura de la aplicación y realizar pruebas de restauración desde una ubicación de almacenamiento separada.




