Podman compose
Contenido
Varios podman a la vez (podman-compose)
Cuando queremos ejecutar varios contenedores a la vez y que estén conectados entre ellos fácilmente, utilizaremos podman-compose, donde con un fichero de configuración simple en yaml, tendremos toda la configuración de lo que vamos a ejecutar.
Primero vamos a instalar podman-compose:
sudo apt install podman-composeAhora veamos un pequeño ejemplo donde explicaremos todos los detalles para crear un podman-compose, en este caso, el nombre por defecto de los ficheros suele ser podman-compose.yml, y el contenido será similar a:
version: '3'
services:
web:
container_name: web
restart: always
build:
context: .
ports:
- "8000:8000"
volumes:
- /home/ubuntu/volume:/volumen:rw
environment:
USERNAME: test
web2:
container_name: web2
build:
dockerfile: Dockerfile
context: .
depends_on:
- web
command: touch web2
web3:
container_name: web3
restart: on-failure
image: pstauffer/curl
depends_on:
- web
command: curl -X GET web:8000/welcome?username=web3En el podman-compose definimos diferentes servicios a ejecutar, en nuestro caso hemos iniciado tres servicios diferentes, web, web2 y web3:
El primer servicio, web:
- container_name: para darle un nombre por defecto al contenedor cuando se cree
- restart: pueden ser:
- "no": si la máquina termina, no se vuelve a iniciar (opción por defecto)
- always: siempre que el contenedor termine, intenta iniciarse de nuevo
- on-failure: solo intenta reiniciarse si el contenedor termina con fallo
- unless-stopped: solo reinicia el contenedor si el usuario es el que lo termina
- Utilizará el fichero Dockerfile creado en el paso 11 para generar la imagen a usar.
- Expondrá el puerto 8000 del contenedor en el 8000 de nuestra máquina
- Montará un volumen, se hace de forma similar a la línea de comandos
- Creará una variable de entorno
El segundo servicio, web2:
- Utilizará el fichero Dockerfile también, la diferencia entre este y el primer servicio, es que si el nombre del Dockerfile cambia, tendremos que hacerlo de esta segunda forma, la primera por defecto solo buscará el fichero Dockerfile
- depends_on hará que para ejecutar este servicio, su dependencia tenga ya que estar iniciada
- Ejecutaremos un comando el cual sustituirá al comando de la imagen
El tercer servicio, web3:
- Utilizará la imagen ostauffer/curl que es un imagen mínima que contiene el comando curl
- restart: en este caso, hasta que el comando no se ejecute correctamente, se seguirá reiniciando el contenedor
- depends_on igual que el servicio 2, dependerá del servicio 1
- Ejecutaremos un comando para llamar desde el servicio 3 al servicio 1
Paso 13.1: Construir podman-compose
En el caso de existir servicios que tengan Dockerfiles, esto hará que se construyan previamente, como hacer un podman build de cada uno de los servicios que contenga un Dockerfile:
podman-compose buildCon esto se generarán las imágenes necesarias para ejecutar todos los servicios.
Paso 13.2: Iniciar podman-compose
Para iniciar todos los servicios, ejecutaremos:
podman-compose up -dDespués de esto podremos ver el logs de todos los servicios:
podman-compose logs -fAquí veremos que el servicio 3 ha conseguido llamar correctamente al servicio 1.
Ahora veremos como podman-compose ha creado los contenedores:
podman ps -aLa salida será similar a la siguiente:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
219a4118244c pstauffer/curl "curl -X GET web:800…" 6 seconds ago Exited (0) 3 seconds ago web3
c97e894cb3ae ubuntu_web2 "touch web2" 6 seconds ago Exited (0) 4 seconds ago web2
f35d034204fc ubuntu_web "/bin/sh -c 'hug -f …" 6 seconds ago Up 5 seconds 0.0.0.0:8000->8000/tcp webAquí vemos varios detalles:
- El nombre que le hemos dado en el podman-compose ha funcionado correctamente
- Vemos que los comandos son los correctos también
- web2 está parado por que la política de reinicio es apagar cuando se termine de ejecutar un comando
- web 3 está parado por que el comando ha terminado con un salida correcta
Vamos a comprobar ahora que en el servicio web está todo correcto:
podman exec -ti web ash
echo $USERNAME
ls /volumen
exitPodemos comprobar que tanto cambiar la variable de entorno como crear un volumen ha funcionado correctamente.
Paso 13.3: Parar podman-compose
Para parar todos los servicios:
podman-compose downComprobamos:
podman ps -aVemos que han desaparecido todos los contenedores.