Aller au contenu

Déploiement avec Podman Compose

Créer et lancer un premier projet Compose en mode rootless.


Structure du projet

Organisez vos projets Compose dans un répertoire dédié :

mkdir -p ~/compose/monapp

Convention : ~/compose/<nom-projet>/ — un dossier par application, chacun avec son docker-compose.yml.


Compose minimal — Nginx

Créez le fichier Compose :

cat > ~/compose/monapp/docker-compose.yml << 'EOF'
services:
  web:
    image: docker.io/library/nginx:alpine
    ports:
      - "8080:80"
    restart: always
    volumes:
      - ./html:/usr/share/nginx/html:Z
EOF

Créez la page HTML de test :

mkdir -p ~/compose/monapp/html
echo "<h1>Ca marche !</h1>" > ~/compose/monapp/html/index.html

Le flag :Z est obligatoire

Sur AlmaLinux (et tout système avec SELinux actif), le flag :Z sur les volumes déclenche un relabeling automatique des fichiers montes. Sans ce flag, le conteneur recevra un Permission denied à l'accès des fichiers. Le :Z est spécifique a un seul conteneur — utilisez :z (minuscule) si plusieurs conteneurs partagent le même volume.


Lancement et test

cd ~/compose/monapp
podman-compose up -d

Verifiez que le conteneur tourne :

podman ps

Testez l'accès HTTP :

curl http://localhost:8080
# <h1>Ca marche !</h1>

Pour arrêter :

podman-compose down

Aller plus loin — Compose multi-services

Un exemple plus realiste avec un reverse proxy nginx et une application Python :

services:
  proxy:
    image: docker.io/library/nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:Z
    restart: always
    depends_on:
      - app

  app:
    image: docker.io/library/python:3.12-alpine
    command: python -m http.server 5000
    volumes:
      - app-data:/data:Z
    restart: always

volumes:
  app-data:

Avec un fichier nginx.conf :

server {
    listen 80;
    location / {
        proxy_pass http://app:5000;
        proxy_set_header Host $host;
    }
}

Les conteneurs communiquent entre eux via le réseau Podman interne — app est résolu automatiquement par le nom de service.

Compatibilité docker-compose.yml

Podman Compose supporte la majorité des directives docker-compose.yml standard. Les différences notables :

  • network_mode: host fonctionne
  • build: fonctionne via Buildah
  • Les volumes nommes sont supportes
  • Les healthchecks sont supportes
  • Les secrets Docker Swarm ne sont pas supportes (Swarm n'existe pas dans Podman)

L'application tourne, mais elle ne survivra pas a un reboot. Pour ca, il faut un service systemd.