# DOCKER: Ciclo de vida de las aplicaciones

*El ciclo de vida de aplicaciones en contenedor es una trayectoria que empieza por el desarrollador. El desarrollador decide implementar contenedores y Docker, ya que así se eliminan las fricciones en las implementaciones y las operaciones de TI, lo que, en última instancia, ayuda a todos los usuarios a ser más ágiles, más productivos de un extremo a otro y más rápidos.*

**Un desafío común para los DevOps** es administrar las dependencias de una aplicación y el stack de tecnología en varios entornos cloud y desarrollo. Como parte de sus tareas rutinarias, deben mantener la aplicación operativa y estable, independientemente de la plataforma subyacente en la que se ejecute.

**Docker** permite la eficiencia y reduce los gastos generales operativos para que cualquier desarrollador, en cualquier entorno de desarrollo, pueda crear aplicaciones estables y confiables. Docker brinda la capacidad de empaquetar y ejecutar una aplicación en un entorno vagamente aislado llamado contenedor. El aislamiento y la seguridad le permiten ejecutar muchos contenedores simultáneamente en un host determinado. Puede compartir contenedores fácilmente mientras trabaja y asegurarse de que todas las personas con las que comparte obtengan el mismo contenedor que funciona de la misma manera.

[Documentación Docker](https://docs.docker.com/)

## Ciclo de vida de las aplicaciónes

El ciclo de vida de una aplicación docker lo podría definir en 6 pasos:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1685221896343/dd4d26f6-8697-4b29-af0b-b89873a34533.jpeg align="center")

### <mark>Docker te permite construir, distribuir y ejecutar cualquier aplicación en cualquier lado.</mark>

[Documentacion oficial Docker](https://docs.docker.com/)

<mark>Nos enfocamos en la Documentación oficial </mark> [<mark>https://docs.docker.com/get-started/overview/</mark>](https://docs.docker.com/get-started/overview/) <mark>para armar el ciclo de vida.</mark>

### DEMO: Despliegue de páginas html con docker

#### <mark>Paso 1: Desarrollo de la aplicación</mark>

En este ejemplo vamos a desarrollar una página web en el que estaremos usando un servidor web \[Nginx\] que se ejecutará en un contenedor Docker.

Por lo tanto lo primero que debemos hacer es crear nuestra página web , en este caso esto usando un template de **w3schools**

%[https://gist.github.com/roxsross/fc3754d3508a83445998b0eab8102ef7] 

#### <mark>Paso 2: Contrucción de la Imagen Docker</mark>

Utilizando un archivo Dockerfile definimos instrucciones de como vamos a crear nuestra imagen:

* Qué imagen base vamos a utilizar.
    
* Qué dependencias/paquetes vamos a instalar
    
* Donde copiamos nuestro código fuente
    
* Indicamos el servicio que va a ejecutar el contenedor (servidor nginx)
    

[Dockerfile reference](https://docs.docker.com/engine/reference/builder/)

Dockerfile:

> Un Dockerfile es un archivo o documento de texto simple que incluye una serie de instrucciones que se necesitan ejecutar de manera consecutiva para cumplir con los procesos necesarios para la creación de una nueva imagen.

```dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html
```

Creamos nuestra imagen, donde tenemos el Dockerfile, ejecutamos:

> Para el funcionamiento de Dockerfile se debe tener en cuenta también el llamado contexto docker build context, es decir, la herramienta que se encarga de indicar cuáles son los archivos, directorios y ficheros a los que tiene acceso la opción de docker build.

```powershell
$ docker build -t roxsross12/nginx-web:1.0.0 .
```

Podemos comprobar que en nuestro entorno local tenemos la imagen que acabamos de crear:

```plaintext
docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
roxsross12/nginx-web   1.0.0     56b61c567ac4   51 seconds ago   41.4MB
```

#### Paso 3: Testeamos nuestra aplicación en el entorno local/desarrollo/develop

Creamos un contenedor onfire:

```plaintext
> docker run --name demo-nginx-web -d -p 80:80 roxsross12/nginx-web:1.0.0
a6fa5bd776848fe53d829c6f35b61ed16aef5316abf97f6cdf80b5119e605a17
> docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                NAMES
a6fa5bd77684   roxsross12/nginx-web:1.0.0   "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp   demo-nginx-web
```

Probamos nuestra aplicación:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1685224837594/668b8d24-35ea-46d1-b8e8-51885dfb2868.png align="center")

#### Paso 4: Distribuir nuestra imagen \[Registry - Dockerhub\]

> 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.
> 
> Docker Hub cuenta, además, con una amplia variedad de fuentes para sus imágenes, dentro de las que se incluyen grandes proveedores de software independientes, algunos proyectos de tipo open source que tienen el objetivo de desarrollar y distribuir su código en contenedores para estos repositorios y la comunidad de desarrolladores.

DockerHub- [https://hub.docker.com/](https://hub.docker.com/)

```plaintext
> docker login
Authenticating with existing credentials...
Login Succeeded
> docker push roxsross12/nginx-web:1.0.0
The push refers to repository [docker.io/roxsross12/nginx-web]
f32a27cb18e2: Pushed 
sha256:6a6a5a0461433928d914a304df57fc7ce161ef7e3fa4735babc1c38f0d667261 size: 1990
```

Podemos comprobar si esta subido al **repositorio \[Registry Docker-hub\]**

```plaintext
> docker search roxsross12/nginx-web
NAME                   DESCRIPTION   STARS     OFFICIAL   AUTOMATED
roxsross12/nginx-web
```

#### Paso 5: Llevar a prod

En el el entorno de producción, bajamos la imagen de Docker Hub y creamos el contenedor:

```plaintext
> docker pull roxsross12/nginx-web:1.0.0
9a029d5ca5bb: Pull complete 

> docker run --name demo-nginx-web-prod -d -p 80:80 roxsross12/nginx-web:1.0.0
```

> Es una buena practica no usar la etiqueta latest en producción

**Usar adecuadamente los tags de la imagen**

**Las imagenes de Docker** se identifican de dos maneras: el nombre y el tag. El formato que sigue es el siguiente: nginx:1.17.5 donde “nginx” es el nombre y “1.17.5” el tag.

**En Docker es común aprovechar los tags para versionar.** De este modo, se facilita la liberación de código. Es, además, un método muy flexible, puesto que podemos utilizar las tags para obtener variantes muy diversas, no sólo indicando incrementalmente y con una política adecuada nuestra versión (esto en sí mismo es una buena practica.

![docker Memes & GIFs - Imgflip](https://i.imgflip.com/5y5gh0.jpg align="left")

### Paso 6: Nueva Versión de la aplicación

Al modificar el código de la aplicación tenemos que generar una nueva imagen.

```plaintext
$ docker build -t roxsross12/nginx-web:1.0.1 .
```

Podemos de la misma manera probar la nueva version

```plaintext
docker rm -f demo-nginx-web
> docker run --name demo-nginx-web2 -d -p 80:80 roxsross12/nginx-web:1.0.1
```

---

Puedes contactarme en https://roxs.295devops.com
