Introducción
Tu equipo tiene una pequeña aplicación HTTP lista para entregar. Empaqueta el código suministrado como una imagen de contenedor, guárdala en Amazon Elastic Container Registry (ECR) y demuestra que esa versión exacta puede arrancar y responder a una petición. Conserva el repositorio de referencia y elimina los recursos que crees.
Completa primero AWS Foundations y los conceptos básicos de políticas de identidad de IAM. Aquí se presentan los conceptos de Docker; no necesitas escribir la aplicación ni disponer de una cuenta personal de AWS. Esta VM independiente incluye AWS CLI configurada, Docker, un Dockerfile y el código. Usa AWS View, arriba, para observar los repositorios y probar la aplicación, y Terminal, abajo, para los comandos. Ambos leen el mismo estado de los recursos.
Relación con la certificación
| Certificación | Tarea del examen | Práctica |
|---|---|---|
| Developer – Associate (DVA-C02) | Tarea 3.1, habilidad 3.1.1 | Empaquetar el código y el entorno de ejecución de una aplicación en una imagen de contenedor para su despliegue. |
Vista general del laboratorio

Crear un repositorio de imágenes inmutable
En este paso, crea el repositorio que almacenará la versión de tu aplicación.
Una imagen empaqueta los archivos y el entorno de ejecución. Un contenedor es una instancia en ejecución de una imagen. Un registro almacena y distribuye imágenes; un repositorio ECR agrupa las de una aplicación. Almacenar una imagen no inicia la aplicación.
Ve al directorio preparado e inspecciona el Dockerfile. cat muestra un archivo de texto:
cd /home/labex/project
cat application/Dockerfile
FROM elige la imagen base de Python; COPY añade el código, USER selecciona un usuario sin privilegios y CMD define el comando de inicio. La referencia base sha256 fija el contenido de esa imagen, no el de tu nueva imagen.
Crea ct-demo. Una etiqueta es un nombre legible, como release-1. IMMUTABLE impide reemplazar una etiqueta existente por contenido diferente y mantiene fiables los nombres de las versiones:
aws ecr create-repository \
--repository-name ct-demo \
--image-tag-mutability IMMUTABLE
La respuesta incluye repositoryUri, la dirección que usa Docker, e imageTagMutability: IMMUTABLE. Guarda la URI en una variable de shell. $(...) captura la salida; --query selecciona un campo y --output text elimina las comillas JSON:
REPOSITORY_URI=$(aws ecr describe-repositories \
--repository-names ct-demo \
--query 'repositories[0].repositoryUri' \
--output text)
echo "$REPOSITORY_URI"
Mantén abierta esta sesión de Terminal para conservar las variables. En AWS View, arriba, debe aparecer ct-demo con cero imágenes junto a ct-reference. El repositorio de referencia pertenece a otra aplicación y queda fuera de tu limpieza.
Construir y publicar la versión
En este paso, construye la aplicación suministrada y publica su imagen en ECR.
Docker necesita iniciar sesión en el registro antes de publicar. La dirección del registro es la parte de la URI anterior a la primera barra. ${REPOSITORY_URI%%/*} elimina esa barra y todo lo que sigue:
REGISTRY=${REPOSITORY_URI%%/*}
echo "$REGISTRY"
Solicita a AWS CLI una contraseña temporal de ECR y pásala directamente a Docker. La tubería | conecta la salida de un comando con el siguiente; --password-stdin evita mostrar la contraseña o incluirla en los argumentos. No la imprimas ni la guardes por tu cuenta:
aws ecr get-login-password | docker login \
--username AWS \
--password-stdin "$REGISTRY"
Docker muestra Login Succeeded. Esto permite las operaciones autorizadas para tu identidad, no el acceso a todos los repositorios.
Construye desde application. -t asigna la URI y la etiqueta de versión. El argumento final es el contexto de construcción, el directorio cuyos archivos puede utilizar COPY:
docker build -t "${REPOSITORY_URI}:release-1" application
Publica la imagen. Docker sube las capas del sistema de archivos y el manifest que describe su contenido:
docker push "${REPOSITORY_URI}:release-1"
Al finalizar, Docker muestra un digest sha256:.... Un digest identifica contenido exacto; una etiqueta es un nombre. Incluso si un repositorio permite cambiar etiquetas, el digest permanece ligado al contenido original.
Consulta ECR para confirmar la versión almacenada:
aws ecr describe-images \
--repository-name ct-demo \
--image-ids imageTag=release-1 \
--query 'imageDetails[0].{Tags:imageTags,Digest:imageDigest}'
Guarda también su digest en una variable:
IMAGE_DIGEST=$(aws ecr describe-images \
--repository-name ct-demo \
--image-ids imageTag=release-1 \
--query 'imageDetails[0].imageDigest' \
--output text)
El digest de ECR debe coincidir con el mostrado por docker push. En AWS View, arriba, ct-demo debe contener release-1 y su digest. La aplicación todavía no está ejecutándose; la iniciarás en el siguiente paso.
Ejecutar la imagen exacta publicada
En este paso, recupera la imagen por digest y prueba un contenedor real.
Primero elimina la imagen construida localmente. docker image rm elimina una referencia local, no la imagen guardada en ECR. Así la siguiente descarga recuperará la versión publicada:
docker image rm "${REPOSITORY_URI}:release-1"
Combina la URI y el digest con @ para seleccionar el contenido exacto:
docker pull "${REPOSITORY_URI}@${IMAGE_DIGEST}"
Docker debe informar del mismo digest y de una descarga correcta. Inícialo como ct01-app. --detach ejecuta en segundo plano y --publish 127.0.0.1:8081:8000 conecta el puerto 8081 del host al 8000 de la aplicación. La dirección de loopback limita el acceso directo a esta VM. La imagen usa un usuario sin privilegios; --read-only hace de solo lectura el sistema de archivos raíz, --cap-drop ALL elimina las capacidades Linux y no-new-privileges impide obtener privilegios adicionales:
docker run --detach \
--name ct01-app \
--read-only \
--cap-drop ALL \
--security-opt no-new-privileges \
--memory 256m \
--publish 127.0.0.1:8081:8000 \
"${REPOSITORY_URI}@${IMAGE_DIGEST}"
El ID del contenedor indica que Docker aceptó la solicitud, pero no demuestra que la aplicación funcione. Prueba HTTP: curl --fail falla ante errores HTTP y --retry-all-errors reintenta los errores de arranque, incluido un breve reinicio de conexión:
curl --fail --silent --show-error \
--retry 5 --retry-all-errors --retry-delay 1 \
http://127.0.0.1:8081/
Espera JSON con "release": "release-1" y el hostname del contenedor. Consulta sus registros para confirmar la petición real:
docker logs ct01-app
Debe aparecer served application request; hostname y marcas de tiempo varían. En AWS View, arriba, pulsa Request application. La respuesta también debe indicar release-1: el botón realiza una petición HTTP al contenedor real.

Eliminar tus recursos
En este paso, detén la aplicación y elimina su imagen local y su repositorio ECR, conservando el repositorio de referencia.
Detén primero el contenedor:
docker stop ct01-app
Después elimínalo. Eliminar un contenedor no elimina su imagen:
docker rm ct01-app
Sin contenedores en ejecución que la utilicen, elimina la referencia local por digest:
docker image rm "${REPOSITORY_URI}@${IMAGE_DIGEST}"
Elimina la imagen de ECR por digest. imageDigest selecciona el contenido exacto sin depender de una etiqueta:
aws ecr batch-delete-image \
--repository-name ct-demo \
--image-ids imageDigest="$IMAGE_DIGEST"
La respuesta debe incluir la imagen eliminada en imageIds y una lista failures vacía. Elimina el repositorio de la aplicación, que ahora está vacío:
aws ecr delete-repository --repository-name ct-demo
Comprueba que el repositorio de referencia sigue presente:
aws ecr describe-repositories \
--query 'repositories[].repositoryName'
Espera únicamente ct-reference. Por último, elimina el inicio de sesión del registro guardado por Docker:
docker logout "$REGISTRY"
En AWS View, arriba, deben desaparecer ct-demo y el contenedor; el repositorio de referencia permanece. Un error HTTP no demostraría por sí solo la limpieza: también has comprobado el inventario y eliminado el contenedor y la imagen reales.
Resumen
Has creado un repositorio ECR inmutable, construido y publicado una imagen, comprobado su digest y ejecutado exactamente esa versión. Has probado HTTP y los registros reales y eliminado tu contenedor, imagen local y repositorio, conservando los de otra aplicación. El siguiente laboratorio usa una definición de tarea ECS para seleccionar y ejecutar una imagen.
Para ampliar este tema, consulta la referencia de AWS: Autenticación del registro y envío de imágenes; Evitar la sobrescritura de etiquetas de imágenes.



