Docker vs Podman: ¡Todo lo que necesitas saber!

Docker vs Podman: ¡Todo lo que necesitas saber!

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

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

Docker vs Podman: ¡Todo lo que necesitas saber!

¿Por qué Podman vs Docker?

Si observamos las tendencias de Google, vemos que existe el interés de búsqueda de Podman está en constante aumento. https://trends.google.com/trends/explore?q=Podman

En Cambio Docker sigue siendo un Messi en el campo, y no creo que vaya a ninguna parte en el corto plazo. https://trends.google.com/trends/explore?q=Docker

Messi: La trama detrás del liderazgo - Forbes Argentina

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

Fuente: https://cduser.com/instalando-y-jugando-con-una-alternativa-a-docker-podman/

En Docker, cada contenedor está atachado al proceso madre, que es el motor y que el mismo está atachado a systemd. Podman, en cambio, cada contenedor, es un proceso individual y no depende de un proceso madre, esto lo hace, de alguna manera un poco más robusto ya que nuestro contenedor no depende de otro proceso y su salud.

Fuente: https://cduser.com/instalando-y-jugando-con-una-alternativa-a-docker-podman/

Podman es que tiene menos componentes que Docker para hacer prácticamente lo mismo.

Hands on

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

AWS CloudShell Documentación: https://docs.aws.amazon.com/es_es/cloudshell/latest/userguide/welcome.html

En esta oportunidad vamos a estar instalando terraform para aprovisionar instancias de AWS EC2 una con Docker y otra con Podman

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

Requisitos:

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

Ahora si vamos aprovisionar las instancias AWS EC2 con Terraform

Dentro de los Ficheros Terraform

Van encontrar un tfvars que nos permite definir la configuracion 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.

Value.tfvars Terraform

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 de realizar 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"

Luego del aprovionamiento la salida 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 documentacion para revisar su Docker Cheat Sheet Documentación

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]

  1. Crear el archivo Dockerfile

Dockerfile Docker

  1. Construye

docker build -t nginx_web:docker-1.0.0 .

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

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
ubuntu@ip-172-31-95-6:~$

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

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?