Docker 🐳, AWS Elastic Container Registry (ECR)
Rossana Suarez #RoxsRoss
Posted on February 2, 2023
Si es nuevo en Containers, esto es para tí
1. ¿Qué es un contenedor?
Un contenedor pude definirse como un tipo de máquina virtual ligera o paquete de software estándar que se encarga de las labores de virtualización de las diferentes aplicaciones en lugar de máquinas completas.
Esto lo consigue agrupando una aplicación e incluyendo todos los archivos que se necesiten para funcionar en un entorno de ejecución, como, por ejemplo, el código de la app con sus bibliotecas y archivos de configuración que se encuentren asociados, así como las dependencias que permiten la ejecución de la aplicación.
Un contenedor se establece en el sistema como una sola unidad, por lo que tiene mucha mayor facilidad para desplazarse y ser ejecutado en cualquier sistema operativo, sin importar el contexto. Además, esta tecnología contribuye a que los desarrolladores tengan la capacidad de implementar una gran variedad de aplicaciones sin presentar problemas en todos los entornos.
2. Ventajas de un contenedor
- Evita fallos
Los usuarios evitan fallos como los bloqueos producto a los entornos incompatibles, lo que permite que el sistema obtenga un rendimiento uniforme para todos los equipos.
- División de componentes
Otra de las ventajas de estos elementos es que, sin un sistema operativo, tiene la posibilidad de proporcionar una forma más eficiente para que los desarrolladores puedan desplegarlos en clúster.
- Bajo coste
Los costes de los containers también representan una ventaja para el desarrollador, debido a que consumen pocos gastos generales, lo que permite que los recursos del proyecto tecnológico o compañía puedan destinarse a otros elementos que pueden mejorar el rendimiento y la eficiencia de los procesos del sistema.
- Agilidad
Otra de las principales ventajas del uso de los contenedores es su agilidad, ya que cuando se realizan los procesos de compilación y empaquetado en contenedores y se ejecutan en una plataforma normalizada, el esfuerzo global referente a la implementación de aplicaciones en el sistema se reduce ampliamente. De igual forma, estas acciones contribuyen a optimizar la totalidad de los ciclos de desarrollo y prueba.
- Escalabilidad
La escalabilidad rápida de los contenedores se debe a que estos no tienen la sobrecarga que suelen incluir las máquinas virtuales (VM), así como las instancias de los sistemas operativos independientes y demás.
Picturesocial – Cómo contenerizar una aplicación en menos de 15 minutos
Herramientas:
- Docker Desktop instalado
- AWS CLI: Instalado y Credenciales Configuradas
- Conocimiento básico de la CLI de Linux
- Git/GitHub
- IDE (Visual Studio Code, Sublime txt, etc)
El Desafío:
El Team necesita implementar la contenerización de una aplicación nginx
Pasos:
1. Automatizamos con un Script en bash que permita: Crear una carpeta y en ella crea un fichero index.html y Dockerfile usando como imagen base nginx:alpine
#!/bin/bash
mkdir app
cd app
cat > index.html <<EOF
<style>
body{
background-color: aquamarine;
}
</style>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="site.css" rel="stylesheet" />
</head>
<body>
<h1>I'm inside of a container. Help!</h1>
</body>
</html>
EOF
cat > Dockerfile <<EOF
FROM nginx:alpine
EXPOSE 8080
COPY index.html /usr/share/nginx/html
EOF
Conozcamos algunos de los componentes dentro del archivo Dockerfile.
FROM nos permite especificar a partir de qué imagen base de Docker Hub queremos construir. En nuestro caso, estamos utilizando la última versión de la nginx:alpine oficial.
EXPOSE esto expondrá los puertos en los que escuchará el contenedor.
COPY es bastante sencillo y nos permite copiar archivos o un directorio completo desde un host a un destino. Vamos al COPY archivo index.html a nuestro directorio de trabajo.
- Construcción de nuestra imagen 🔥
Tenemos todo lo que necesitamos para crear construir nuestra aplicación y que luego usaremos para iniciar un contenedor.
Docker intentará encontrar un archivo con el nombre Dockerfile dentro del directorio de trabajo y creará una imagen de Docker usando el Dockerfile.
Puede ser difícil de ver, pero el punto (.) indica que Dockerfile está en el directorio actual. Verá por qué esto es relevante cuando envíe la imagen a un ECR de AWS.
<context_dir> = .
docker build -t <imageName> <context_dir>
#Lo que realmente ejecuté
docker build -t nginx-app:1.0 .
Si ejecutamos docker images
, deberíamos poder identificar nuestra imagen recién creada.
2. Creación del contenedor con el puerto 8080
Ahora que tenemos nuestra imagen, podemos crear un contenedor con el siguiente comando.
docker run -d -p <puerto_host>:<puerto_contenedor > \
--name <nombre_contenedor > \
<nombre_imagen>:<etiqueta>
-d Ejecutará el contenedor en 2do plano e imprimirá la ID del contenedor
-p esta opción establece las asignaciones de puertos entre el host y el contenedor.
Resultados 🔥🔥🔥🔥:
Pueden ejecutar htttp://localhost:8080 en su navegador
localhost:8080
Con un curl localhost para probar que podemos acceder a Internet.
3. Enviar imagen a AWS ECR
Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado por AWS que es seguro, escalable y fiable. Amazon ECR admite repositorios privados con permisos basados en recursos mediante AWS IAM.
Crearemos un repositorio privado para nuestra imagen en AWS ECR
El primer paso será iniciar sesión en la consola de AWS > escribir " ECR " en la barra de búsqueda y seleccionar Comenzar en Crear repositorio.
Hay varias opciones en esta pantalla, como la configuración de visibilidad para hacer que su aplicación sea privada o pública o Habilitar la mutabilidad de etiquetas "tag", lo que evita que las etiquetas de imágenes se sobrescriban con las subsiguientes subidas de imágenes. Lo Recomendable
Una vez creado desde AWS le proporciona los comandos necesarios para enviar su imagen al repositorio. Lo cual lo hace bastante útil ya que la sintaxis no es tan sencilla como crees.
Un requisito previo para este paso es tener la CLI de AWS instalada y las credenciales configuradas; de lo contrario, los comandos no funcionarán
Algunos comandos
*El primer paso es autenticar su Docker Client e iniciar sesión. *
Si esta imagen se creó desde alguna herramienta de cicd como por ejemplo: Jenkins, gitlab-ci, github actions etc , tendría que permitir inicie sesión en el repositorio.
Vamos a autenticarnos
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ACCOUNT_AWS.dkr.ecr.us-east-1.amazonaws.com
Vamos a tagear
NOTA: Cuando copie el comando, no olvide actualizar la etiqueta de nginx-app:latest a nginx-app:1.0
docker tag nginx-app:1.0 ACCOUNT_AWS.dkr.ecr.us-east-1.amazonaws.com/nginx-app:1.0.0
Subir a ECR
El comando push dice Voy a tomar nginx-app:1.0
y enviarlo al repositorio de AWS ECR.
docker push ACCOUNT_AWS.dkr.ecr.us-east-1.amazonaws.com/nginx-app:1.0.0
Subir a Docker-hub
Docker Hub es el repositorio de imágenes para contenedores más grande del sector IT, ya que aloja la mayor cantidad de imágenes oficiales de la plataforma.
Inicie sesión en Docker Hub mediante un comando.
docker login
docker tag <image_id> <repositry>/<image_name>:<tag>
docker push <repositry>/<image_name>:<tag>
Desde Docker-hub
Si terminastes esta prueba, Elimina contenedores e imágenes con los siguientes comandos.
#Debe detener su contenedor antes de poder eliminarlo
docker stop <nombre o ID del contenedor>
#Remove container
docker rm <nombre o ID del contenedor>
#No puede eliminar una imagen si un contenedor se está ejecutando en esa imagen
docker rmi <nombre de la imagen o identificación>
Nota: Puede eliminar un contenedor mientras se ejecuta, pero debe usar la -f para forzarlo.
Demostración: Automaticemos un poco
Documentación
AWS ECR
Docker Build
Docker Doc
Si este contenido te pareció genial, Puedes Contactarme también en Linkedin donde podemos continuar la conversación.
Follow https://github.com/roxsross
Linkedin https://www.linkedin.com/in/roxsross/
Linktree https://roxs.295devops.com
Posted on February 2, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.