Docker vs Podman: ¡Todo lo que necesitas saber!
Tags: containerapps, docker, aws, podman
Published: 2023-02-02 20:13:04

Sin lugar a dudas la tecnología de contenedores ha supuesto toda una revolución. Y dentro de los actores que se encuentran presentes en la escena, el que ha destacado desde el principio es Docker 🐳.

## Contenedores

Los contenedores permiten que una aplicación se ejecute de forma consistente y confiable, independientemente del sistema operativo o del ambiente de infraestructura. Los contenedores logran esto agrupando todo lo que un servicio necesita para ejecutarse (el código, el tiempo de ejecución, las herramientas del sistema, las bibliotecas del sistema y la configuración) y crean un paquete portátil, independiente y ejecutable.

## Ventajas de un Contenedor

- Evita fallos
- División de componentes
- Bajo coste
- Agilidad
- Escalabilidad

Los contenedores tienen la característica de servir como base para las aplicaciones nativas de la nube, contribuyendo así a alcanzar un modelo cooperativo entre entornos, tanto de cloud privadas o públicas, como híbridas.

## Herramientas que te permite la Contenerización

### Docker

La idea detrás de Docker es crear contenedores ligeros y portables para las aplicaciones software que puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo que la máquina tenga por debajo, facilitando así también los despliegues.

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

### Podman

Podman es una herramienta nativa para Linux, de código abierto y que no utiliza ningún demonio ni procesos en segundo plano, pensada y diseñada para facilitar la búsqueda, ejecución, construcción, compartición y despliegue de aplicaciones utilizando la tecnología de contenedores e imágenes Open Containers Initiative (OCI).

[Documentación](https://podman.io/)

## Docker vs Podman: ¡Todo lo que necesitas saber!

### ¿Por qué Podman vs Docker?

Si observamos las tendencias de Google, vemos que el interés de búsqueda de Podman está en constante aumento. Es probable que veamos a Podman volverse más popular en los próximos años.

https://trends.google.com/trends/explore?q=Podman

**Docker** sigue siendo un jugador líder en el campo, y no creo que vaya a ninguna parte en el corto plazo, pero los gráficos nos dicen que el interés general en Docker está disminuyendo.

O los desarrolladores están perdiendo interés en Docker o han migrado a otro software que podría hacer su trabajo mejor que Docker.

https://trends.google.com/trends/explore?q=Docker

**Podman** está basado en Docker y fue originalmente concebido como una herramienta de debugging que terminó convirtiéndose en una alternativa o sucesor a las antiguas herramientas de gestión.

Para facilitar la transición de uno a otro, Podman reconoce y permite utilizar los comandos de Docker. Pero esto por sí solo no convierte a Podman en un sucesor equivalente.

### Docker vs Podman | Podman vs Docker. ¿qué los diferencia?

Hay que realizar una comparación directa entre ambos sistemas si queremos poder determinar si triunfa el cuasi-estándar que ha sido popular durante años o el contendiente del duelo Docker vs. Podman

## Ahora vamos para probar Docker y Podman desde AWS EC2

### Empecemos a jugar...

Estaremos usando AWS CloudShell porque puedes ejecutar AWS CLI para trabajar con los servicios de AWS Y puede hacerlo sin necesidad de descargar o instalar herramientas

https://docs.aws.amazon.com/es_es/cloudshell/latest/userguide/welcome.html

_En esta oportunidad vamos a estar instalando terraform para aprovisionar 2 instancias de AWS EC2 una con Docker y otra con Podman_

**Requisitos**:

- Cuenta **AWS**
- Recuerden usar siempre la capa gratuita
- Terraform install
- Credenciales Programáticas **AWS**
- Tfenv
- Ficheros Terraform
- UserData Docker
- UserData Podman 

Todo en el Repositorio: https://gitlab.com/roxsross-public/295devops-practice-tools/-/tree/main/Containerization-Tools

### Pasos

Si bien usas AWS CloudShell o desde tu terminal puedes correr esta excelente utilidad se llama tfenv.

_**¿Porque Tfenv?**_

Cuando trabajas en grandes entornos gestionados con terraform, es muy probable que tengas que trabajar a su vez con diferentes versiones de terraform, según requieran cada unos de los proyectos.

En lugar de descargar las diferentes versiones que necesitemos, renombrando los ejecutables, moviéndolos a algún directorio dentro del PATH y jugando con enlaces simbólicos, podemos símplemente usar el maravilloso tfenv.

[Documentacion TFENV](https://github.com/tfutils/tfenv)

### Ahora si vamos aprovisionar las instancias AWS EC2 con Terraform

**Dentro de los Ficheros Terraform**

Van encontrar un tfvars que nos permite definir la configuración especifica del entorno

Al tener un entorno local para hacer pruebas en Terraform te puedes ayudar de un archivo llamado values.tfvars para hospedar ahí todas las variables que requieres al trabajar.

En el Repositorio encontraran el fichero Value.tfvars.

En ese fichero tienen que reemplazar los siguientes datos a su cuenta en AWS.

```
app                    = "container"
region                 = "us-east-1"
ec2_instance_type      = "t2.micro"
ec2_key_name           = "295" #Reemplazar
ec2_security_group_id  = "sg-04627cd5684f351cc" #Reemplazar
ec2_ami                = "ami-06878d265978313ca"
```

Luego realizaron el cambio solo deben inicializar el directorio de terraform:

Inicializar: `terraform init`

Validar Terraform: `terraform validate`

Plan: `terraform plan –var-file values.tfvars -out plan.out`

Apply: `terraform apply "plan.out"`

El resultado "output" es la siguiente:
```
Docker IP (public):  18.205.243.235
Docker IP (private): 172.31.82.169

For example:
   ssh -i 295.pem ubuntu@18.205.243.235

Podman IP (public):  3.88.169.4
Podman IP (private): 172.31.95.6

For example:
   ssh -i 295.pem ubuntu@3.88.169.4
```

Pueden acceder a las instancias desde cualquier cliente SSH, desde SSM o simplemente nos vamos a la terminal de AWS CloudShell

### Ahora probar ambas herramientas

### Docker

Antes que nada vamos a la documentación para revisar su Docker Cheat Sheet [Documentación](https://dockerlabs.collabnix.com/docker/cheatsheet/)

**Verificar que Docker se este ejecutando.**
`$ docker version`

**Algunos Comandos útiles para Docker**

- Lista de imágenes 
`$ docker image ls`
- Elimina una imagen específica 
`$ docker image rm [nombre de la imagen]`
- Elimina todas las imágenes existentes 
`$ docker image rm $(docker images -a -q)`
- Lista todos los contenedores existentes (en funcionamiento y no en funcionamiento) 
`$ docker ps -a`
- Detener un contenedor específico 
`$ docker stop [nombre del contenedor]`
- Detener todos los contenedores en funcionamiento 
`$ docker stop $(docker ps -a -q)`
- Elimina un contenedor específico (solo si está detenido) 
`$ docker rm [nombre del contenedor]`
- Elimina todos los contenedores (solo si están detenidos) 
`$ docker rm $(docker ps -a -q)`
- Mostrar los registros de un contenedor 
`$ docker logs [nombre del contenedor]`

#### Crear el archivo Dockerfile

Dockerfile [Docker](https://gitlab.com/roxsross-public/295devops-practice-tools/-/blob/main/Containerization-Tools/nginx-image/docker/Dockerfile)

#### Construye
 
`docker build -t nginx_web:docker-1.0.0 .`

Corre la imagen, una vez la imagen esté creada, tu código está listo para lanzar.

`$ docker run -d -p 8080:80 nginx_web:docker-1.0.0`

### Podman

Antes que nada vamos a la documentacion para revisar su Podman [Cheat Sheet](https://developers.redhat.com/cheat-sheets/podman-cheat-sheet) 

**Revisamos la Version:**
```
ubuntu@ip-172-31-95-6:~$ podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.17.3
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64
```

_Si queremos conocer los comando podman, apuntemos a la ayuda._

`podman -help`

**Listado "Resumen"**
```
Available Commands:
  build       Build an image using instructions from Containerfiles
  cp          Copy files/folders between a container and the local 
  help        Help about any command
  image       Manage images
  images      List images in local storage
  inspect     Display the configuration of object denoted by ID
  network     Manage networks
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image from a registry
  push        Push an image to a specified destination
  rm          Remove one or more containers
  rmi         Removes one or more images from local storage
  run         Run a command in a new container
  search      Search registry for image
  start       Start one or more containers
  stop        Stop one or more containers
  version     Display the Podman version information
  volume      Manage volumes
```

Podemos especificar el registry si queremos buscarlo en docker-hub docker.io

Si usas el comando podman search te permite buscar imágenes en uno o varios registros. Puedes especificar en que registro quieres buscar alñadiendo el registro en el término de búsqueda. Por defecto, buscará en los registros que se encuentrend definidos en /etc/containers/registries.conf. En mi caso, por ejemplo, el contenido de este archivo es.
```
[registries.search]
registries = ['docker.io', 'quay.io']
```
Un pequeño flujo usando la imagen de apache:
```
podman pull docker.io/library/httpd
podman run -dt --name apache-web -p 8080:80 docker.io/library/httpd 
podman ps
podman rm apache-web
```
Y si queremos contruir nuestras imagenes usando el build si contamos con el Dockerfile en el directorio de trabajo pueden construir sin problemas.

Dockerfile [Podman](https://gitlab.com/roxsross-public/295devops-practice-tools/-/blob/main/Containerization-Tools/nginx-image/podman/Dockerfile)

`podman build -t nginx_web:podman-1.0.0 .`

Salida:
```
ubuntu@ip-172-31-95-6:~/$ podman images
REPOSITORY               TAG            IMAGE ID      CREATED        SIZE
localhost/nginx_web      podman-1.0.0   f43bf88b8923  2 minutes ago  101 MB
```
Ahora vamos a ejecutarlo

`podman run -d 8080:80 nginx_web:podman-1.0.0`
```
ubuntu@ip-172-31-95-6:~/$ podman ps
CONTAINER ID  IMAGE                             COMMAND               CREATED         STATUS             PORTS                   NAMES
3e419ed245a9  localhost/nginx_web:podman-1.0.0  sh -c date ; npm ...  5 seconds ago   Up 6 seconds ago   0.0.0.0:8080->80/tcp  dazzling_ganguly
```

## Para resumir

Desde mi punto de vista, especialmente en cuanto a la seguridad; mientras Docker lleva mucho tiempo intentando ponerse al día en este aspecto, estas deficiencias se han subsanado desde el principio con Podman.

La ausencia de un daemon centralizado y la mejor protección resultante de ello podrían convencer tarde o temprano.

Pero sin embargo, ni siquiera Podman se libra de tener errores; todavía necesita resolver algunos problemas. Si se resuelven estos pequeños problemas con éxito, Podman ganará a Docker por un margen estrecho.

> Ahora les pregunto…. ¿Puede Podman verdaderamente sustituir a Docker?

VIDEO