El “Hola Mundo” de Podman
Vamos a crear nuestro primer contenedor, para comprobar que todo está funcionando y vamos a explicar el proceso que se va a realizar en la creación del contenedor.
Contenedor rootful
Vamos a crear un contenedor rootful, es decir un contenedor ejecutado por el usuario root
, por eso usaremos la instrucción sudo
:
$ sudo podman run hello-world
Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob 83d537244900 done |
Copying config a4e07799a3 done |
Writing manifest to image destination
!... Hello Podman World ...!
.--"--.
/ - - \
/ (O) (O) \
~~~| -=(,Y,)=- |
.---. /` \ |~~
~/ o o \~~~~.----. ~~
| =(X)= |~ / (O (O) \
~~~~~~~ ~| =(Y_)=- |
~~~~ ~~~| U |~~
Project: https://github.com/containers/podman
Website: https://podman.io
Desktop: https://podman-desktop.io
Documents: https://docs.podman.io
YouTube: https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon: @Podman_io@fosstodon.org
Pero, ¿qué es lo que ha sucedido al ejecutar esta instrucción?:
- Indicamos que queremos ejecutar un contenedor (
podman run
). - Indicamos el nombre de la imagen. Hemos usado el nombre corto sin indicar el nombre del registro, ya que la imagen
hello-world
esta definida en el fichero/etc/containers/registries.conf.d/000-shortnames.conf
donde indicamos alias a los nombres de las imágenes para que sea más fácil su gestión. - Al ser la primera vez que se ejecuta un contenedor basado en la imagen
hello-word
, la imagen se descarga de un registro público, en este caso del registro quay.io y se guarda en nuestro registro local. La etiqueta por defecto de la imagen eslatest
. - Se crea el contenedor que ejecuta un comando por defecto que muestra el mensaje que hemos leído y se detiene.
NOTA: En realidad todas los comandos del cliente Podman que trabajan con contenedores son subcomandos de podman container
, pero se puede abreviar omitiendo el comando container
, es decir estos dos comandos son iguales:
$ sudo podman container run ...
$ sudo podman run...
Si listamos los contenedores que se están ejecutando (podman ps
):
$ sudo podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Comprobamos que este contenedor no se está ejecutando. Un contenedor ejecuta un proceso y cuando termina la ejecución, el contenedor se para.
Para ver los contenedores que no se están ejecutando (observa que se ha asignado un nombre aleatorio al contenedor), ejecutamos:
$ sudo podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03038845a764 quay.io/podman/hello:latest /usr/local/bin/po... 3 minutes ago Exited (0) 3 minutes ago stupefied_mcnulty
Para eliminar el contenedor podemos identificarlo con su id
:
$ sudo podman rm 03038845a764
o con su nombre:
$ sudo podman rm stupefied_mcnulty
La imagen que hemos usado se queda descargada en nuestro registro local:
$ sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/podman/hello latest 9e0dd3d2c11c 17 hours ago 752 kB
Contenedor rootless
En este ejemplo vamos a ejecutar nuestro primer contenedor rootless, es decir en esta ocasión el usuario que va a crear el contenedor es un usuario sin privilegios (no usaremos la instrucción sudo
):
$ podman run quay.io/josedom24/hola-mundo:latest
Trying to pull quay.io/josedom24/hola-mundo:latest...
Getting image source signatures
Copying blob a0bed814693a skipped: already exists
Copying blob c9b9b8ad6639 done |
Copying config 3ab8e3c3fd done |
Writing manifest to image destination
Hola Mundo!!!
1. Este contenedor se ha iniciado.
2. Ha mostrado el mensaje.
3. Y finalmente se ha parado.
En este caso:
- Hemos ejecutado la instrucción
podman run
con un usuario sin privilegios. - Al indicar la imagen hemos usado su nombre completo, indicando el nombre del registro, el nombre del usuario, el nombre de la imagen, y el nombre de la etiqueta (si no se indica el nombre de la etiqueta se escogerá por defecto
latest
). - Se crea el contenedor que ejecuta un comando por defecto que muestra el mensaje que hemos leído y se detiene.
Cada usuario gestiona sus imágenes y sus contenedores, por lo tanto el usuario sin privilegios no ve las imágenes ni los contenedores del root
:
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/josedom24/hola-mundo latest 3ab8e3c3fd4e 15 minutes ago 7.68 MB
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e2b7e2a7494 quay.io/josedom24/hola-mundo:latest ash /opt/hola.sh 3 minutes ago Exited (0) 8 minutes ago gracious_dubinsky
Creación de contenedores sin ejecutarlos
De manera habitual vamos a usar podman run
para crear y ejecutar un contenedor. Podríamos también crear un contenedor que no se ejecute y posteriormente dar la orden de ejecución. Vamos a observar que la creación de este segundo contenedor será mucho más rápida ya que tenemos la imagen descargada en nuestro registro local. Para crear un contenedor y no iniciar su ejecución utilizaremos el comando podman create
:
$ sudo podman create hello-world
7eb70aea838788181a00ad14e3e447ef231dcff680fc37f7b0025e551080fbf8
Podemos ver que el contenedor está creado pero no en ejecución:
$ sudo podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb70aea8387 quay.io/podman/hello:latest /usr/local/bin/po... 12 seconds ago Created pensive_gagarin
Podemos iniciar la ejecución de este contenedor usando podman start -a
. La opción -a
nos permite conectar a la salida estándar del contenedor y poder ver en nuestro terminal la salida.
$ sudo podman start -a pensive_gagarin
!... Hello Podman World ...!
...