Video 02 - Docker PULL di immagini
Docker Hub come App Store dei container: pull immagini ufficiali, run, exec, logs, rimozione e primo web server Apache+PHP in container.
2. Di cosa parla questo video
In questo tutorial vediamo come utilizzare Docker Hub per scaricare le immagini e creare istanze (container). Inoltre creeremo un container con Apache e PHP, imparando pull, run, port mapping, volumi e gestione del ciclo di vita di immagini e container.
Docker Hub è l'App Store dei container: hub.docker.com con immagini ufficiali verificate httpd, php:apache, nginx, mysql. Comandi: docker search httpd, docker pull httpd, docker images per lista immagini, docker run -d -p 80:80 --name web httpd crea container da immagine, docker ps lista running, docker ps -a tutti, docker logs web, docker exec -it web bash shell dentro container, docker stop web, docker rm web rimuove container, docker rmi httpd rimuove immagine. Poi web server Apache+PHP: immagine php:8.2-apache contiene Apache + PHP, docker pull php:8.2-apache, creazione cartella mkdir ~/www && echo "<?php phpinfo(); ?>" > ~/www/index.php, run con volume docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache mappa cartella locale dentro container, browser localhost:8080 → phpinfo. Verifica docker exec -it apache-php ls /var/www/html.
Questo è il video dove si capisce Docker Hub. Nel video al minuto 6 mostro l'errore che confonde tutti: fanno docker run httpd senza pull prima e pensano non serva pull. Docker fa pull automatico se immagine non c'è, ma vi mostro pull esplicito per capire cache. Al minuto 12 mostro docker run senza -d: container parte in foreground e terminale bloccato, sembra freezato, dovete fare Ctrl+C e container si ferma. Sempre -d detached per web server. Al minuto 19 mostro volume senza path assoluto: -v www:/var/www/html con path relativo non funziona, serve ~/www assoluto o $(pwd)/www. E al minuto 24 mostro php:8.2-apache vs httpd: httpd è solo Apache senza PHP, se mettete index.php su httpd vedete codice sorgente non eseguito, serve immagine php:apache che ha modulo PHP.
3. Obiettivi di apprendimento
- ✅ Cos'è Docker Hub: registry pubblico, immagini ufficiali, tag, Docker Official Images
- ✅ Come fare il pull di un'immagine: docker pull nome:tag, cache, layers
- ✅ Come istanziare un'immagine (creare container): docker run -d -p --name, detached vs foreground
- ✅ Come rimuovere container e immagini: stop, rm, rmi, prune, gestione spazio
- ✅ Come creare un Web Server Apache-PHP in un container con volumi: php:apache + -v ~/www:/var/www/html + localhost:8080
Alla fine saprai navigare Docker Hub, cercare immagini ufficiali httpd e php:apache, fare pull esplicito con tag 8.2-apache, listare immagini con docker images, creare container Apache con port mapping 8080:80, entrare in shell con exec -it bash, vedere logs, montare volume locale ~/www dentro /var/www/html per sviluppo live, creare index.php con phpinfo() e testare su browser localhost:8080, fermare e rimuovere container e immagini con stop rm rmi, e distinguere httpd solo Apache vs php:apache con PHP integrato.
4. Perché Docker Hub - Da build locale a immagini ufficiali
Senza Hub, devi buildare tutto da zero. Con Hub, riusi immagini ufficiali:
| Senza Docker Hub (build locale) | Con Docker Hub (questo video) |
|---|---|
| Scrivi Dockerfile per Apache da zero, apt install httpd | docker pull httpd ufficiale, già pronta, verificata, ottimizzata |
| Immagine pesante, non ottimizzata | Immagine ufficiale leggera Alpine o Debian slim, layer cache |
| Devi gestire dipendenze PHP manualmente | php:8.2-apache già con Apache + PHP + moduli |
| No tag versioni, sempre latest instabile | Tag specifici 8.2-apache, 8.1-apache versioni stabili |
| Container senza volumi, codice dentro immagine | Volumi -v ~/www:/var/www/html sviluppo live senza rebuild |
| Rimuovi con rm -rf | docker stop, rm, rmi, prune gestione pulita |
Se vi chiedono "Cos'è Docker Hub? Differenza httpd e php:apache?", rispondete: "Docker Hub è registry pubblico di immagini Docker, come App Store, hub.docker.com con immagini ufficiali verificate Official Images, es. httpd Apache solo, nginx, mysql. docker pull scarica immagine con layer cache, docker run crea container da immagine. httpd è immagine solo Apache, se metti index.php lo mostra come testo non eseguito. php:8.2-apache è immagine ufficiale con Apache + PHP 8.2 + modulo libapache2-mod-php già configurato, così index.php con phpinfo() viene eseguito. Uso -v ~/www:/var/www/html per montare codice locale dentro container per sviluppo live senza rebuild, e -p 8080:80 per mappare porta container a host". Risposta da developer Docker.
5. Concetti chiave - Hub, pull, run, immagini, container, volumi base
Cuore del video, minuto 5-20:
6. Lab pratico - PULL Apache e creazione container Apache-PHP
Nel video (minuto 4-27):
- Docker Hub: browser hub.docker.com → cerca httpd → Official Image → Tags → 2.4, latest, alpine → cerca php → Official → Tags → 8.2-apache, 8.1-apache → leggi Dockerfile ufficiale
- PULL: PowerShell o Kali →
docker pull httpd→ scarica layer →docker images→ httpd latest 144MB,docker pull php:8.2-apache→ 400MB con PHP →docker images→ due immagini - RUN Apache solo:
docker run -d -p 80:80 --name web httpd→docker ps→ Running → browser localhost:80 → It works! →docker exec -it web bash→cat /usr/local/apache2/htdocs/index.html→exit→docker logs web→docker stop web && docker rm web - RUN Apache-PHP con volume:
mkdir ~/www→echo "<h1>Ciao Docker</h1>" > ~/www/index.html→echo "<?php phpinfo(); ?>" > ~/www/info.php→docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache→docker ps→ browser localhost:8080 → Ciao Docker, localhost:8080/info.php → phpinfo pagina PHP →docker exec apache-php ls -l /var/www/html→ vede index.html e info.php → modifica ~/www/index.html su host → refresh browser → cambia subito senza restart - Rimozione:
docker stop apache-php→docker rm apache-php→docker rmi httpd php:8.2-apache→docker imagesvuoto →docker system prunepulizia
It works!
exit docker logs web docker stop web docker rm web # Run Apache+PHP con volume per sviluppo live mkdir ~/www echo "Ciao Docker Apache PHP
" > ~/www/index.html echo "" > ~/www/info.php echo "" > ~/www/data.php docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache docker ps # ... 0.0.0.0:8080->80/tcp apache-php # Browser # http://localhost:8080 -> Ciao Docker Apache PHP # http://localhost:8080/info.php -> phpinfo() con versione PHP 8.2 # http://localhost:8080/data.php -> Data: 2026... docker exec apache-php ls -l /var/www/html # -rw-r--r-- 1 root root ... index.html # -rw-r--r-- 1 root root ... info.php # Modifica live senza rebuild echo "Modifica live!
" > ~/www/index.html # Browser refresh -> Modifica live! immediato # Gestione docker logs apache-php docker logs -f apache-php # follow docker stop apache-php docker start apache-php # riavvia docker rm -f apache-php # force rimozione anche se running # Rimuovi immagini docker rmi httpd docker rmi php:8.2-apache docker images # verifica vuoto docker system prune -a # pulisce tutto non usato (attenzione cancella tutto)Hub: hub.docker.com cerca httpd Official Tags. Pull: docker pull httpd e docker pull php:8.2-apache, docker images lista. Run: docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache -d detached, -p host:container, -v path assoluto ~/www non relativo, --name nome. Browser localhost:8080 index.html e info.php phpinfo. Exec: docker exec -it apache-php bash shell dentro, ls /var/www/html verifica volume. Logs: docker logs -f. Stop/rm: docker stop rm, docker rmi rimuove immagine, prune pulisce. httpd solo statico, php:apache per PHP. Nel video al minuto 25 mostro volume live modifica.
7. Errori comuni da evitare
- docker run senza -d: docker run -p 80:80 httpd senza -d → foreground blocca terminale, sembra freezato, Ctrl+C ferma container. Usa sempre -d per web server detached.
- Volume path relativo: -v www:/var/www/html invece di ~/www assoluto → crea volume anonimo chiamato www non monta cartella, file non visibili. Usa $(pwd)/www o ~/www assoluto.
- Porta 80 già occupata: -p 80:80 errore Bind for 0.0.0.0:80 failed port already allocated → Skype, IIS o altro Apache usa 80 → usa -p 8080:80 e browser localhost:8080.
- httpd invece di php:apache per PHP: usi httpd con index.php → browser mostra codice come testo non eseguito, perché httpd non ha PHP. Usa php:8.2-apache per PHP.
- docker rm con container running: docker rm web errore container running → devi prima docker stop web poi rm, o rm -f force.
- docker rmi con container attivo: rmi php:8.2-apache errore image is being used by container → stop e rm container prima poi rmi immagine.
- Permessi volume WSL2 Windows: su Windows file ~/www con permessi Windows non leggibili in container → chmod 755 ~/www o usa WSL2 home /home/user/www non /mnt/c/ per velocità e permessi.
httpd invece di php:apache + volume relativo + porta 80 occupata + run senza -d. Sintomo: localhost:80 non risponde, index.php mostra codice sorgente non phpinfo, file ~/www non visibili in container, terminale bloccato dopo run, errore port already allocated. Soluzione: usa php:8.2-apache per PHP, -v ~/www assoluto non www relativo, -p 8080:80 se 80 occupata browser localhost:8080, sempre -d detached, docker exec ls /var/www/html verifica file montati. Nel video al minuto 19 mostro httpd con index.php che mostra sorgente vs php:apache che esegue phpinfo.
8. Approfondimento: gestione immagini e container
Ciclo di vita completo:
| Comando | Cosa fa | Esempio |
|---|---|---|
| docker pull | Scarica immagine da Hub, layer cache | pull httpd, pull php:8.2-apache |
| docker images | Lista immagini locali, SIZE, ID | httpd 144MB, php 400MB |
| docker run -d -p --name -v | Crea e avvia container da immagine | run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache |
| docker ps / ps -a | Running / tutti anche fermi | ps mostra apache-php Up, ps -a anche Exited |
| docker logs / exec | Log e shell dentro container | logs -f follow, exec -it bash |
| docker stop / start / rm / rmi / prune | Ferma, riavvia, rimuove container/immagine/pulizia | stop rm -f, rmi, system prune -a attenzione |
Prossimo video: Dockerfile immagini personalizzate e PUSH su Docker Hub.
📚 Compito per casa
Fai PULL: docker pull httpd e docker pull php:8.2-apache, docker images verifica 144MB e 400MB. Crea cartella mkdir ~/www, crea 3 file: index.html con <h1>Ciao Docker</h1>, info.php con <?php phpinfo(); ?>, data.php con <?php echo date('Y-m-d H:i:s'); ?>. RUN Apache solo: docker run -d -p 80:80 --name web httpd, browser localhost It works!, docker exec -it web bash cat index.html, stop rm. RUN Apache-PHP: docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache, browser localhost:8080, localhost:8080/info.php phpinfo, localhost:8080/data.php data, docker exec ls /var/www/html verifica, modifica ~/www/index.html su host con echo Modifica live! refresh browser live, docker logs, docker stop rm, docker rmi. Screenshot localhost:8080/info.php phpinfo + docker ps + docker images. Mandamelo prima del Video 3 Dockerfile.