port mapping
This commit is contained in:
@@ -34,3 +34,85 @@ Esistono diverse tipologie di networking che possono essere utilizzate in Docker
|
|||||||
- `host`: in questa modalità, il container condivide l'interfaccia di rete con il sistema host. Non vi è alcun isolamento, pertanto qualsiasi processo eseguito all'interno del container ha accesso diretto alla rete dell'host. Questo tipo di accesso alla rete è analogo a quello di un browser web su un sistema operativo
|
- `host`: in questa modalità, il container condivide l'interfaccia di rete con il sistema host. Non vi è alcun isolamento, pertanto qualsiasi processo eseguito all'interno del container ha accesso diretto alla rete dell'host. Questo tipo di accesso alla rete è analogo a quello di un browser web su un sistema operativo
|
||||||
- `bridge`: questo driver fornisce isolamento tra l'host e i container, consentendo la creazione di reti virtuali. Tali reti operano in uno spazio di indirizzamento separato rispetto al sistema host e alla rete fisica, permettendo ai container di comunicare tra loro in modo privato o semi-privato. Questa modalità è la più comune e preferita per la maggior parte delle applicazioni Docker
|
- `bridge`: questo driver fornisce isolamento tra l'host e i container, consentendo la creazione di reti virtuali. Tali reti operano in uno spazio di indirizzamento separato rispetto al sistema host e alla rete fisica, permettendo ai container di comunicare tra loro in modo privato o semi-privato. Questa modalità è la più comune e preferita per la maggior parte delle applicazioni Docker
|
||||||
- `null`: in questa configurazione, il container è completamente isolato dalla rete, non avendo alcuna connettività di rete disponibile
|
- `null`: in questa configurazione, il container è completamente isolato dalla rete, non avendo alcuna connettività di rete disponibile
|
||||||
|
|
||||||
|
## Port mapping
|
||||||
|
|
||||||
|
Il seguente stack di esempio è composto da due servizi: `php` e `nginx`. In particolare, il servizio nginx espone due porte: la porta 80 del container sulla porta 8080 del sistema host e la porta 443 del container sulla porta 8443 dell'host.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
php:
|
||||||
|
image: 'php:8.1-fpm'
|
||||||
|
container_name: ${APP_NAME:?err}-php
|
||||||
|
volumes:
|
||||||
|
- './app:/var/www/html'
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: 'nginx:latest'
|
||||||
|
container_name: ${APP_NAME:?err}-nginx
|
||||||
|
ports:
|
||||||
|
- '8081:80'
|
||||||
|
- '8443:443'
|
||||||
|
volumes:
|
||||||
|
- './app:/var/www/html'
|
||||||
|
- './config/nginx:/etc/nginx/conf.d'
|
||||||
|
```
|
||||||
|
|
||||||
|
Se si avvia lo stack con il comando `docker compose up -`d, il comando `docker ps` conferma che nginx è in esecuzione e in ascolto su tutte le interfacce di rete (`0.0.0.0`) alla porta 8080.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
73a0991fb71b nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp eager_northcutt
|
||||||
|
```
|
||||||
|
|
||||||
|
Accedendo a `localhost:8080`, è possibile raggiungere il sito web servito dallo stack. Tuttavia, questo consente anche a chiunque si trovi sulla stessa rete o, se presente il NAT sul router, a chiunque conosca l'indirizzo IP del sistema host di accedere al servizio.
|
||||||
|
|
||||||
|
Per limitare l'accesso al servizio nginx in modo che sia raggiungibile solo dal sistema host, è necessario modificare la configurazione dello stack affinché ascolti solo su localhost e non su tutte le interfacce di rete:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
nginx:
|
||||||
|
image: 'nginx:latest'
|
||||||
|
container_name: ${APP_NAME:?err}-nginx
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:8081:80'
|
||||||
|
- '127.0.0.1:8443:443'
|
||||||
|
```
|
||||||
|
|
||||||
|
Se non è importante che le porte associate sul sistema host siano sempre le stesse, è possibile **allocarle dinamicamente**, in modo da sceglierne sempre una disponibile, evitando conflitti:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
nginx:
|
||||||
|
image: 'nginx:latest'
|
||||||
|
container_name: ${APP_NAME:?err}-nginx
|
||||||
|
ports:
|
||||||
|
- '80'
|
||||||
|
- '443'
|
||||||
|
```
|
||||||
|
|
||||||
|
Le porte sono ora allocate in modo casuale:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
654f739ce935 nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:32770->80/tcp, [::]:32770->80/tcp crazy_jackson
|
||||||
|
```
|
||||||
|
|
||||||
|
Se si desidera che Docker assegni automaticamente una porta disponibile in `localhost`, è possibile utilizzare la seguente sintassi:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
nginx:
|
||||||
|
image: 'nginx:latest'
|
||||||
|
container_name: ${APP_NAME:?err}-nginx
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:0:80' # Assegna una porta casuale su localhost
|
||||||
|
```
|
||||||
|
|
||||||
|
In questo caso, `127.0.0.1:0` indica a Docker di scegliere automaticamente una porta disponibile sul sistema host, associandola alla porta 80 del container.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
6559daa92656 nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 127.0.0.1:32769->80/tcp nginx
|
||||||
|
```
|
||||||
|
Reference in New Issue
Block a user