Docker Management · 12 min read · Sep 22, 2025

Come installare e utilizzare Portainer per la gestione di Docker con Nginx Proxy Manager

Portainer è una soluzione di gestione dei container open-source per Docker, Kubernetes e Nomad che semplifica l’avvio, la creazione e l’esecuzione di container in modo semplice. Fornisce un dashboard basato sul web per gestire container, immagini, reti e volumi.

In questo tutorial, imparerai a installare e configurare la soluzione di gestione dei container Portainer su un server Linux e usarla per creare e gestire container Docker per eseguire diverse app. Imparerai anche a mettere questi container dietro Nginx utilizzando il gestore proxy Nginx.

Prerequisiti

  • Un server Linux che esegue Ubuntu / Debian / Cent OS / Rocky Linux 8 / Alma Linux.
  • Un utente non root con privilegi sudo.
  • Un Nome di Dominio Completo (FQDN) che punta al server per Portainer ( portrainer.example.com) e Nginx Proxy Manager ( npm.example.com).

Passo 1 - Configurare il Firewall

Cent OS/Rocky Linux/Alma Linux

Dovresti avere installato il firewall Firewalld. Controlla lo stato del firewall.

$ sudo firewall-cmd --state
running

Apri le porte 80, 9443 e 443. Portainer utilizza la porta 9443 per esporre la sua interfaccia web tramite HTTPS. Nginx Proxy Manager utilizza la porta 81 per la sua interfaccia.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=9443/tcp
$ sudo firewall-cmd --permanent --add-port=81/tcp

Ricarica il firewall per abilitare le modifiche.

$ sudo firewall-cmd --reload

Ubuntu/Debian

I sistemi Ubuntu e Debian utilizzano ufw (Uncomplicated Firewall) per impostazione predefinita.

Controlla se il firewall è in esecuzione.

$ sudo ufw status

Se è in esecuzione, apri le porte 80, 9443 e 443.

$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 9443
$ sudo ufw allow 81

Apri la porta SSH se il firewall non è in esecuzione.

$ sudo ufw allow "OpenSSH"

Abilita il firewall se non è in esecuzione.

$ sudo ufw enable

Se è in esecuzione, ricaricalo per applicare le modifiche.

$ sudo ufw reload

Passo 2 - Installare Docker

Cent OS/Rocky Linux/Alma Linux

Esegui il seguente comando per installare Docker.

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io

Ubuntu

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Debian

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Abilita e avvia il servizio Docker.

$ sudo systemctl start docker --now

Aggiungi il tuo nome utente al gruppo Docker.

$ sudo usermod -aG docker $USER

Disconnettiti dal sistema e riconnettiti per applicare la modifica.

Passo 3 - Installare Docker Compose

Scarica e installa il binario di Docker compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Applica i permessi di esecuzione al binario.

$ sudo chmod +x /usr/local/bin/docker-compose

Passo 4 - Installare Portainer

Crea una directory per Portainer.

$ mkdir ~/portainer

Passa alla directory.

$ cd ~/portainer

Crea e apri il file Docker Compose per la modifica.

$ nano docker-compose.yaml

Incolla il seguente codice in esso.

version: "3.3"
services:
    portainer:
      image: portainer/portainer-ce:latest
      container_name: portainer
      restart: always
      privileged: true
      volumes:
        - ./data:/data:Z
        - /var/run/docker.sock:/var/run/docker.sock:Z
      ports:
        - 9443:9443

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Esaminiamo il file Docker compose.

  • Stiamo estraendo l’ultima versione della Portainer Community Edition da Docker Hub. La Portainer Community Edition è gratuita, mentre la loro edizione Business richiede una licenza a pagamento. Puoi estrarre l’edizione Business, ma ti verrà chiesto il codice di licenza per usarla.
  • Abbiamo nominato il nostro container come portainer per scopi di identificazione e collegamento.
  • La politica di riavvio è impostata su always in modo che il container rimanga attivo durante l’avvio.
  • L’impostazione privileged: true è per consentire a Portainer di accedere al socket Docker e funzionare in un contesto privilegiato poiché stiamo usando SELinux. Se non stai usando SELinux, puoi rimuovere questa impostazione. Questa impostazione dà al container Portainer accesso a tutto il sistema host, incluso l’accesso all’hardware. Quindi, abilita questa impostazione solo quando sai cosa stai facendo.
  • La sezione volumes mappa la cartella sull’host alle cartelle nel container utilizzando i Bind mounts. Abbiamo esposto la directory ~/portainer/data al container per memorizzare eventuali dati pertinenti e l’API del socket Docker per la gestione dei container. L’etichetta :Z dice a Docker che stiamo eseguendo SELinux sul nostro host. Se non hai SELinux abilitato, dovresti rimuovere l’etichetta.

Avvia Portainer.

$ docker-compose up -d

Controlla lo stato del container.

$ docker ps
CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS         PORTS                                                           NAMES
916411e8d12e   portainer/portainer-ce:latest   "/portainer"   5 seconds ago   Up 4 seconds   8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   portainer

Passo 5 - Accedere e configurare Portainer

Apri l’URL https://:9443 nel tuo browser, e vedrai la seguente schermata.

Portainer Installation Screen

Ti verrà chiesto di creare un nuovo utente amministratore. Aggiungi i dettagli del tuo utente. Deseleziona la casella Consenti la raccolta di statistiche anonime se ti interessa la privacy. Clicca sul pulsante Crea utente per avviare l’installazione e creare un nuovo account amministratore.

Successivamente, verrai portato alla seguente schermata del dashboard.

Portainer Dashboard

Dopo pochi secondi, si aggiornerà automaticamente e ti mostrerà la seguente schermata.

Portainer Home

Mostrerà l’ambiente locale in cui Portainer è in esecuzione. Clicca sull’ambiente locale per iniziare.

Portainer Environment Homepage

La maggior parte delle sezioni sono autoesplicative. La sezione Stacks aiuta a creare container utilizzando file Docker compose. Puoi distribuire container direttamente utilizzando la categoria Containers nella barra laterale. Puoi configurare l’attuale ambiente docker attraverso la sezione Hosts. La sezione App Templates viene fornita con file Docker compose preinstallati per installare le applicazioni più comuni. Puoi anche creare modelli personalizzati.

La sezione Settings ti consente di configurare varie impostazioni come l’aggiunta di registri Docker personalizzati, l’aggiunta di più host per Docker swarm, la configurazione dell’accesso degli utenti, il backup dei dati e la personalizzazione di Portainer.

Passo 5 - Mettere Portainer dietro un reverse proxy utilizzando Nginx Proxy Manager (NPM)

Prima di procedere, mettiamo Portainer dietro un reverse proxy utilizzando Nginx Proxy Manager. Nginx Proxy Manager è un’applicazione Docker che fornisce un’interfaccia di gestione web per configurare Nginx come host reverse proxy. Può anche essere utilizzato come host di reindirizzamento o di streaming.

Installare NPM

Il primo passo è creare una rete per Nginx Proxy Manager (NPM). Apri la sezione Networks e clicca sul pulsante Add Network per creare una nuova rete.

Portainer Networks List

Dai un nome alla rete e lascia tutte le impostazioni invariati. Clicca sul pulsante Create the network per terminare.

Portainer Create Network Page

Visita la sezione Stacks e crea un nuovo stack utilizzando il pulsante Add stack.

Portainer Stacks Page

Nomina lo stack come nginx-proxy-manager e incolla il seguente codice in esso.

version: "3.3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Aggiungi qualsiasi altra porta di streaming che desideri esporre
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "npm-db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
      DB_MYSQL_NAME: "npm"
      # Decommenta la riga qui sotto se IPv6 non è abilitato sul tuo host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./npm-data:/data:Z
      - ./letsencrypt:/etc/letsencrypt:Z
    depends_on:
      - npm-db
    networks:
      - npm-network
      - npm-internal

  npm-db:
    image: 'mariadb:latest'
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
    volumes:
      - ./npm-data/mysql:/var/lib/mysql:Z
    networks:
      - npm-internal

networks:
  npm-internal:
  npm-network:
    external: true

Portainer Add Stack Page

Abbiamo impostato due variabili di ambiente per impostare le password del database e dell’utente root MySQL. Portainer può essere utilizzato per impostare segreti utilizzando variabili di ambiente. Scorri verso il basso nella pagina e clicca sul pulsante Add environment variable per aggiungere password forti.

Portainer Stack Environment Variables

Clicca sul pulsante Deploy the stack per creare e avviare il container NPM.

Accedere a NPM

Apri l’URL https://:81 nel tuo browser, e vedrai la seguente schermata. Inserisci le seguenti credenziali predefinite per accedere.

Indirizzo email: [email protected] Password: changeme

Successivamente, ti verrà immediatamente chiesto di impostare un nome e un indirizzo email. Clicca sul pulsante Save, e ti verrà chiesto di creare una nuova password. Clicca di nuovo sul pulsante Save per iniziare.

Nginx Proxy Manager Dashboard

Visita Hosts >> Proxy Hosts e clicca sul pulsante Add Proxy Host.

Add Portainer as Proxy Host

Inserisci il nome di dominio come portainer.example.com. Scegli lo schema come https. Inserisci il nome del container come Forward Hostname e 9443 come Forward port. Seleziona le opzioni Block Common Exploits e Websockets Support.

Portainer NPM SSL options

Passa alla scheda SSL e seleziona Request a new SSL Certificate dal menu a discesa. Seleziona le opzioni Force SSL e HTTP/2 Support per proteggere e ottimizzare la tua connessione SSL. Inserisci l’indirizzo email per ricevere notifiche di rinnovo e accetta i termini di servizio. Clicca sul pulsante Save per terminare la configurazione del Proxy Host per Portainer.

Collegare Portainer al Container NPM

Abbiamo impostato l’host proxy, ma il container non è ancora collegato alla rete NPM. Torna al dashboard di Portainer, visita la sezione Containers e seleziona il container portainer.

Seleziona npm-network dal menu a discesa nella sezione Connected networks e clicca sul pulsante Join network per aggiungere il container Portainer alla rete del gestore proxy.

Portainer Connected Networks

Potresti ricevere un errore, ma aggiorna la pagina e dovresti vedere il container aggiunto alla rete NPM.

Portainer Connected to NPM

Dovresti essere in grado di accedere a Portainer utilizzando l’URL https://portainer.example.com nel tuo browser.

Puoi seguire una procedura simile per mettere NPM dietro un URL accessibile pubblicamente come https://npm.example.com come discusso nel nostro tutorial su Nginx Proxy Manager.

Ora che hai impostato un URL pubblico per Portainer, puoi rimuovere la porta 9443 esposta. Per farlo, torna al Terminale e passa alla directory di portainer.

$ cd ~/portainer

Apri il file Docker compose per la modifica.

$ nano docker-compose.yaml

Rimuovi la sezione delle porte commentandola, come mostrato di seguito.

version: "3.3"
services:
    portainer:
      image: portainer/portainer-ce:latest
      container_name: portainer
      restart: always
      privileged: true
      volumes:
        - ./data:/data:Z
        - /var/run/docker.sock:/var/run/docker.sock:Z
      #ports:
      #  - 9443:9443
      networks:
        - npm-network

networks:
  npm-network:
    external: true

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Qui, abbiamo aggiunto i dettagli della rete NPM perché dovremo riavviare il container Portainer.

Ferma il container Portainer.

$ docker-compose down --remove-orphans

Avvia di nuovo il container con la configurazione aggiornata.

$ docker-compose up -d

Passo 6 - Distribuire un container utilizzando il Modello di App

Portainer fornisce diversi modelli predefiniti per avviare applicazioni direttamente con una configurazione minima.

Portainer App Templates

Visita la sezione App Templates e seleziona un modello qualsiasi. Dagli un nome e seleziona la rete da utilizzare. Usa la sezione delle opzioni avanzate per distribuire porte, reti e mount di volume personalizzati.

Clicca sul pulsante Deploy the container per terminare la distribuzione della tua applicazione. Qui stiamo distribuendo il container Redis.

Portainer Redis App Deployment

Passo 7 - Gestire i Container

Gestiamo un container esistente. Apri la pagina dei container e vedrai tutti i container in esecuzione.

Portainer Containers List

Clicca sul container hw-redis recentemente creato per procedere.

Portainer Container Actions

In alto, puoi vedere un elenco di azioni che puoi eseguire su un container in esecuzione. Puoi fermare e uccidere il container. Ricreare creerà il container da zero. L’opzione Duplicate/Edit ti permetterà di creare un altro container identico permettendoti di cambiare le impostazioni prima di lanciarlo.

Lo Stato del Container mostra il tempo di esecuzione, l’indirizzo IP e altri dettagli sul container.

L’opzione Logs mostra l’output del comando docker logs. Poiché l’output del comando non è memorizzato nella cache, ogni volta che aggiorni la pagina, il comando viene eseguito da zero.

Portainer Container Logs

L’opzione Inspect esegue il comando docker inspect sul container e mostra il suo output.

Portainer Container Inspect

L’opzione Stats ti mostra l’utilizzo del container in tempo reale.

Portainer Container Stats

Puoi avviare la console del Container utilizzando l’opzione Console. Ti verrà chiesto il comando e l’utente di sistema da eseguire.

Portainer Container Console Configuration

Premi il pulsante Connect per avviare la console.

Portainer Container Console Shell

L’opzione Attach esegue il comando docker attach.

Ci sono altre opzioni nella pagina dei dettagli del Container. Puoi creare un’immagine utilizzando un container esistente. Altre opzioni includono la modifica della politica di riavvio di un container e la connessione o disconnessione di una rete a un container esistente.

Allegare un Container Esterno a Portainer

Creare qualsiasi container al di fuori di Portainer apparirà all’interno di esso purché sia creato sullo stesso sistema in cui Portainer è in esecuzione. Questo è possibile perché Portainer è collegato a Docker utilizzando il websocket.

Testiamo eseguendo il container Docker Hello World.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Controlla l’elenco dei container nel terminale. Stiamo usando il flag -a per mostrare l’elenco di tutti i container, inclusi quelli fermati. Puoi vedere il nome del container come sad_williamson.

$ docker ps -a
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS                     PORTS                                                                                  NAMES
5fa46b85d594   hello-world                       "/hello"                 3 minutes ago   Exited (0) 3 minutes ago                                                                                          sad_williamson
.....

Ora, controlla la pagina dei Container di Portainer, e il container hello world apparirà come fermato nell’elenco con lo stesso nome.

Portainer Hello World Container

Conclusione

Questo conclude il nostro tutorial su come installare e utilizzare Portainer per la gestione di Docker e Nginx Proxy Manager. Esploreremo la creazione di immagini docker, la creazione di container personalizzati e l’uso di Portainer con Docker swarm in un prossimo tutorial. Se hai domande, postale nei commenti qui sotto.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.