Docker 🐳, AWS Elastic Container Registry (ECR)
Tags: aws, awscommunitybuilder, docker, containers
Published: 2023-02-02 19:33:10

_Si es nuevo en Containers, esto es para tí_

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6fu6q1z5xhm5x45garf.png)

### **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](https://aws.amazon.com/es/getting-started/deep-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] (https://aws.amazon.com/es/blogs/aws-spanish/picturesocial-como-contenerizar-una-aplicacion-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.

![2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jcb9d5l6o79xwouaf5it.png)

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

![2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yj8xnpwbebz4rtbgn85j.png)


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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p5ii4xpp1g5wrbl4fqae.png)


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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k34f52g44hpquvw93ojz.png)


### Resultados 🔥🔥🔥🔥:

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

`localhost:8080`

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qfh1mcmzbpatsx877j5.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqm09e0ctqws2uhz0dtn.png)

**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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7cnvv2hw1b8g01saphc.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhxz1rjk4i1zezd12fio.png)

**Algunos comandos**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mz835i5ltvqhvcro6ob4.png)

**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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bnehme8iq284342jy0j.png)

### 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v1tv4hwqyx40l3fq1f8g.png)

### 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>
```

![2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/41d2faxufxh1ey8u3cyt.png)

**Desde Docker-hub**

![1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p6ue3b7pgq3oggtd5f72.png)


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


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u2f9zl6a5erwqn4clhdf.png)

**Demostración: Automaticemos un poco**

{% embed https://youtu.be/Zvef735sgAI %}


**Documentación**
[AWS ECR](https://docs.aws.amazon.com/es_es/AmazonECR/latest/userguide/what-is-ecr.html)
[Docker Build](https://docs.docker.com/engine/reference/builder/)
[Docker Doc](https://docs.docker.com/)

Si este contenido te pareció genial, Puedes Contactarme también en [Linkedin] (https://www.linkedin.com/in/roxsross/) donde podemos continuar la conversación. 

Follow https://github.com/roxsross
Linkedin https://www.linkedin.com/in/roxsross/
Linktree https://roxs.295devops.com