DEV Community

Cover image for Docker 🐳, AWS Elastic Container Registry (ECR)
Rossana Suarez #RoxsRoss for AWS Community Builders

Posted on • Updated on

Docker 🐳, AWS Elastic Container Registry (ECR)

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.

deed-dive-containers

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
Enter fullscreen mode Exit fullscreen mode

Conozcamos algunos de los componentes dentro del archivo Dockerfile.

2

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 .
Enter fullscreen mode Exit fullscreen mode

2

Si ejecutamos docker images , deberíamos poder identificar nuestra imagen recién creada.

Image description

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>
Enter fullscreen mode Exit fullscreen mode

-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.

Image description

Resultados 🔥🔥🔥🔥:

Pueden ejecutar htttp://localhost:8080 en su navegador

localhost:8080

Image description

Con un curl localhost para probar que podemos acceder a Internet.

Image description

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

2

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

2

Algunos comandos

Image description

*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

2

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

2

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>
Enter fullscreen mode Exit fullscreen mode

2

Desde Docker-hub

1

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>
Enter fullscreen mode Exit fullscreen mode

Nota: Puede eliminar un contenedor mientras se ejecuta, pero debe usar la -f para forzarlo.

Image description

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

Top comments (0)