Capítulo 3. Trabajar con contenedores y pods
Los contenedores representan un proceso en ejecución o detenido que se genera a partir de los archivos ubicados en una imagen de contenedor descomprimida. En esta sección se describen las herramientas para ejecutar contenedores y trabajar con ellos.
3.1. Contenedores en funcionamiento
Cuando se ejecuta un comando podman run
, esencialmente se hace girar y se crea un nuevo contenedor a partir de una imagen de contenedor. El comando que pasas a la línea de comandos podman run
ve el interior del contenedor como su entorno de ejecución por lo que, por defecto, se puede ver muy poco del sistema anfitrión. Por ejemplo, por defecto, la aplicación en ejecución ve:
- El sistema de archivos proporcionado por la imagen del contenedor.
- Una nueva tabla de procesos desde el interior del contenedor (no se pueden ver los procesos del host).
Si quieres hacer que un directorio del host esté disponible para el contenedor, asignar puertos de red del contenedor al host, limitar la cantidad de memoria que el contenedor puede usar, o expandir los recursos compartidos de la CPU disponibles para el contenedor, puedes hacer esas cosas desde la línea de comandos podman run
. Aquí hay algunos ejemplos de líneas de comando de podman run
que habilitan diferentes características.
EXAMPLE #1 (Run a quick command): Este comando podman ejecuta el comando cat /etc/os-release
para ver el tipo de sistema operativo utilizado como base del contenedor. Después de que el contenedor ejecute el comando, el contenedor sale y se borra (--rm
).
# podman run --rm registry.redhat.io/ubi8/ubi cat /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="8.2 (Ootpa)" ID="rhel" ID_LIKE="fedora" VERSION_ID="8.2" PLATFORM_ID="platform:el8" PRETTY_NAME="Red Hat Enterprise Linux 8.2 (Ootpa)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:8.2:GA" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8" REDHAT_BUGZILLA_PRODUCT_VERSION=8.2 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="8.2" ...
EXAMPLE #2 (View the Dockerfile in the container): Este es otro ejemplo de ejecución de un comando rápido para inspeccionar el contenido de un contenedor desde el host. Todas las imágenes en capas que Red Hat proporciona incluyen el Dockerfile a partir del cual se construyen en /root/buildinfo
. En este caso no es necesario montar ningún volumen desde el host.
podman run --rm \ registry.redhat.io/rhel8/rsyslog \ ls /root/buildinfo Dockerfile-rhel8-rsyslog-8.2-25
Ahora que sabes cómo se llama el Dockerfile, puedes listar su contenido:
# podman run --rm registry.redhat.io/rhel8/rsyslog \ cat /root/buildinfo/Dockerfile-rhel8-rsyslog-8.2-25 FROM sha256:eb205f07ce7d0bb63bfe560... LABEL maintainer="Red Hat, Inc." RUN INSTALL_PKGS="\ rsyslog \ rsyslog-gnutls \ rsyslog-gssapi \ rsyslog-mysql \ rsyslog-pgsql \ rsyslog-relp \ " && dnf -y install $INSTALL_PKGS && rpm -V --nosize --nofiledigest --nomtime --nomode $INSTALL_PKGS && dnf clean all LABEL com.redhat.component="rsyslog-container" LABEL name="rhel8/rsyslog" LABEL version="8.2" ...
EXAMPLE #3 (Run a shell inside the container): El uso de un contenedor para lanzar un shell bash le permite mirar dentro del contenedor y cambiar el contenido. Esto establece el nombre del contenedor como mybash
. El -i
crea una sesión interactiva y el -t
abre una sesión de terminal. Sin -i
, el shell se abriría y luego saldría. Sin -t
, el shell permanecería abierto, pero no podrías escribir nada en el shell.
Una vez que ejecute el comando, se le presentará un prompt de shell y podrá comenzar a ejecutar comandos desde el interior del contenedor:
# podman run --name=mybash -it registry.redhat.io/ubi8/ubi /bin/bash [root@ed904b8f2d5c/]# yum install procps-ng [root@ed904b8f2d5c/]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 00:46 pts/0 00:00:00 /bin/bash root 35 1 0 00:51 pts/0 00:00:00 ps -ef [root@49830c4f9cc4/]# exit
Aunque el contenedor ya no se ejecuta una vez que sale, el contenedor sigue existiendo con el nuevo paquete de software aún instalado. Utilice podman ps -a
para listar el contenedor:
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES IS INFRA 1ca061b47bd7 .../ubi8/ubi:latest /bin/bash 8 minutes ago Exited 12 seconds ago musing_brown false ...
Podría iniciar ese contenedor de nuevo usando podman start
con las opciones de -ai
. Por ejemplo:
# podman start -ai mybash [root@ed904b8f2d5c/]#
EXAMPLE #4 (Bind mounting log files): Una forma de hacer que los mensajes de registro de un contenedor estén disponibles para el sistema anfitrión es montar el dispositivo /dev/log del anfitrión dentro del contenedor. Este ejemplo ilustra cómo ejecutar una aplicación en un contenedor RHEL llamado log_test
que genera mensajes de registro (sólo el comando logger en este caso) y dirige esos mensajes al dispositivo /dev/log que está montado en el contenedor desde el host. La opción --rm
elimina el contenedor después de su ejecución.
# podman run --name="log_test" -v /dev/log:/dev/log --rm \ registry.redhat.io/ubi8/ubi logger "Testing logging to the host" # journalctl -b | grep Testing Nov 12 20:00:10 ubi8 root[17210]: Testing logging to the host
EXAMPLE #5 (Run a service as a daemon with a static IP address): El siguiente ejemplo ejecuta un servicio rsyslog
como un proceso demonio, por lo que se ejecuta continuamente en segundo plano. También le dice a podman
que establezca la interfaz de red del contenedor a una dirección IP particular (por ejemplo, 10.88.0.44). Después de eso, puedes ejecutar el comando podman inspect
para comprobar que la dirección IP se ha establecido correctamente:
# podman run -d --ip=10.88.0.44 registry.access.redhat.com/rhel7/rsyslog efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85 # podman inspect efde5f0a8c723 | grep 10.88.0.44 "IPAddress": "10.88.0.44",