Video 02 - Docker PULL di immagini | Prof. Giagnotti
🎥 VIDEO 02 · DOCKER · DOCKER HUB + PULL + APACHE PHP
✍ Autore: profgiagnotti

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.

Video 02 Docker Hub PULL + RUN Apache PHP ~30 min di video 📑 Stampa → ▶ YouTube Aggiornata 2025/26

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.

💬 Nota del docente - Perché ho fatto questo video

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
🎯 Cosa saprai fare dopo questo video

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 httpddocker pull httpd ufficiale, già pronta, verificata, ottimizzata
Immagine pesante, non ottimizzataImmagine ufficiale leggera Alpine o Debian slim, layer cache
Devi gestire dipendenze PHP manualmentephp:8.2-apache già con Apache + PHP + moduli
No tag versioni, sempre latest instabileTag specifici 8.2-apache, 8.1-apache versioni stabili
Container senza volumi, codice dentro immagineVolumi -v ~/www:/var/www/html sviluppo live senza rebuild
Rimuovi con rm -rfdocker stop, rm, rmi, prune gestione pulita
🎯 Domanda da colloquio / esame

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:

DOCKER HUB - CONCETTI CHIAVE
Docker Hub: hub.docker.com, registry pubblico, account gratuito Immagini ufficiali: Official Images con badge, verificate da Docker, es. httpd, php, nginx, mysql Tag: versione, es. php:8.2-apache, php:8.1-apache, httpd:latest, httpd:2.4-alpine, latest = ultima ma instabile Search: docker search httpd, docker search php --filter is-official=true Immagine vs Container: Immagine: template read-only, immutabile, composta da layer, es. httpd 144MB Container: istanza eseguibile di immagine, layer read-write sopra, isolato, effimero docker images → lista immagini locali docker ps → container running, docker ps -a → tutti anche fermi Pull: docker pull httpd → scarica latest da Hub, layer con cache docker pull php:8.2-apache → tag specifico 8.2 + Apache Se fai docker run senza immagine locale, fa pull automatico implicito Run: docker run [opzioni] immagine [comando] -d detached background, senza -d foreground blocca terminale -p host:container port mapping, es. -p 8080:80 host 8080 → container 80 --name nome container, es. --name apache-php -v host:container volume mapping, es. -v ~/www:/var/www/html --rm rimuove container quando si ferma (utile per test) Es. docker run -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache Gestione: docker logs nome → log container, docker logs -f follow docker exec -it nome bash → shell dentro container (it interactive tty) docker exec nome ls /var/www/html → comando singolo docker stop nome → ferma container (SIGTERM) docker start nome → riavvia container fermo docker rm nome → rimuove container (deve essere fermo, o -f force) docker rmi immagine → rimuove immagine (se nessun container la usa) docker system prune -a → pulisce tutto non usato (attenzione!) Volumi base (Video 2 base, Video 4 approfondito): -v ~/www:/var/www/html → monta cartella host dentro container Modifica file in ~/www su host → visibile subito in container senza rebuild ~/www deve essere path assoluto, non relativo www In WSL2 ~/www è /home/user/www, in Windows C:\Users\user\www → /mnt/c/... httpd vs php:apache: httpd → solo Apache, serve solo html statico, index.php mostrato come testo php:8.2-apache → Apache + PHP 8.2 + mod_php, esegue php, serve phpinfo() Per PHP serve php:apache, non httpd
httpd (SOLO APACHE)
Solo Apache, html statico, index.php mostrato come sorgente non eseguito, immagine leggera, per siti statici.
php:8.2-apache (APACHE+PHP - QUESTO VIDEO)
Apache + PHP 8.2 integrato con mod_php, esegue index.php con phpinfo(), per siti dinamici PHP, necessario per LAMP base.

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 images vuoto → docker system prune pulizia
DOCKER - PULL + RUN APACHE PHP
# Docker Hub - Cerca e Pull docker search httpd docker search php --filter is-official=true docker pull httpd # Using default tag: latest # latest: Pulling from library/httpd # Digest: sha256:... # Status: Downloaded newer image for httpd:latest docker pull php:8.2-apache # 8.2-apache: Pulling from library/php # Status: Downloaded newer image for php:8.2-apache docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # php 8.2-apache abc123 2 days ago 400MB # httpd latest def456 3 days ago 144MB # Run Apache solo statico docker run -d -p 80:80 --name web httpd docker ps # CONTAINER ID ... IMAGE httpd ... PORTS 0.0.0.0:80->80/tcp NAMES web # Browser -> http://localhost -> It works! docker exec -it web bash # Entri nel container cat /usr/local/apache2/htdocs/index.html #

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)
🔧 Docker Hub cheat sheet

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.
⚠️ Errore che blocca Apache PHP al 100%

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:

ComandoCosa faEsempio
docker pullScarica immagine da Hub, layer cachepull httpd, pull php:8.2-apache
docker imagesLista immagini locali, SIZE, IDhttpd 144MB, php 400MB
docker run -d -p --name -vCrea e avvia container da immaginerun -d -p 8080:80 -v ~/www:/var/www/html --name apache-php php:8.2-apache
docker ps / ps -aRunning / tutti anche fermips mostra apache-php Up, ps -a anche Exited
docker logs / execLog e shell dentro containerlogs -f follow, exec -it bash
docker stop / start / rm / rmi / pruneFerma, riavvia, rimuove container/immagine/puliziastop 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.

9. Risorse correlate