Podman: Una herramienta para administrar Contenedores en Linux

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

Hace tiempo os hablé del funcionamiento de los contenedores en Linux con Dockers. Sin embargo, Docker es una empresa privada, lo que significa que su código no es «opensource».

Para solucionar esta casuística, RedHat creó podman, una herramienta de código abierto para administrar contenedores o PODs en Linux. Podman realiza las mismas funciones que Dockers, por lo que no me extenderé demasiado habiendo escrito ya otro artículo sobre el tema.

En cualquier caso, vamos a echar un vistazo a las características principales con algunos ejemplos:

Instalación de Podman

Con el comando habitual de Linux RedHat 8, dnf, instalaremos podman y luego habilitaremos el servicio:

HP 15s-fq2038ns - Ordenador Portátil de 15.6” FHD (Intel Core i5-1135G7, 8GB RAM, 512GB...
  • Pantalla Full HD de 15.6" (39,6 cm) en diagonal; bisel micro-edge; antirreflectante; 250 nits; 45 % NTSC (1920 x 1080), 60Hz
  • Procesador Intel Core i5-1135G7 (hasta 4,2 GHz con tecnología Intel Turbo Boost, 8 MB de caché L3, 4 núcleos)
  • Memoria RAM DDR4-2666 MHz de 8 GB
[[email protected] ~]# dnf install -y podman

[[email protected] ~]# rpm -qa |grep -i podman
podman-catatonit-3.0.1-7.module_el8.4.0+830+8027e1c4.x86_64
podman-3.0.1-7.module_el8.4.0+830+8027e1c4.x86_64
[[email protected] ~]# systemctl start podman

Acceso al registro de imágenes de contenedores (PODs)

En el fichero /etc/containers/registries.conf tenemos configurados las URLs de acceso a las imágenes de los contenedores pero también podemos crear nuestro propio fichero en $HOME/.config/containers/registries.conf.

Rebajas
HP LaserJet Enterprise MFP M430f 3PZ55A, Impresora Láser Multifunción, Imprime, Escanea,...
  • Imprime a doble cara de forma automática, copia, escanéa y envía por fax documentos con resultados profesionales y homogéneos; la velocidad de...
  • La impresora cuenta con un AAD de 50 hojas, una bandeja de salida de 150 hojas, dos bandejas de entrada, la primera tiene una capacidad de hasta 250 hojas...
  • Conectividad: Gigabit Ethernet, puerto impresión USB 2.0 alta velocidad, puerto USB 2.0 para dispositivos de terceros, HP Smart App, HP ePrint App, Apple...
[[email protected] ~]# cat /etc/containers/registries.conf |grep -v "#" |grep -v ^$
[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']
[registries.insecure]
registries = []
[registries.block]
registries = []
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
[[email protected] ~]# 

Si a alguno de los registros necesita usuario y contraseña para acceder a él, utilizaremos el comando «podman login»:

# podman login <servidor>:5000
Enter Username:Mi_Usuario
Enter Password:Mi_Contraseña
Login Succeeded!

También podemos hacerlo por parámetros:

# podman login -u admin -p ContraseñaSecreta registry.access.redhat.com
# podman pull registry.lab.example.com/rhel8/httpd-24:latest

Listado de imágenes del repositorio

Una vez que ya tenemos acceso al repositorio de imágenes, podremos sacar un listado de las que hay disponibles. Pongamos por caso que nos interesa encontrar una imagen de Apache:

[[email protected] ~]# podman search httpd
INDEX       NAME                                                                         DESCRIPTION                                      STARS   OFFICIAL  AUTOMATED
redhat.com  registry.access.redhat.com/rhscl/httpd-24-rhel7                              Apache HTTP 2.4 Server                           0                 
redhat.com  registry.access.redhat.com/cloudforms46-beta/cfme-openshift-httpd            CloudForms is a management and automation pl...  0                 
redhat.com  registry.access.redhat.com/cloudforms46/cfme-openshift-httpd                 Web Server image for a multi-pod Red Hat® C...   0                 

Consejo: Descargar la imagen con mejor puntuación (o más estrellas):

docker.io docker.io/library/httpd The Apache HTTP Server Project 3618 [OK]

Descargar una imagen

Con podman pull descargaremos la imagen del registro que nos interesa:

[[email protected] ~]# podman pull docker.io/library/httpd 
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob d74938eee980 done  
Copying blob a8c75048351a done  
Copying blob 33847f680f63 done  
Copying blob 763d74736d95 done  
Copying blob 963cfdce5a0c done  
Copying config bde40dcb22 done  
Writing manifest to image destination
Storing signatures
bde40dcb22a7a82392a45bcc7f191bb2f807d57711934d4eda869d3d649a3643
[[email protected] ~]# 

[[email protected] ~]# podman image list
REPOSITORY               TAG     IMAGE ID      CREATED     SIZE
docker.io/library/httpd  latest  bde40dcb22a7  2 days ago  142 MB
[[email protected] ~]# 

Arrancar un contenedor

En el siguiente ejemplo arrancamos el POD docker.io/library/httpd por el puerto 8080 local en nuestro host e indicamos que el directorio local del host /apache2 se mapee como /apache dentro del contenedor:

[[email protected] ~]# podman run -d -p 8080:80 --name apachetest -v /apache2:/apache docker.io/library/httpd
e25c7b7957410858b7d150fb71a55fdea83162e2944d0bcac75b6af595161810
[[email protected] ~]# 

Parar y eliminar un contenedor

[[email protected] ~]# podman container list --all
CONTAINER ID  IMAGE                    COMMAND           CREATED        STATUS                         PORTS                   NAMES
e25c7b795741  docker.io/library/httpd  httpd-foreground  2 minutes ago  Exited (0) About a minute ago  0.0.0.0:8080->8000/tcp  apachetest
[[email protected] ~]# podman container rm e25c7b795741
e25c7b7957410858b7d150fb71a55fdea83162e2944d0bcac75b6af595161810
[[email protected] ~]# 

Eliminar una imagen

[[email protected] ~]# podman image list
REPOSITORY               TAG     IMAGE ID      CREATED     SIZE
docker.io/library/httpd  latest  bde40dcb22a7  2 days ago  142 MB
[[email protected] ~]# podman image rm bde40dcb22a7
Untagged: docker.io/library/httpd:latest
Deleted: bde40dcb22a7a82392a45bcc7f191bb2f807d57711934d4eda869d3d649a3643
[[email protected] ~]# 

Arrancar un contenedor con un usuario no privilegiado

Es una buena práctica para la seguridad del sistema operativo, no arrancar con root los contenedores, ya que una vulnerabilidad en un contenedor podría provocar que un atacante malintencionado se hiciese con el control del host.

Usuario ordinario del sistema

Lo que podemos hacer, es que éstos arranquen con un usuario no privilegiado. Para este ejemplo, utilizaremos el usuario «pods».

[[email protected] ~]# id pods
uid=1002(pods) gid=1003(pods) groups=1003(pods)
[[email protected] ~]# 

Número máximo de recursos del kernel a utilizar por cada usuario ordinario (namespaces)

Lo primero que vamos a hacer es configurar los «namespaces»:

[[email protected] ~]# echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
[[email protected] ~]# sysctl -p /etc/sysctl.d/userns.conf
user.max_user_namespaces = 28633
[[email protected] ~]# 

Los namespaces son una característica del kernel de Linux que sirve para que separar los recursos del kernel que ven diferentes procesos. Es decir, un conjunto de procesos ven un conjunto de recursos pero otro conjunto de procesos ven otro conjunto de recursos diferente.

La directiva max_user_namespaces significa que el número máximo de «espacios de nombres» (namespaces) que puede crear un usuario en el namespace actual.

Otro usuario diferente del sistema operativo tendrá el mismo número máximo de namespaces a crear y, así, sucesivamente.

Arranque de un POD de ejemplo con un usuario no privilegiado

Como comentaba anteriormente, arrancaremos el POD con el usuario «pods»:

[[email protected] ~]# su - pods
Last login: Wed Sep 15 09:02:27 CEST 2021 on pts/0
[[email protected] ~]$ podman run -d -p 8080:80 --name apachetest -v /apache2:/apache docker.io/library/httpd
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob fe59ad2e7efe done  
Copying blob a330b6cecb98 [======================================] 25.9MiB / 25.9MiB
Copying blob 2cb26220caa8 done  
Copying blob 14e3dd65f04d done  
Copying blob 3138742bd847 done  
Copying config f34528d8e7 done  
Writing manifest to image destination
Storing signatures
70d90099108dce88173404d8d346def880812a8fa678345700baf319650c70df
[[email protected] ~]$


[[email protected] ~]$ podman container list --all
CONTAINER ID  IMAGE                                         COMMAND           CREATED         STATUS             PORTS                 NAMES
a8c917e46377  registry.access.redhat.com/ubi8/pause:latest                    8 days ago      Created                                  3a3b01ec4563-infra
eea1d756c951  registry.access.redhat.com/ubi8:latest        top               8 days ago      Created                                  container0
70d90099108d  docker.io/library/httpd:latest                httpd-foreground  22 seconds ago  Up 23 seconds ago  0.0.0.0:8080->80/tcp  apachetest
[[email protected] ~]$ 

Creación de un servicio de sistema para arrancar un POD con un usuario no privilegiado del sistema

Ahora que ya hemos comprobado que el contenedor arranca con el usuario «pods», lo que vamos a hacer a continuación es crear un servicio del sistema para que el contenedor arranque automáticamente con el boot del servidor.

El servicio lo crearemos con el usuario root, pero en las directivas del mismo ya indicamos que el usuario propietario es «pods»:

[[email protected] ~]# cat /etc/systemd/system/pods.service
[Unit]
Description=Contenedor arrancado por el usuario pods
After=network.target

[Service]
User=pods
Group=pods
Type=simple
TimeoutStartSec=5m
ExecStart=podman run -d -p 8080:80 --name apachetest -v /apache2:/apache docker.io/library/httpd
ExecReload=podman stop "apachetest"
ExecReload=podman rm -f "apachetest"
ExecStop=podman stop "apachetest"
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
[[email protected] ~]# systemctl daemon-reload 
[[email protected] ~]# 

¿Te ha gustado? Compártelo

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email
About Author

Contenido Relacionado

Artículos Recientes

Deja un comentario