<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sviluppo locale - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/sviluppo-locale/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Fri, 22 May 2026 18:43:53 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>sviluppo locale - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Container Docker per PHP: setup minimale per sviluppare in locale</title>
		<link>https://www.mrtux.it/container-docker-php-setup-minimale</link>
					<comments>https://www.mrtux.it/container-docker-php-setup-minimale#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Fri, 22 May 2026 12:39:18 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHP-FPM]]></category>
		<category><![CDATA[sviluppo locale]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/?p=3384</guid>

					<description><![CDATA[Setup Docker minimale per sviluppare PHP in locale: docker-compose.yml funzionante con PHP-FPM, Nginx, MySQL, gestione permessi, estensioni e comandi essenziali.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Docker ha cambiato il modo in cui sviluppiamo applicazioni PHP. Non devi più installare PHP, MySQL, Nginx o Apache direttamente sulla tua macchina: un container gestisce tutto, e puoi distruggere e ricreare l'ambiente senza lasciare tracce.</p>


<p class="wp-block-paragraph">In questa guida ti mostro un setup minimale, funzionante e replicabile per sviluppare qualsiasi progetto PHP in locale, dal classico WordPress a un'applicazione Laravel moderna.</p>


<h2 class="wp-block-heading">Perché Docker e non XAMPP o MAMP?</h2>


<p class="wp-block-paragraph">XAMPP e MAMP vanno bene per iniziare, ma hanno limiti precisi:</p>


<ul class="wp-block-list">
<li><strong>Conflitti di versione</strong> — PHP 7.4 sulla macchina, il server di produzione usa 8.2, e il bug si vede solo in produzione</li>
<li><strong>Servizi diversi</strong> — Il tuo portatile ha MySQL, il server di produzione usa MariaDB o PostgreSQL</li>
<li><strong>Niente isolamento</strong> — Se rompi qualcosa, rischi di rompere tutto il sistema</li>
</ul>


<p class="wp-block-paragraph">Docker risolve tutto questo: ogni progetto ha il suo ambiente, con le versioni esatte che servono, e puoi condividerlo con il team senza che nessuno debba installare niente di specifico sulla propria macchina.</p>


<h2 class="wp-block-heading">Il file docker-compose.yml minimale</h2>


<p class="wp-block-paragraph">La configurazione base per un progetto PHP con database MySQL e server web Nginx richiede tre servizi: <code>php</code>, <code>mysql</code> e <code>nginx</code>.</p>


<pre class=wp-block-code><code># docker-compose.yml versione minima funzionante
version: '3.8'

services:
  app:
    image: php:8.2-fpm
    volumes:
      - ./app:/var/www/html
    depends_on:
      - db

  web:
    image: nginx:alpine
    ports:
      - '8080:80'
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app
      MYSQL_USER: developer
      MYSQL_PASSWORD: devpass
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:</code></pre>


<p class="wp-block-paragraph">Questo file definisce tre container che comunicano su una rete Docker interna. La porta 8080 sulla tua macchina viene instradata alla porta 80 del container Nginx.</p>


<h2 class="wp-block-heading">La configurazione Nginx</h2>


<p class="wp-block-paragraph">Il container Nginx ha bisogno di un file di configurazione per sapere come parlare con PHP-FPM:</p>


<pre class=wp-block-code><code># nginx.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www/html;

    location / {
        try_files  / /index.php?;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME ;
        include fastcgi_params;
    }
}</code></pre>


<p class="wp-block-paragraph">Il parametro <code>fastcgi_pass app:9000</code> dice a Nginx di inviare i file PHP al container <code>app</code> sulla porta 9000, che è la porta standard di PHP-FPM.</p>


<h2 class="wp-block-heading">Primo avvio e verifica</h2>


<p class="wp-block-paragraph">Crea la struttura delle cartelle e il file <code>index.php</code> di test:</p>


<pre class=wp-block-code><code># Crea la struttura delle cartelle
mkdir -p app nginx

# Crea il file index.php di test
echo '&lt;?php
phpinfo();
' &gt; app/index.php</code></pre>


<p class="wp-block-paragraph">Ora avvia i container:</p>


<pre class=wp-block-code><code># Avvia tutti i servizi in background
docker-compose up -d

# Verifica che tutti i container siano attivi
docker-compose ps</code></pre>


<p class="wp-block-paragraph">Apri il browser e vai su <code>http://localhost:8080</code>. Se tutto funziona, vedrai la pagina <code>phpinfo()</code> con la configurazione di PHP 8.2.</p>


<h2 class="wp-block-heading">Installare le estensioni PHP necessarie</h2>


<p class="wp-block-paragraph">L'immagine ufficiale <code>php:8.2-fpm</code> è minimale. Per WordPress o Laravel servono alcune estensioni. Puoi estendere l'immagine con un <code>Dockerfile</code>:</p>


<pre class=wp-block-code><code># Dockerfile
FROM php:8.2-fpm

# Installa le estensioni necessarie
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd</code></pre>


<p class="wp-block-paragraph">Modifica il <code>docker-compose.yml</code> per usare il <code>Dockerfile</code> invece dell'immagine:</p>


<pre class=wp-block-code><code># Nel docker-compose.yml, sostituisci la riga:
#     image: php:8.2-fpm
# Con:
    build:
      context: .
      dockerfile: Dockerfile</code></pre>


<h2 class="wp-block-heading">Gestire i permessi file</h2>


<p class="wp-block-paragraph">Su Linux e macOS non avrai problemi di permessi. Su Windows con WSL2, potresti trovarti con file creati da root dentro i container. Per evitarlo:</p>


<pre class=wp-block-code><code># Imposta l'utente che matchi il tuo UID locale
services:
  app:
    user: '1003:1000'
    # ... resto della config</code></pre>


<p class="wp-block-paragraph">Oppure, più semplicemente, usa un file <code>.env</code>:</p>


<pre class=wp-block-code><code># .env
UID=1003
GID=1003</code></pre>


<h2 class="wp-block-heading">Accesso al database da fuori Docker</h2>


<p class="wp-block-paragraph">Per collegare un client MySQL esterno (come TablePlus o DBeaver) al container:</p>


<pre class=wp-block-code><code># Aggiungi al servizio db nel docker-compose.yml:
  db:
    image: mysql:8.0
    ports:
      - '3306:3306'
    # ... resto della config</code></pre>


<p class="wp-block-paragraph">Ora puoi collegarti a <code>localhost:3306</code> con le credenziali definite nel file <code>MYSQL_*</code>.</p>


<h2 class="wp-block-heading">Comandi essenziali da ricordare</h2>


<table class=wp-block-table>
<thead>
<tr>
<th>Comando</th>
<th>Funzione</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>docker-compose up -d</code></td>
<td>Avvia tutti i servizi in background</td>
</tr>
<tr>
<td><code>docker-compose down</code></td>
<td>Ferma e rimuove i container</td>
</tr>
<tr>
<td><code>docker-compose down -v</code></td>
<td>Ferma e rimuove anche i volumi (cancella il DB)</td>
</tr>
<tr>
<td><code>docker-compose exec app bash</code></td>
<td>Apre una shell dentro il container PHP</td>
</tr>
<tr>
<td><code>docker-compose logs -f</code></td>
<td>Mostra i log di tutti i container in tempo reale</td>
</tr>
<tr>
<td><code>docker-compose restart</code></td>
<td>Riavvia tutti i servizi</td>
</tr>
</tbody>
</table>


<h2 class="wp-block-heading">WordPress in Docker: la versione completa</h2>


<p class="wp-block-paragraph">Per WordPress il discorso si allunga, perché servono volumi persistenti per <code>wp-content</code>, un container per Redis (utile per la cache), e la gestione dei certificati HTTPS in sviluppo. Il risultato è un setup del genere:</p>


<pre class=wp-block-code><code># Versione WordPress completa
services:
  wordpress:
    image: wordpress:6.4-php8.2
    volumes:
      - wordpress_data:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - db
      - redis

  redis:
    image: redis:7-alpine
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru

  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

volumes:
  wordpress_data:
  db_data:</code></pre>


<h2 class="wp-block-heading">Conclusione</h2>


<p class="wp-block-paragraph">Docker non è magia: è un modo strutturato di dichiarare il tuo ambiente. Una volta che hai un <code>docker-compose.yml</code> funzionante, puoi distruggere tutto, ricrearlo su un'altra macchina, condividerlo con il team, e siete tutti sulla stessa configurazione. È il minimalismo che scale.</p>


<p class="wp-block-paragraph"><strong>I prossimi passi:</strong></p>


<ul class="wp-block-list">
<li>Prova ad aggiungere <strong>PHPMyAdmin</strong> come container</li>
<li>Configura <strong>MailHog</strong> per intercettare le email in sviluppo</li>
<li>Integra <strong>Blackfire</strong> o <strong>Tideways</strong> per il profiling</li>
</ul>


<h2 class="wp-block-heading">FAQ</h2>


<div class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"><summary><strong>Docker consuma molte risorse?</strong></summary><p>Dipende da cosa fai girare. Un setup PHP+Nginx+MySQL minimale usa circa 500MB di RAM in idle. In confronto a un server LAMP completo, è molto meno.</p></div>


<div class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"><summary><strong>Posso usare Docker su Windows Home?</strong></summary><p>Sì, ma devi usare WSL2 backend, non Docker Desktop Toolbox. WSL2 richiede Windows 10 21H2 o successivo, o Windows 11.</p></div>


<div class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"><summary><strong>Come faccio debug con Xdebug?</strong></summary><p>Con Xdebug attivo nel Dockerfile e una configurazione lato IDE che punta a <code>host.docker.internal:9003</code>, puoi usare breakpoints direttamente nel container. VS Code ha un launch.json già pronto per questo scenario.</p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/container-docker-php-setup-minimale/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
