~/nube/p00 $ cat 01-docker-y-entorno.md
- Introducción a la nube pública
- P00
- lección 01/06
Docker, contenedores y entorno persistente
Diferencia imagen y contenedor, prueba una aplicación local y crea p00-lab con un espacio de trabajo persistente.
En este bloque comprobarás tres formas de ejecutar un contenedor: un programa que termina, una aplicación web que permanece activa y una terminal interactiva. Después crearás p00-lab, tu contenedor de trabajo persistente. Ese será el punto de partida del resto de P00.
Las órdenes de Docker se ejecutan siempre en la terminal del anfitrión (Windows o Linux). Solo entrarás en una terminal Debian cuando se indique expresamente. Dentro de Debian no ejecutes órdenes que empiecen por docker.
Antes de empezar: qué es Docker y por qué lo usamos
Section titled “Antes de empezar: qué es Docker y por qué lo usamos”Docker es una plataforma para crear, distribuir y ejecutar aplicaciones en contenedores. Un contenedor reúne una aplicación y el entorno mínimo que necesita para funcionar: por ejemplo, Debian y las herramientas que utilizaremos durante el curso.
Esto evita el problema de «en mi ordenador funciona»: si cada equipo tiene versiones, configuraciones o sistemas distintos, una misma práctica puede dar resultados diferentes. En P00 usaremos Docker para que todas las personas dispongáis del mismo entorno Debian, aunque el anfitrión sea Windows o Linux. Así podremos centrarnos en la shell, Git, SSH y las comprobaciones de red, sin reinstalar esas herramientas en cada equipo.
Docker no sustituye a tu sistema operativo ni es una máquina virtual completa. El contenedor utiliza el motor Docker del anfitrión y, en Linux, comparte su kernel; por eso es más ligero y arranca más rápido que una máquina virtual. En este curso mantendrás un único contenedor, p00-lab, y tu trabajo quedará en la carpeta compartida optativa-nube/.
Tutorial Docker (David Martínez)
Section titled “Tutorial Docker (David Martínez)”https://martinezpenya.es/ModelosIA/UD00/UD00_ES.html
Componentes
Section titled “Componentes”| Componente | Qué es | Papel en P00 |
|---|---|---|
| Cliente Docker | El comando docker que escribes en la terminal del anfitrión. |
Envía órdenes como crear, iniciar, detener e inventariar contenedores. |
| Motor Docker | El servicio que recibe esas órdenes y gestiona los recursos. En Windows suele ejecutarlo Docker Desktop. | Crea y ejecuta p00-lab; por eso docker version debe mostrar Client y Server. |
| Imagen | Una plantilla de solo lectura con un sistema base y las herramientas preparadas. | Usarás la imagen oficial debian:trixie-slim como punto de partida del contenedor de trabajo. |
| Contenedor | Una instancia concreta creada desde una imagen, con su propio estado de ejecución. | p00-hola, p00-excalidraw y p00-lab son contenedores distintos. |
| Registro | Un servicio que almacena y distribuye imágenes, como Docker Hub. | Docker descargará una imagen si aún no existe en tu equipo; solo usarás las imágenes indicadas en la práctica. |
| Montaje | Una conexión entre una carpeta o volumen y el contenedor. | optativa-nube/ se monta en /optativa-nube para que repositorios y evidencias persistan al detener el contenedor. |
Docker vs Virtualbox
Section titled “Docker vs Virtualbox”
Imagen vs Contenedor
Section titled “Imagen vs Contenedor”Actividad 1 · Información docker
Section titled “Actividad 1 · Información docker”Entorno: terminal del anfitrión, con Docker Desktop abierto si usas Windows.
Primero comprueba que Docker puede comunicarse con su motor:
docker versionDebe aparecer información de Client y Server. Si falta el servidor o aparece un error de conexión, registra el mensaje en una frase y sigue la demostración indicada por el docente. No instales componentes ni uses sudo durante esta práctica.
Ahora consulta dos inventarios:
docker psdocker ps -adocker ps muestra solo los contenedores en marcha. docker ps -a muestra también los detenidos. Durante el curso usarás normalmente estas dos órdenes completas para comprender qué recursos hay en tu equipo.
Actividad 2 · Un contenedor sin nombre y otro con nombre
Section titled “Actividad 2 · Un contenedor sin nombre y otro con nombre”La imagen hello-world ejecuta un programa pequeño y termina. Es una forma segura de observar un contenedor detenido.
Primero: deja que Docker elija el nombre
Section titled “Primero: deja que Docker elija el nombre”Predicción: después de ejecutar la orden, ¿qué aparecerá en docker ps? ¿Y en docker ps -a?
docker run hello-worlddocker psdocker ps -aEn la columna NAMES de docker ps -a, Docker habrá asignado un nombre automático. Anótalo en tu tabla. El estado será equivalente a Exited: el programa terminó, pero el contenedor sigue inventariado.
Elimina únicamente ese contenedor, sustituyendo el texto por el nombre que has observado tú:
docker rm NOMBRE_ASIGNADO_POR_DOCKERdocker ps -aDespués: asigna un nombre útil
Section titled “Después: asigna un nombre útil”Hasta ahora Docker eligió el nombre del contenedor automáticamente. Cuando crees un contenedor que vas a revisar o reutilizar, asígnale un nombre claro con --name.
docker run --name p00-hola hello-worldDocker crea un contenedor llamado p00-hola, muestra el mensaje de prueba y lo detiene porque el programa hello-world ya ha terminado.
Ahora consulta los dos inventarios:
docker psdocker ps -aComprobación: p00-hola debe aparecer en docker ps -a con un estado parecido a Exited, pero no en docker ps.
¿Por qué aparece en un inventario y no en el otro?
Actividad 3 · Una aplicación que sigue activa
Section titled “Actividad 3 · Una aplicación que sigue activa”Ahora probarás Excalidraw, una aplicación de dibujo que se abrirá solo en tu propio equipo. A diferencia de hello-world, su proceso sigue activo mientras la aplicación está disponible.
Punto de partida: p00-hola está detenido y el puerto local 8080 está libre. Comprueba los contenedores antes de crear otro:
docker psdocker ps -aCambio: crea p00-excalidraw con la imagen pública de Excalidraw.
docker run -d --rm --name p00-excalidraw -p 127.0.0.1:8080:80 excalidraw/excalidraw:latest-ddeja la aplicación ejecutándose sin ocupar tu terminal.-p 127.0.0.1:8080:80conecta el puerto 8080 de tu propio equipo con el puerto 80 del contenedor. La dirección127.0.0.1impide que la aplicación se publique en la red del aula.--rmelimina este contenedor temporal cuando se detenga; la imagen descargada puede permanecer.
Comprobación: abre http://127.0.0.1:8080 en el navegador, crea una figura simple y consulta el estado:
docker psdocker ps -aDebes ver p00-excalidraw en marcha. Ciérralo de manera deliberada:
docker stop p00-excalidrawdocker psdocker ps -aComo se creó con --rm, ya no debe aparecer en docker ps -a. Anota en la tabla qué permanece y qué no permanece tras detenerlo.
Actividad 4 · Una terminal Debian temporal
Section titled “Actividad 4 · Una terminal Debian temporal”Un contenedor también puede ejecutar una terminal. Este Debian no será aún tu espacio de trabajo del curso: servirá para comprobar qué ocurre al salir de un proceso interactivo.
docker run -it --name p00-debian-temporal debian:trixie-slim bash-imantiene abierta la entrada estándar para que puedas escribir.-tcrea una terminal.-itreúne las dos opciones para que puedas trabajar en Bash dentro del contenedor.debian:trixie-slimes la imagen oficial ligera de Debian 13 que servirá de base para el contenedor persistente del curso.
Entorno: ya estás dentro de Debian. Antes de ejecutar las órdenes, predice dónde quedará mensaje.txt después de salir.
pwdwhoamiprintf '%s\n' 'Hola desde Debian temporal.' > mensaje.txtcat mensaje.txtexitDe vuelta en el anfitrión, consulta el inventario completo:
docker psdocker ps -ap00-debian-temporal debe aparecer detenido. El fichero sigue dentro de ese contenedor mientras exista, pero no está en una carpeta compartida ni será parte del trabajo del curso. Elimínalo ahora junto con p00-hola, después de verificar ambos nombres:
docker rm p00-hola p00-debian-temporaldocker ps -aActividad 5 · Crear el entorno persistente del curso
Section titled “Actividad 5 · Crear el entorno persistente del curso”Hasta ahora los contenedores eran temporales. Ahora crearás el único contenedor que reutilizarás durante P00: p00-lab.
p00-lab será un contenedor Debian 13 creado directamente desde la imagen oficial debian:trixie-slim. Empezarás ahora a instalar dentro de él las herramientas necesarias y registrarás los cambios durante el curso. Por ahora no crearás una imagen propia ni usarás un Dockerfile.
debian:trixie-slim → contenedor persistente p00-lab → herramientas instaladas durante el cursoTrabajarás en una carpeta llamada optativa-nube dentro de tu carpeta personal. Si prefieres tenerla visible en el Escritorio, crea allí la misma carpeta y usa la orden alternativa. Esa carpeta guarda repositorios, evidencias y la web; Docker la mostrará dentro del contenedor como /optativa-nube.
mkdir -p "$HOME/optativa-nube"docker run -it --name p00-lab -v "$HOME/optativa-nube:/optativa-nube" debian:trixie-slim bashWindows PowerShell
Section titled “Windows PowerShell”New-Item -ItemType Directory -Force "$HOME\optativa-nube"docker run -it --name p00-lab -v "${HOME}\optativa-nube:/optativa-nube" debian:trixie-slim bashPara usar el Escritorio, cambia solo optativa-nube por Desktop/optativa-nube en Linux o por Desktop\optativa-nube en PowerShell.
-imantiene abierta la entrada estándar para que puedas escribir.-tcrea una terminal.-itreúne las dos opciones para que puedas trabajar en Bash dentro dep00-lab.--name p00-labasigna el nombre que reutilizarás durante el curso.-vconecta tu carpetaoptativa-nube/con/optativa-nube.debian:trixie-slimidentifica la imagen oficial ligera de Debian 13 desde la que se crea este contenedor.
La imagen oficial abre la primera terminal como root, el usuario administrador del contenedor. Es normal en una imagen Debian mínima: no es el sistema anfitrión y sus privilegios se limitan a p00-lab. Compruébalo con whoami. En este bloque instalarás las primeras herramientas de trabajo; más adelante crearás un usuario de trabajo sin privilegios para el uso cotidiano. No uses esta cuenta para crear archivos fuera de /optativa-nube ni copies contraseñas, claves o credenciales al contenedor.
Cambio dentro de p00-lab: actualiza el índice de paquetes e instala las herramientas que utilizarás al inicio del curso:
apt-get updateapt-get install --yes --no-install-recommends git ca-certificates procps sudogit --versionps-
apt-get updateactualiza la lista de paquetes disponibles. -
El indicador
--yesconfirma la instalación. -
--no-install-recommendsevita instalar complementos no necesarios. -
gitpermite guardar una historia local de los cambios del proyecto y revisar qué archivos vas a entregar. -
ca-certificatesinstala las autoridades de certificación que permiten a programas como Git comprobar de forma segura conexiones HTTPS. -
procpsincorpora, entre otras utilidades,ps, que usarás para consultar los procesos en ejecución. -
sudopermite que un usuario sin privilegios ejecute puntualmente una orden administrativa autorizada. En esta primera sesión todavía eresroot, pero será necesario cuando se cree el usuario de trabajo.
La carpeta local optativa-nube se monta directamente como /optativa-nube, una carpeta situada bajo la raíz del contenedor. En Linux, sus permisos son los de la carpeta creada en el anfitrión. En Windows, Docker Desktop gestiona ese acceso a las carpetas compartidas. La actividad siguiente comprueba el montaje en los dos sentidos. Si aparece Permission denied, no uses sudo: guarda el mensaje y revisa el montaje antes de continuar.
Comprobar que los archivos sobreviven en ambos sentidos
Section titled “Comprobar que los archivos sobreviven en ambos sentidos”Primero estás dentro de p00-lab. Crea un archivo en la ruta montada, léelo y sal del contenedor:
mkdir -p /optativa-nube/p00-puesto-nube/evidenciasprintf '%s\n' 'Creado dentro de p00-lab.' > /optativa-nube/p00-puesto-nube/evidencias/desde-contenedor.txtcat /optativa-nube/p00-puesto-nube/evidencias/desde-contenedor.txtexitexit detiene p00-lab, pero no lo elimina. Ahora estás de nuevo en el anfitrión. El archivo debe estar en la carpeta local que montaste al crear el contenedor.
Comprobar el archivo desde el anfitrión
Section titled “Comprobar el archivo desde el anfitrión”Usa el bloque correspondiente a tu sistema operativo:
cat "$HOME/optativa-nube/p00-puesto-nube/evidencias/desde-contenedor.txt"printf '%s\n' 'Creado desde el anfitrión.' > "$HOME/optativa-nube/p00-puesto-nube/evidencias/desde-anfitrion.txt"cat "$HOME/optativa-nube/p00-puesto-nube/evidencias/desde-anfitrion.txt"Windows PowerShell
Section titled “Windows PowerShell”Get-Content "$HOME\optativa-nube\p00-puesto-nube\evidencias\desde-contenedor.txt"Set-Content -Path "$HOME\optativa-nube\p00-puesto-nube\evidencias\desde-anfitrion.txt" -Value "Creado desde el anfitrión."Get-Content "$HOME\optativa-nube\p00-puesto-nube\evidencias\desde-anfitrion.txt"El primer comando de cada bloque demuestra que el archivo creado dentro de Debian está realmente en tu equipo. El segundo crea otro archivo desde el anfitrión y el tercero lo comprueba antes de continuar.
Volver a entrar y comprobar el archivo del anfitrión
Section titled “Volver a entrar y comprobar el archivo del anfitrión”p00-lab debe seguir detenido, no eliminado. Inicia exactamente el mismo contenedor y comprueba los dos archivos desde dentro:
docker ps -adocker start -ai p00-labcat /optativa-nube/p00-puesto-nube/evidencias/desde-contenedor.txtcat /optativa-nube/p00-puesto-nube/evidencias/desde-anfitrion.txtexit-aconecta la salida estándar y los mensajes de error del contenedor con tu terminal. Así puedes ver el prompt, los textos decaty los mensajes que produzca Bash.-imantiene abierta la entrada estándar para que puedas escribir.-aireúne ambas opciones: vuelves a entrar en el mismop00-labsin crear otro contenedor.
Por ejemplo, si ejecutas desde el anfitrión docker start p00-lab, Docker inicia el contenedor y devuelve enseguida el nombre p00-lab, pero no ves su prompt ni puedes trabajar dentro. En cambio, docker start -ai p00-lab conecta tu terminal con Bash: ves algo parecido a root@…:/#, puedes ejecutar cat y lees su resultado en la misma ventana. -a permite ver; -i permite escribir.
Si aparecen ambos textos, has comprobado el montaje en ambos sentidos: un cambio realizado dentro del contenedor se ve en tu equipo y un cambio realizado en tu equipo se ve dentro del contenedor. A partir del siguiente bloque entrarás con docker start -ai p00-lab; no vuelvas a ejecutar docker run para crear otro contenedor con ese nombre.
Cerrar Docker Desktop y recuperar el entorno
Section titled “Cerrar Docker Desktop y recuperar el entorno”Tras el último exit, comprueba desde el anfitrión que no queda ningún contenedor en marcha:
docker psdocker ps -adocker ps no debe mostrar contenedores activos y docker ps -a debe mostrar p00-lab con estado Exited. Cierra Docker Desktop mediante Quit Docker Desktop o Salir de Docker Desktop. Al cerrarlo, el motor se apaga y cualquier contenedor que siguiera activo se detendría.
En la siguiente sesión, abre Docker Desktop y espera a que docker version muestre información tanto de Client como de Server. Después recupera el mismo entorno:
docker start -ai p00-labcat /optativa-nube/p00-puesto-nube/evidencias/desde-contenedor.txtcat /optativa-nube/p00-puesto-nube/evidencias/desde-anfitrion.txtLos dos archivos permanecen porque están en tu carpeta local optativa-nube, no dentro del sistema de archivos interno de Docker. El contenedor p00-lab también seguirá disponible mientras no desinstales, restablezcas o elimines los datos de Docker Desktop.
Crear el usuario de trabajo
Section titled “Crear el usuario de trabajo”Sigues dentro de p00-lab como root. Crea ahora el usuario ordinario alumno, que utilizarás desde el bloque siguiente. Los identificadores 1000 permiten que, en un anfitrión Linux habitual, alumno pueda trabajar con los archivos de la carpeta compartida creada por tu usuario:
groupadd --gid 1000 alumnouseradd --uid 1000 --gid 1000 --create-home --shell /bin/bash alumnoprintf '%s\n' 'alumno ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/alumnochmod 440 /etc/sudoers.d/alumno# Solo si tu anfitrión es Linux:chown -R alumno:alumno /optativa-nube/p00-puesto-nubesu - alumnowhoamipwdexitexitgroupadd crea el grupo y useradd crea la cuenta con su carpeta personal /home/alumno. El archivo de sudoers permite que alumno use sudo solo dentro de su propio contenedor y sin una contraseña que no existe. Si tu anfitrión es Linux, chown deja la carpeta compartida a nombre de alumno; no ejecutes esa línea si trabajas con Windows. su - alumno abre una sesión como ese usuario; whoami debe mostrar alumno y pwd, /home/alumno. El primer exit vuelve a root; el segundo detiene p00-lab.
Como el contenedor se creó inicialmente desde la imagen oficial, docker start -ai p00-lab abrirá primero Bash como root. A partir de P00/02 ejecutarás después su - alumno para pasar a tu usuario de trabajo.
Cierre individual
Section titled “Cierre individual”Completa la tabla de observación y responde en dos o tres frases. En Dónde lo has visto, escribe la orden con la que localizaste el recurso (por ejemplo, docker ps o docker ps -a). En Estado, anota si estaba en marcha, detenido o ya eliminado. En Dato que lo demuestra, copia un dato concreto de la salida: el nombre, Up, Exited o que no aparecía en el inventario.
| Recurso observado | Dónde lo has visto (orden) | Estado observado | Dato concreto que lo demuestra |
|---|---|---|---|
| Contenedor sin nombre | |||
p00-hola |
|||
p00-excalidraw |
|||
p00-debian-temporal |
|||
p00-lab |
- ¿Qué diferencia observaste entre
p00-holayp00-excalidraw? - ¿Por qué el fichero de Debian temporal no era todavía una evidencia del curso?
- ¿Qué dos archivos demuestran que el montaje funciona en ambos sentidos?
- ¿Qué estado debe mostrar
p00-labantes de cerrar Docker Desktop y qué debes comprobar al volver a abrirlo?