Cas Pràctic - Projecte Fitxers (Generaciò de Web Estàtica)
Volem desplegar el nostre projecte de la 1a Avaluació (Projecte Fitxers) que genera fitxers HTML a partir d’un fitxer JSON i volem servir-los amb NGINX.
Per poder desplegar amb NGINX pagines web estàtiques, hem de mapejar les carpetes del nostre projecte amb les carpetes del contenidor NGINX.
Usarem la comnada docker run
per a iniciar un contenidor NGINX i mapejar les carpetes del nostre projecte.
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -p 8080:80 -d nginx
Pas a pas…
docker run
- Crea i executa un contenidor Docker.
El contenidor es basa en una imatge Docker (en aquest cas, la imatge nginx).
Cada vegada que utilitzem docker run
, Docker farà tres coses:
- Descarregar la imatge de Docker Hub (si no la tens).
- Crear un contenidor a partir de la imatge.
- Executar el contenidor amb la configuració que li has passat.
--name some-nginx
Esta opció assigna un nom personalitzat al contenidor.
- El contenidor es dirà en este cas
some-nginx
. - Amb este nom, podràs utilitzar comandes de Docker per a interactuar amb el contenidor.
Exemples de comandes per a usar el nom del contenidor:
docker stop some-nginx # Para el contenidor "some-nginx"
docker start some-nginx # Torna a iniciar el contenidor "some-nginx"
docker logs some-nginx # Mostra els registres (logs) del contenidor
docker rm some-nginx # Elimina el contenidor
-v /some/content:/usr/share/nginx/html:ro
Aquesta opció crea un volum de Docker.
/some/content
: És la carpeta al teu sistema host (Linux, Windows o macOS)./usr/share/nginx/html
: És la carpeta dins del contenidor NGINX.:ro
: Indica que el volum és només lectura (“read-only”).
Què està passant ací?
- Es diu a Docker que mapege (connecte) la carpeta
/some/content
del teu sistema host amb la carpeta/usr/share/nginx/html
dins del contenidor. - NGINX utilitza /usr/share/nginx/html com a la seua carpeta arrel, on es troben els arxius HTML, CSS, JS que NGINX servirà.
- El contenidor no podrà modificar els arxius de la carpeta
/some/content
(per això està en mode només lectura:ro
).
Exemple:
Si al nostre sistema tenim la carpeta /jaume/vaigaaprovar/
amb aquesta estructura:
/jaume/vaigaaprovar/
┣ 📄 index.html
┣ 📄 about.html
┗ 📁 css/
┗ 📄 styles.css
Quan accedim a http://localhost/index.html, veurem l’arxiu index.html de la carpeta /jaume/vaigaaprovar/
.
-p 8080:80
Exposa el port 80 dins del contenidor docker al port de la nostra maquina o host 8080.
El contenidor NGINX s’executa i escolta el port 80 dins del contenidor, amb -p
Docker realitza una assignació de ports entre el contenidor i la maquina host, el que ens permetrà accedir al servidor NGINX des de http://localhost:8080
Es a dir, amb -p 8080:80
, el port 80 del contenidor s’associa amb el port 8080 de la màquina host, permetent accedir a NGINX des de http://localhost:8080.
Si no es fa esta assinació no podrem accedir des del host.
-d
Aquesta opció “desacobla” (detach) el contenidor de la terminal.
- Sense esta opció, el contenidor s’executa i mostra els registres (logs) a la terminal.
- Amb esta opció, el contenidor s’executa en segon pla.
Com pots veure els contenidors en execució?
Si executem esta comanda:
docker ps
Veuràs alguna cosa paregunda a:
CONTAINER ID IMAGE COMMAND PORTS NAMES
123456abcdef nginx "/docker-entrypoint.…" 0.0.0.0:80->80/tcp some-nginx
El contenidor some-nginx
estarà funcionant en segon pla.
nginx
nginx
Este és el nom de la imatge Docker que es farà servir.
- Si la imatge no està al teu ordinador, Docker la descarregarà de Docker Hub.
- La imatge de NGINX inclou un servidor web llest per a servir arxius HTML, CSS, JS.
- Aquesta imatge de NGINX serveix els arxius de la carpeta /usr/share/nginx/html (dins del contenidor).
Per tant, si volem servir els arxius HTML i CSS del nostre projecte, podem utilitzar la comanda:
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -p 8080:80 -d nginx
Resum
- Creem i executem un contenidor amb la imatge de NGINX.
- Assignem el nom
some-nginx
al contenidor. - Mapejem la carpeta
/some/content/
(del nostre PC) a/usr/share/nginx/html/
(al contenidor NGINX). - NGINX serveix els arxius estàtics que estiguen a la carpeta /some/content/.
- Exposa el port 80 del contenidor al port 8080 del host perquè es puga accedir al servidor NGINX des del navegador amb la URL http://localhost:8080.
- S’executa en segon pla (-d), per la qual cosa no ocupa la terminal.
Consideracions
Què passa si no utilitze -v /some/content:/usr/share/nginx/html
?
NGINX utilitzarà la carpeta per defecte /usr/share/nginx/html que està dins de la imatge Docker.
Esta carpeta només conté una pàgina HTML per defecte, Benvingut a NGINX.
Per a què serveix :ro
(mode només lectura)?
Quan utilitzes :ro
, li dius a Docker que NGINX no pot modificar els arxius a la carpeta /some/content/
.
Això evita que el contenidor sobreescriga els arxius al teu ordinador.
Si no vols només lectura, pots ometre :ro
, i la carpeta serà accessible amb permisos d’escriptura.
Com puc actualitzar els arxius HTML i CSS?
Ja que estem mapejant la carpeta /some/content/
, podem modificar els arxius al nostre sistema de fitxers local.
Els canvis es reflectiran automàticament en http://localhost/index.html.
Exemple:
echo "<h1>Pàgina actualitzada!</h1>" > /some/content/index.html
Accedeix de nou a http://localhost/index.html i veuràs els canvis.
Projecte Fitxers amb NGINX
Partim de la següent estructura de carpetes i fitxers:
📦 **ADA-P1-CiutatsNginx**
├── 📁 .idea # Configuració de l'entorn IntelliJ IDEA
├── 📁 src
│ ├── 📁 main # Conté el codi principal de l'aplicació
│ │ ├── 📁 java # Fitxers amb codi font Java
│ │ └── 📁 resources # Recursos estàtics i dinàmics
│ │ ├── 📁 css # Arxius CSS per als estils
│ │ ├── 📁 fitxersWeb # HTML generat que es servirà per NGINX
│ │ ├── 📁 json # Fitxers JSON amb les dades d'entrada
│ │ └── 📁 templates # Plantilles Thymeleaf per generar HTML
├── 📁 target # Carpeta on Maven generarà els arxius compilats
└── 📄 .gitignore # Arxius i carpetes ignorats pel sistema de control de versions
-
Exercici 1 : Servir amb NGINX tota la carpeta
resources
del projecte. -
Exercici 2 : Servir amb NGINX la carpeta
fitxersWeb
icss
del projecte.
També tindràs que mapejar la carpeta d’imatges si existeix.
Per a este exercici, usa l’expressió:
docker run --name nginx-static-server \
-v $(pwd)/src/main/resources/fitxersWeb:/usr/share/nginx/html:ro \
-v $(pwd)/src/main/resources/css:/usr/share/nginx/html/css:ro \
-p 8080:80 -d nginx
on:
--name nginx-static-server
: Assigna un nom al contenidor Docker.-v $(pwd)/src/main/resources/fitxersWeb:/usr/share/nginx/html:ro
:
Mapeja la carpetafitxersWeb
com a la carpeta arrel que NGINX servirà.-v $(pwd)/src/main/resources/css:/usr/share/nginx/html/css:ro
:
Mapeja la carpetacss
dins de la carpeta arrel de NGINX per als estils.-p 8080:80
: Redirecciona el port 80 del contenidor al port 8080 del teu sistema local.-d nginx
: Inicia NGINX en segon pla.
$(pwd)
és una ordre de shell que s’utilitza per a obtindre la ruta completa del directori de treball actual. És una forma de capturar i utilitzar dinàmicament la ubicació actual de la terminal.
Atenciò
Quan NGINX serveix els arxius:
resources/fitxersWeb
es mapetja a/usr/share/nginx/html
(arrel del servidor).resources/css
es mapetja a/usr/share/nginx/html/css
.
per tant, cal tindre amb compte les rutes relatives:
<link rel="stylesheet" href="css/monument.css">
canviar a
<link rel="stylesheet" href="/css/monument.css">
Comandes que pots utilitzar
- Llistar contenidors docker actius:
docker docker ps
- Llistar contenidors actius i inactius:
docker docker ps -a
- Parar el contenidor:
docker stop some-nginx
- Eliminar el contenidor:
docker rm some-nginx
- Reinicar el contenidor:
docker restart some-nginx
Per a entrar en el sistema de fitxers del contenidor NGINX:
docker exec -it p1-nginx /bin/sh
Una volta dins podem accedir als arxius que hem servit amb:
cd /usr/share/nginx/html
ls -l