1. Prerequisiti e installazione Podman

Installare Podman su Windows 11

Scarica e installa Podman per Windows dall'indirizzo ufficiale:

https://podman.io/

Scarica il file .exe dell'ultima versione stabile (es. podman-v5.x.x-setup.exe) ed eseguilo.

Inizializzare la Podman Machine

Podman su Windows utilizza una macchina virtuale Linux in background. Inizializzala con risorse adeguate allo sviluppo:

podman machine init --memory 4096

Viene creata una macchina virtuale con nome podman-machine-default. Volendo posso anche dare un nome alla macchina usando il comando podman machine init nome-macchina

Per avviare e fermare la macchina usa questi comandi

podman machine start
podman machine stop

I container possono girare in due modalità

  1. Rootless: I container girano senza privilegi di root
  2. Rootful: I container girano come root dentro la VM

Se voglio far girare la macchine con privilegi di root lanciare il seguente comando e poi fermare e riavviare la macchina

podman machine set --rootful
podman machine stop
podman machine start

Per vedere la macchina virtuale installata

podman machine list

Nel caso in cui desideri cancellare e ricreare la macchina usa

podman machine rm

Verifica che tutto funzioni:

podman version
podman info

Per vedere la macchina installa con wsl lanciare il seguente comando

wsl -l -v

Installare podman-compose

podman-compose permette di orchestrare più container tramite un file compose.yaml, ed è l'equivalente di docker-compose per Podman.

pip install podman-compose

Se non hai Python installato, scaricalo da https://python.org e assicurati di aggiungere Python al PATH durante l'installazione.

2. Struttura del progetto

Crea questa struttura di cartelle. La cartella D:\temp\wamp-podman contiene tutta la configurazione dei container. I tuoi siti web risiedono nella sottocartella www e vengono montati nel container senza essere copiati al suo interno.

D:\temp\wamp-podman\
│
├── .env                          ← tutte le variabili configurabili qui
├── compose.yaml                  ← orchestrazione dei container
│
├── php-apache\
│   ├── Dockerfile                ← immagine custom PHP 8.5.4-fpm + Apache
│   ├── apache\
│   │   ├── vhosts.conf           ← configurazione virtual host Apache
│   │   └── start.sh              ← script di avvio PHP-FPM + Apache
│   └── php\
│       ├── custom.ini            ← impostazioni PHP aggiuntive
│       └── fpm-pool.conf         ← configurazione pool PHP-FPM
│
└── www\                          ← i tuoi siti (solo montata nel container)
    ├── sito1\
    ├── sito2\
    └── ...

3. File di configurazione centrale .env

Questo è il punto unico dove modificare tutte le variabili dell'ambiente. Non dovrai mai toccare altri file per cambiare porte, credenziali o percorsi.

Percorso: D:\temp\wamp-podman\.env

# ─────────────────────────────────────────────
#  PERCORSI
# ─────────────────────────────────────────────

# Percorso della cartella che contiene i tuoi siti web.
# Usa la sintassi con slash (/).
SITES_ROOT=D:/temp/wamp-podman/www

# ─────────────────────────────────────────────
#  PORTE HOST
# ─────────────────────────────────────────────

# Porta su cui Apache risponde su Windows (http://localhost:APACHE_PORT)
APACHE_PORT=8080

# Porta interna del container su cui Apache ascolta
# Per wordpress tenere allineato questo valore con APACHE_PORT
APACHE_INTERNAL_PORT=8080

# Porta su cui phpMyAdmin è raggiungibile da Windows
PHPMYADMIN_PORT=8081

# Porta interna del container su cui phpMyAdmin ascolta
PHPMYADMIN_INTERNAL_PORT=80

# Porta per MariaDB (utile per client esterni come DBeaver)
MARIADB_PORT=3306

# ─────────────────────────────────────────────
#  MARIADB
# ─────────────────────────────────────────────

MARIADB_ROOT_PASSWORD=root

# ─────────────────────────────────────────────
#  NOMI CONTAINER
# ─────────────────────────────────────────────

# prefisso usato da Podman per nominare tutte le risorse
COMPOSE_PROJECT_NAME=devenv

4. Dockerfile per PHP-FPM + Apache

Questo Dockerfile usa come base php:8.5.4-fpm, che include PHP-FPM ma non un web server. Apache viene installato tramite apt-get e configurato per comunicare con PHP-FPM tramite FastCGI usando il modulo mod_proxy_fcgi. PHP-FPM ascolta su socket Unix per prestazioni migliori rispetto a TCP.

Percorso: D:\temp\wamp-podman\php-apache\Dockerfile

# Immagine base ufficiale PHP 8.5.4 con PHP-FPM preinstallato.
# Non include un web server: Apache viene installato separatamente qui sotto.
FROM php:8.5.4-fpm

# Aggiorna l'indice dei pacchetti apt prima di qualsiasi installazione.
RUN apt-get update

# Installa Apache e il modulo FastCGI.
# apache2 è il web server che riceve le richieste HTTP.
# libapache2-mod-fcgid è necessario per la comunicazione FastCGI tra Apache e PHP-FPM,
# anche se il modulo che usiamo effettivamente è mod_proxy_fcgi (abilitato più avanti).
RUN apt-get install -y apache2 libapache2-mod-fcgid

# Installa le librerie di sistema necessarie per compilare le estensioni PHP.
# Queste sono le dipendenze native (headers e librerie C) richieste da:
# - libzip-dev, libpng-dev, libjpeg62-turbo-dev, libwebp-dev, libfreetype6-dev → GD (immagini)
# - libonig-dev → mbstring (stringhe multibyte)
# - libxml2-dev → soap, xsl, xml
# - libcurl4-openssl-dev, libssl-dev → curl e connessioni sicure
# - libmagickwand-dev → ImageMagick
# - libicu-dev → intl (internazionalizzazione)
# - libxslt1-dev → xsl (trasformazioni XSLT)
# - libsqlite3-dev → pdo_sqlite
# - unzip, curl, git, nano → strumenti generali utili dentro il container
RUN apt-get install -y libzip-dev libpng-dev libjpeg62-turbo-dev libwebp-dev libfreetype6-dev libonig-dev libxml2-dev libcurl4-openssl-dev libssl-dev libmagickwand-dev libicu-dev libxslt1-dev libsqlite3-dev unzip curl git nano

# GD richiede un configure separato per specificare quali formati immagine supportare.
# configure e install devono stare nello stesso RUN per mantenere lo stato della configurazione.
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp && docker-php-ext-install gd

# Estensioni matematiche e di utilità generale.
# bcmath → calcoli decimali ad alta precisione (richiesto da Laravel e molti pacchetti)
# calendar → conversioni tra formati di calendario
# exif → lettura metadati da immagini (richiesto da WordPress per la gestione media)
# gettext → internazionalizzazione tramite file .po/.mo
RUN docker-php-ext-install bcmath calendar exif gettext

# Estensioni per stringhe e database MySQL.
# intl → internazionalizzazione avanzata (richiesto da Laravel)
# mbstring → gestione stringhe multibyte (UTF-8), richiesto praticamente da tutto
# mysqli → interfaccia procedurale per MySQL/MariaDB (richiesto da WordPress)
RUN docker-php-ext-install intl mbstring mysqli

# Estensioni per processi e database.
# pcntl → controllo processi (richiesto da Laravel queue e Artisan)
# pdo → interfaccia PDO generica per database
# pdo_mysql → driver PDO per MySQL/MariaDB (richiesto da Laravel)
# pdo_sqlite → driver PDO per SQLite (utile per test)
RUN docker-php-ext-install pcntl pdo pdo_mysql pdo_sqlite

# Estensioni per protocolli e formati.
# soap → protocollo SOAP per web service
# sockets → comunicazione tramite socket di basso livello
# xsl → trasformazioni XSLT su documenti XML
# zip → creazione e lettura di archivi ZIP (richiesto da Composer e molti pacchetti)
RUN docker-php-ext-install soap sockets xsl zip

# ImageMagick: libreria avanzata per manipolazione immagini.
# Installata tramite PECL perché non fa parte delle estensioni core di PHP.
# Offre funzionalità superiori a GD (resize, watermark, conversioni, PDF, ecc.)
RUN pecl install imagick
RUN docker-php-ext-enable imagick

# Redis: estensione per comunicare con un server Redis.
# Utile per cache, sessioni e code in Laravel e WordPress.
# Installata tramite PECL perché non fa parte delle estensioni core di PHP.
RUN pecl install redis
RUN docker-php-ext-enable redis

# Copia il binario di Composer dall'immagine ufficiale.
# Composer è il gestore di dipendenze PHP, necessario per Laravel e molti progetti moderni.
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Abilita i moduli Apache necessari.
# proxy_fcgi → permette ad Apache di passare le richieste PHP a PHP-FPM via FastCGI
# setenvif → richiesto da proxy_fcgi per impostare variabili d'ambiente sulle richieste
# rewrite → riscrittura URL, richiesto da Laravel (.htaccess) e WordPress
# headers → gestione degli header HTTP
# expires → header per la cache del browser
# deflate → compressione gzip delle risposte
# ssl → supporto HTTPS
# vhost_alias → abilita VirtualDocumentRoot per i virtual host wildcard
RUN a2enmod proxy_fcgi setenvif rewrite headers expires deflate ssl vhost_alias

# Copia la configurazione dei virtual host Apache,
# sovrascrivendo il virtual host di default dell'immagine base.
COPY apache/vhosts.conf /etc/apache2/sites-available/000-default.conf

# Copia le configurazioni PHP personalizzate nella cartella conf.d,
# che viene letta da PHP all'avvio per sovrascrivere i valori di php.ini.
COPY php/custom.ini /usr/local/etc/php/conf.d/custom.ini

# Sovrascrive la configurazione del pool PHP-FPM di default
# per usare un socket Unix invece di TCP.
COPY php/fpm-pool.conf /usr/local/etc/php-fpm.d/www.conf

# Copia lo script di avvio che lancia sia PHP-FPM che Apache,
# e lo rende eseguibile.
COPY apache/start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh

# Allinea l'UID e GID dell'utente www-data a 1000.
# Su Windows/Linux l'utente proprietario dei file montati ha tipicamente UID 1000.
# Questo evita problemi di permessi quando Apache o PHP-FPM
# devono leggere, scrivere o creare file nella cartella montata.
RUN usermod -u 1000 www-data
RUN groupmod -g 1000 www-data

# Imposta la cartella di lavoro predefinita del container.
WORKDIR /var/www/html

# Documenta che il container espone la porta 80.
# Questo valore viene sovrascritto dinamicamente dallo script start.sh
# in base alla variabile APACHE_INTERNAL_PORT passata dal compose.yaml.
EXPOSE 80

# Sostituisce il CMD predefinito dell'immagine base (php-fpm)
# con il nostro script che avvia sia PHP-FPM che Apache.
CMD ["/usr/local/bin/start.sh"]

Script di avvio

Poiché il container deve eseguire sia PHP-FPM che Apache, serve uno script che li avvii entrambi. L'immagine base php:8.5.4-fpm ha come CMD predefinito solo php-fpm: lo script lo sostituisce avviando entrambi i processi.

Percorso: D:\temp\wamp-podman\php-apache\apache\start.sh

#!/bin/bash
export APACHE_LOG_DIR=/var/log/apache2
export APACHE_RUN_DIR=/var/run/apache2
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_LOCK_DIR=/var/lock/apache2
export APACHE_PID_FILE=/var/run/apache2/apache2.pid

# Porta dinamica da variabile d'ambiente, default 80 se non impostata
APACHE_INTERNAL_PORT=${APACHE_INTERNAL_PORT:-80}

# Imposta la porta di ascolto
echo "Listen ${APACHE_INTERNAL_PORT}" > /etc/apache2/ports.conf

# Sostituisce la porta nei VirtualHost
sed -i "s/\*:APACHE_PORT/\*:${APACHE_INTERNAL_PORT}/g" /etc/apache2/sites-available/000-default.conf

# crea la cartella dove PHP-FPM scriverà il socket Unix. Il flag -p evita errori se la cartella esiste già
mkdir -p /var/run/php

# assegna la cartella all'utente www-data, che è l'utente con cui girano sia Apache che PHP-FPM
chown www-data:www-data /var/run/php

#  avvia PHP-FPM in background
php-fpm &

# avvia Apache in primo piano. Questo è l'ultimo comando e non ritorna mai finché il container è in esecuzione. 
# Docker e Podman richiedono che almeno un processo giri in foreground per mantenere il container attivo: 
# se questo processo termina, il container si spegne.
apache2ctl -D FOREGROUND

5. Configurazione Apache

Apache riceve le richieste HTTP e passa quelle PHP a PHP-FPM tramite FastCGI usando la direttiva SetHandler proxy:unix. Il socket Unix /var/run/php/php-fpm.sock è il canale di comunicazione tra Apache e PHP-FPM all'interno del container.

Percorso: D:\temp\wamp-podman\php-apache\apache\vhosts.conf

# ─── Virtual Host di default ─────────
<VirtualHost *:APACHE_PORT>
    ServerName localhost
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/var/run/php/php-fpm.sock|fcgi://localhost"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# ─── Virtual Host dedicato per progetti Laravel ──────────
# La DocumentRoot punta alla sottocartella /public.
# Duplica questo blocco per ogni progetto Laravel aggiuntivo.
# Ricorda di aggiungere il dominio al file hosts di Windows:
#   C:\Windows\System32\drivers\etc\hosts
#   127.0.0.1   sito1.localhost

<VirtualHost *:APACHE_PORT>
    ServerName sito1.localhost
    DocumentRoot /var/www/html/sito1/public

    <Directory /var/www/html/sito1/public>
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/var/run/php/php-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

# ─── Virtual Host wildcard per WordPress e siti senza /public ────────────────
# Gestisce automaticamente tutti i siti la cui DocumentRoot
# è la cartella radice del progetto, senza aggiungere un VirtualHost per ognuno.

<VirtualHost *:APACHE_PORT>
    ServerName wildcard.localhost
    ServerAlias *.localhost
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/html/%1

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/var/run/php/php-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Configurazione pool PHP-FPM

Sovrascrivi la configurazione di default del pool PHP-FPM per usare un socket Unix invece di TCP, che è più performante per comunicazioni locali all'interno del container.

Percorso: D:\temp\wamp-podman\php-apache\php\fpm-pool.conf

[www]
; Utente e gruppo con cui girano i processi PHP-FPM.
; Deve corrispondere all'utente di Apache per evitare problemi di permessi
; sui file montati dalla cartella Windows.
user = www-data
group = www-data

; Usa un socket Unix invece di TCP (es. 127.0.0.1:9000).
; Il socket Unix è più performante per comunicazioni locali all'interno
; dello stesso container, poiché evita il overhead del protocollo TCP.
listen = /var/run/php/php-fpm.sock

; Permessi sul socket: owner e group devono corrispondere all'utente Apache
; in modo che Apache possa scrivere sul socket e passare le richieste a PHP-FPM.
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Gestione dinamica dei processi worker.
; PHP-FPM crea e distrugge i worker in base al carico,
; mantenendosi tra un minimo e un massimo definiti qui sotto.
pm = dynamic

; Numero massimo di processi worker simultanei.
; Ogni worker gestisce una richiesta PHP alla volta.
pm.max_children = 20

; Numero di worker avviati insieme al container.
pm.start_servers = 4

; Numero minimo di worker inattivi mantenuti in standby.
; Se scende sotto questo valore PHP-FPM ne crea di nuovi.
pm.min_spare_servers = 2

; Numero massimo di worker inattivi tollerati.
; Se supera questo valore PHP-FPM ne termina alcuni per liberare memoria.
pm.max_spare_servers = 6

6. Configurazione PHP

Andiamo ora a sovrascrivere alcune direttive di php con un file ini custom

Percorso: D:\temp\wamp-podman\php-apache\php\custom.ini

; ─── Impostazioni generali ───────
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On

; ─── Limiti di risorse ──────────
memory_limit = 512M
max_execution_time = 120
max_input_time = 120
max_input_vars = 3000

; ─── Upload ───────
upload_max_filesize = 64M
post_max_size = 64M

; ─── Timezone ────────
date.timezone = Europe/Rome

; ─── OPcache ──────
opcache.enable = 0
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
; 0 = nessuna cache del timestamp: Apache vede sempre i file aggiornati
opcache.revalidate_freq = 0

; ─── Sessioni ──────
session.gc_maxlifetime = 3600

8. File compose.yaml

Un file compose.yaml serve a definire e avviare più container (servizi) insieme con una sola configurazione, descrivendo come devono funzionare e interagire tra loro

Percorso: D:\temp\wamp-podman\compose.yaml

# Nome del progetto, usato come prefisso per container, volumi e reti.
# Il valore viene letto dal file .env.
name: ${COMPOSE_PROJECT_NAME}

# Definizione della rete interna condivisa tra tutti i container.
# Con il driver bridge i container sulla stessa rete si raggiungono
# tramite il loro nome servizio (es. "mariadb", "php-apache"),
# ma sono isolati dal resto della rete della macchina host.
networks:
  devnet:
    driver: bridge

# Dichiarazione dei volumi persistenti gestiti da Podman.
# Un volume è una cartella gestita direttamente da Podman, separata
# dal filesystem del container. I dati sopravvivono al riavvio e
# alla rimozione del container, e vengono eliminati solo con
# "podman volume rm" oppure "podman-compose down -v".
volumes:
  mariadb_data:
    driver: local

services:

  php-apache:
    # Costruisce l'immagine dal Dockerfile invece di scaricarla da un registry.
    # context indica la cartella che viene inviata al build engine come contesto,
    # ovvero la cartella da cui il Dockerfile legge i file con le istruzioni COPY.
    build:
      context: ./php-apache
      dockerfile: Dockerfile
    container_name: ${COMPOSE_PROJECT_NAME}_php
    # Riavvia il container automaticamente se si blocca o se la macchina viene riavviata.
    # "unless-stopped" significa che si riavvia sempre tranne quando lo si ferma manualmente.
    restart: unless-stopped
    # Mappa la porta esterna (Windows) sulla porta interna (container).
    # Formato: "porta_host:porta_container"
    # Entrambi i valori vengono letti dal file .env per essere configurabili in un solo punto.
    ports:
      - "${APACHE_PORT}:${APACHE_INTERNAL_PORT}"
    volumes:
      # Questo è un bind mount: monta una cartella esistente sul filesystem host
      # direttamente dentro il container. I file non vengono copiati: il container
      # accede in tempo reale agli stessi file presenti in ./www su Windows.
      # Qualsiasi modifica fatta dal container (lettura, scrittura, creazione, cancellazione)
      # si riflette immediatamente sulla cartella Windows e viceversa.
      # Il flag ":z" è necessario su sistemi con SELinux abilitato per assegnare
      # la label di sicurezza corretta al mount.
      - "./www:/var/www/html:z"
    environment:
      # Passa la porta interna di Apache allo script start.sh che la usa
      # per configurare dinamicamente Apache al momento dell'avvio del container.
      - APACHE_INTERNAL_PORT=${APACHE_INTERNAL_PORT}
    networks:
      - devnet
    # Garantisce che MariaDB sia avviato prima di PHP-Apache.
    # Utile per evitare errori di connessione al database durante l'avvio.
    depends_on:
      - mariadb

  mariadb:
    # Scarica l'immagine ufficiale MariaDB 12.2 dal registry Docker Hub.
    image: mariadb:12.2
    container_name: ${COMPOSE_PROJECT_NAME}_db
    restart: unless-stopped
    ports:
      - "${MARIADB_PORT}:3306"
    volumes:
      # Questo è un volume mount: diversamente dal bind mount sopra,
      # qui non si monta una cartella Windows ma un volume gestito da Podman.
      # "mariadb_data" è il volume dichiarato nella sezione "volumes" in cima al file.
      # I dati del database vengono salvati qui dentro e non nella cartella Windows,
      # per due motivi: le prestazioni del filesystem Windows su mount sono inferiori
      # rispetto a un volume nativo, e MariaDB richiede un filesystem Linux nativo
      # per funzionare correttamente.
      - mariadb_data:/var/lib/mysql:z
    environment:
      MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
    networks:
      - devnet

  phpmyadmin:
    image: phpmyadmin:latest
    container_name: ${COMPOSE_PROJECT_NAME}_pma
    restart: unless-stopped
    ports:
      - "${PHPMYADMIN_PORT}:${PHPMYADMIN_INTERNAL_PORT}"
    environment:
      # Nome del container MariaDB a cui phpMyAdmin si connette.
      # Podman risolve "mariadb" all'indirizzo IP corretto grazie alla rete devnet.
      PMA_HOST: mariadb
      PMA_PORT: 3306
      # Dimensione massima dei file SQL importabili tramite interfaccia web.
      UPLOAD_LIMIT: 64M
    networks:
      - devnet
    depends_on:
      - mariadb

9. Avvio e gestione dell'ambiente

Apri PowerShell nella cartella D:\temp\wamp-podman.

Prima build

Da eseguire solo la prima volta, o dopo modifiche al Dockerfile:

cd D:\temp\wamp-podman
podman-compose build

Nel caso in cui si verificono problemi, a container avviati, per ricostruire tutto

# ferma e rimuove i container in esecuzione. I dati nel volume MariaDB restano intatti.
podman-compose down

# ricostruisce le immagini leggendo il Dockerfile da zero, ignorando qualsiasi layer memorizzato nella cache. 
# Necessario quando modifichi il Dockerfile o i file che copia
podman-compose build --no-cache

# crea e avvia i container basandosi sulle immagini appena costruite
podman-compose up -d

Avviare, fermare e verificare i container

# Avvia tutti i container in background
podman-compose up -d

# Verifica che i container siano in esecuzione
podman ps

# Ferma i container senza rimuoverli
podman-compose stop

# Ferma e rimuove i container (i dati del DB rimangono nel volume)
podman-compose down

Accedere ai servizi

Siti web       →  http://localhost:8080
Sito specifico →  http://sito1.localhost:8080
phpMyAdmin     →  http://localhost:8081

Log e shell

# Log in tempo reale di tutti i container
podman-compose logs -f

# Log di un singolo container
podman logs -f devenv_php

# Aprire una shell nel container PHP
podman exec -it devenv_php bash

All'interno del container puoi eseguire comandi Composer e Artisan direttamente nell'ambiente PHP:

composer install
php artisan migrate
php -m

10. Uso quotidiano

Avvio/Stop rapido

podman machine start
cd D:\temp\wamp-podman
podman-compose up -d
podman-compose stop

Modificare una variabile

Apri D:\temp\wamp-podman\.env, modifica il valore desiderato, poi riavvia i container:

podman-compose down
podman-compose up -d

Aggiungere un nuovo sito

Crea la cartella del sito in D:\temp\wamp-podman\www\nuovo-sito\, poi aggiungi una riga al file hosts di Windows (come amministratore):

127.0.0.1   nuovo-sito.localhost

Il file hosts si trova in C:\Windows\System32\drivers\etc\hosts.

Se il sito usa Laravel, aggiungi un VirtualHost dedicato in vhosts.conf con DocumentRoot che punta a /var/www/html/nuovo-sito/public, poi ricostruisci:

podman-compose down
podman-compose build
podman-compose up -d

Se il sito è WordPress o ha la DocumentRoot nella root del progetto, il virtual host wildcard lo gestisce automaticamente senza modifiche.

Gestire i database

# Via browser
http://localhost:8081

# Via CLI nel container
podman exec -it devenv_db mariadb -u root -p

Backup e ripristino del database

# Esporta tutti i database
podman exec devenv_db mariadb-dump -u root -prootpassword --all-databases > backup.sql

# Ripristino
podman exec -i devenv_db mariadb -u root -prootpassword < backup.sql

Controllare i moduli PHP attivi

podman exec devenv_php php -m

Avviare Podman machine automaticamente con Windows

Per evitare di eseguire manualmente podman machine start ogni giorno, crea un Task nel Task Scheduler di Windows con questi parametri:

Trigger:   All'avvio di Windows
Programma: podman
Argomenti: machine start