En este laboratorio trabajará con una aplicación web empaquetada como imagen Docker y recorrerá el ciclo de vida de un contenedor desde su creación hasta su eliminación.
La aplicación utilizada es Grocery List App, una aplicación para gestionar listas de compras disponible en Docker Hub. A partir de ella podrá relacionar los comandos fundamentales de Docker con los cambios que producen sobre una imagen, un contenedor en ejecución y los recursos del sistema.
Antes de descargar la aplicación, observe el estado inicial de Docker. Estas comprobaciones le permitirán comparar el sistema antes y después de crear el contenedor.
Revise especialmente la columna PORTS para comprobar que ningún contenedor esté utilizando el puerto 8080.
Nota
docker ps permite identificar contenedores administrados por Docker. Si necesita comprobar si otro proceso del sistema utiliza el puerto 8080, puede ejecutar lsof -i :8080.
Una imagen proporciona el sistema de archivos y la configuración base que Docker utilizará para crear un contenedor.
Descargue la imagen de Grocery List App desde Docker Hub.
Ventana de terminal
dockerpulljpadillaa/grocerylistapp:latest
Durante la descarga puede aparecer una salida similar a esta.
latest: Pulling from jpadillaa/grocerylistapp
a2abf6c4d29d: Pull complete
c5608244554d: Pull complete
2a13d2c24a3c: Pull complete
3f4efb95c5e5: Pull complete
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for jpadillaa/grocerylistapp:latest
docker.io/jpadillaa/grocerylistapp:latest
Cada mensaje Pull complete corresponde a una capa de la imagen que Docker necesitó descargar. El uso de capas permite reutilizar contenido compartido entre imágenes y evitar descargas innecesarias cuando una capa ya está disponible localmente.
Publica el puerto 8080 del contenedor mediante el puerto 8080 del sistema anfitrión
--name app
Asigna el nombre app al contenedor
jpadillaa/grocerylistapp:latest
Indica la imagen y el tag utilizados para crear el contenedor
La publicación del puerto establece este recorrido.
Navegador
│
│ http://localhost:8080
▼
Sistema anfitrión
│
│ puerto 8080
▼
Contenedor "app"
│
│ puerto 8080
▼
Grocery List App
La aplicación escucha en el puerto 8080 dentro del contenedor. La opción -p permite acceder a ese servicio mediante el puerto 8080 del sistema anfitrión.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 jpadillaa/grocerylistapp:latest "java -jar /app/app...." 10 seconds ago Up 9 seconds 0.0.0.0:8080->8080/tcp app
Las columnas permiten reconocer información distinta sobre el contenedor.
Columna
Significado
CONTAINER ID
Identificador abreviado
IMAGE
Imagen utilizada para crear el contenedor
COMMAND
Proceso iniciado al ejecutar el contenedor
CREATED
Tiempo transcurrido desde su creación
STATUS
Estado actual
PORTS
Puertos publicados
NAMES
Nombre asignado
El contenedor app debería aparecer con estado Up y una publicación que relacione el puerto 8080 del sistema anfitrión con el puerto 8080 del contenedor.
Realice algunas operaciones para comprobar que la aplicación responde.
Agregue un elemento a la lista, por ejemplo Manzanas.
Agregue un segundo elemento, por ejemplo Leche.
Marque uno de los elementos como completado.
Elimine un elemento.
Estas acciones comprueban algo diferente a docker ps. El comando confirma que el contenedor está en ejecución, mientras que la interacción con la aplicación permite comprobar que el servicio responde a solicitudes.
docker inspect devuelve una representación detallada de la configuración y el estado del contenedor. Cuando solo necesita un dato concreto, puede utilizar una plantilla de formato.
Crear un contenedor no implica que deba permanecer en ejecución de forma permanente. Docker separa la existencia del contenedor de su estado de ejecución.
La imagen y el contenedor son recursos distintos. Una imagen puede utilizarse para crear varios contenedores y puede permanecer disponible después de eliminar cualquiera de ellos.
Del mismo modo, detener un contenedor no equivale a eliminarlo. Mientras exista, puede volver a iniciarse con docker start.
Observe que no fue necesario modificar el puerto utilizado por la aplicación dentro del contenedor. Solo cambió el puerto publicado en el sistema anfitrión.
Este comando actúa sobre todos los contenedores Docker del sistema, no únicamente sobre los creados en este laboratorio. No lo utilice si necesita conservar otros contenedores en ejecución o detenidos.
Docker no permite que dos contenedores existentes tengan el mismo nombre. Si app ya existe, un nuevo docker run --name app ... producirá un conflicto similar al siguiente.
docker: Error response from daemon: Conflict. The container name "/app" is already in use by container "abc123...".
Puede eliminar el contenedor existente con docker rm app cuando corresponda o asignar un nombre diferente al nuevo contenedor.
¿Cuál es la diferencia entre docker stop y docker kill?
Según la explicación del laboratorio original, docker stop solicita una terminación ordenada mediante SIGTERM y, si el proceso no finaliza dentro del tiempo de espera, Docker fuerza su terminación. docker kill fuerza la terminación de forma inmediata.
La diferencia relevante es que docker stop ofrece al proceso la oportunidad de finalizar de manera controlada antes de recurrir a una terminación forzada.
La aplicación escucha en el puerto 8080 dentro del contenedor. La opción -p 8080:8080 publica ese puerto mediante el puerto 8080 del sistema anfitrión y permite acceder a la aplicación desde localhost.
Sin esa publicación, ejecutar el contenedor no hace que el servicio sea accesible automáticamente mediante ese puerto del host.
¿Qué ocurre con los datos almacenados dentro del contenedor cuando se elimina?
Los cambios almacenados únicamente en la capa escribible del contenedor desaparecen al eliminarlo. Cuando una aplicación necesita conservar información más allá del ciclo de vida de un contenedor, debe utilizar un mecanismo de persistencia independiente, como los volúmenes estudiados en el Laboratorio 03.
Después de completar el laboratorio debería poder distinguir con claridad entre una imagen, un contenedor y el estado de ejecución de ese contenedor.
La imagen jpadillaa/grocerylistapp:latest proporciona la base para crear instancias. Cada ejecución de docker run crea un contenedor independiente. Ese contenedor puede estar en ejecución o detenido, puede observarse mediante logs, inspect y stats, y finalmente puede eliminarse sin que eso implique necesariamente eliminar la imagen.
También debería poder interpretar los principales elementos utilizados durante el ejercicio.
Comando
Propósito
docker pull <imagen>
Descarga una imagen desde un registro
docker images
Lista las imágenes almacenadas localmente
docker run ...
Crea y ejecuta un contenedor
docker ps
Lista los contenedores en ejecución
docker ps -a
Lista contenedores en cualquier estado
docker logs <nombre>
Consulta los registros del proceso principal
docker logs -f <nombre>
Sigue nuevos registros en tiempo real
docker stop <nombre>
Detiene un contenedor
docker start <nombre>
Inicia un contenedor detenido
docker restart <nombre>
Reinicia un contenedor
docker rm <nombre>
Elimina un contenedor
docker rmi <imagen>
Elimina una imagen
docker inspect <nombre>
Consulta configuración y estado detallados
docker stats <nombre>
Consulta métricas de consumo de recursos
docker exec -it <nombre> <comando>
Ejecuta un proceso adicional dentro de un contenedor