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.
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).
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
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
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:
Cuenta AWS
Recuerden usar siempre la capa gratuita
Terraform install
Credenciales Programaticas AWS
Tfenv
install-tf-cloudshell.sh
Ficheros Terraform
UserData Docker Script Docker
UserData Podman Script Podman
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.
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.
ami: ami-06878d265978313ca #ubuntu
security-group: Documentación https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html
Opcional https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html
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]
- Crear el archivo Dockerfile
Dockerfile Docker
- 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
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.