Ricerca nel sito web

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


Su questa pagina

  1. Prerequisiti
  2. Passaggio 1: configurazione del firewall
    1. Cent OS/Rocky Linux/Alma Linux
    2. Ubuntu/Debian

    1. Cent OS/Rocky Linux/Alma Linux
    2. Ubuntu
    3. Debian

    1. Installa NPM
    2. Accedi a NPM
    3. Collega Portainer al contenitore NPM

    1. Attacca un contenitore esterno a Portainer

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

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

    Prerequisiti

    • Un server Linux con 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 ).

    Passaggio 1: configurare il firewall

    Sistema operativo Cent/Rocky Linux/Alma Linux

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

    $ sudo firewall-cmd --state
    running
    

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

    $ 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
    

    Passaggio 2: installa Docker

    Sistema operativo Cent/Rocky Linux/Alma Linux

    Eseguire 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
    

    Disconnettersi dal sistema e riconnettersi per applicare la modifica.

    Passaggio 3: installa Docker Compose

    Scarica e installa il binario di composizione di Docker.

    $ 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
    

    Applicare l'autorizzazione eseguibile al file binario.

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

    Passaggio 4: installare Portainer

    Crea una directory per Portainer.

    $ mkdir ~/portainer
    

    Passa alla rubrica.

    $ cd ~/portainer
    

    Crea e apri il file Docker Compose per la modifica.

    $ nano docker-compose.yaml
    

    Incolla il seguente codice al suo interno.

    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 di composizione Docker.

    • Stiamo ritirando l'ultima versione di Portainer Community Edition da Docker Hub. Portainer Community Edition è gratuito, mentre la loro edizione Business richiede una licenza a pagamento. Puoi ritirare la Business Edition, ma ti verrà chiesto il codice di licenza per utilizzarla.
    • Abbiamo chiamato il nostro contenitore come portainer per scopi di identificazione e collegamento.
    • La politica di riavvio è impostata su sempre in modo che il contenitore rimanga attivo durante l'avvio.
    • L'impostazione privileged: true consente a Portainer di accedere al socket Docker ed eseguire in un contesto privilegiato poiché stiamo utilizzando SELinux. Se non stai usando SELinux, puoi rimuovere questa impostazione. Questa impostazione consente al contenitore Portainer di accedere a tutto sul sistema host, incluso l'accesso all'hardware. Quindi, abilita questa impostazione solo quando sai cosa stai facendo.
    • La sezione volumes associa la cartella sull'host alle cartelle nel contenitore utilizzando i montaggi Bind. Abbiamo esposto la directory ~/portainer/data al contenitore per l'archiviazione di tutti i dati rilevanti e l'API del socket Docker per la gestione del contenitore. L'etichetta :Z indica 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 contenitore.

    $ 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
    

    Passaggio 5: accesso e configurazione di Portainer

    Apri l'URL https://:9443 nel tuo browser e otterrai la seguente schermata.

    Ti verrà chiesto di creare un nuovo utente amministratore. Aggiungi i tuoi dati utente. Deseleziona la casella Consenti la raccolta di statistiche anonime se ti interessa la privacy. Fare clic sul pulsante Crea utente per avviare l'installazione e creare un nuovo account amministratore.

    Successivamente, verrai indirizzato alla seguente schermata del dashboard.

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

    Ti mostrerà l'ambiente locale in cui è in esecuzione Portainer. Fare clic sull'ambiente locale per iniziare.

    La maggior parte delle sezioni sono autoesplicative. La sezione Stack aiuta a creare contenitori utilizzando i file di composizione Docker. Puoi distribuire i contenitori direttamente utilizzando la categoria Contenitori nella barra laterale. È possibile configurare l'ambiente docker corrente tramite la sezione Host. La sezione Modelli di app viene fornita con i file di composizione Docker preinstallati per l'installazione delle applicazioni più comuni. Puoi anche creare modelli personalizzati.

    La sezione Impostazioni consente di configurare varie impostazioni come l'aggiunta di registri Docker personalizzati, l'aggiunta di più host per lo sciame Docker, la configurazione dell'accesso utente, il backup dei dati e la personalizzazione di Portainer.

    Passaggio 5: posiziona Portainer dietro un proxy inverso utilizzando Nginx Proxy Manager (NPM)

    Prima di andare avanti, mettiamo Portainer dietro un proxy inverso usando Nginx Proxy Manager. Nginx Proxy Manager è un'applicazione Docker che fornisce un'interfaccia utente di gestione Web per configurare Nginx come host proxy inverso. Può anche essere utilizzato come reindirizzamento o host di streaming.

    Installa NPM

    Il primo passo è creare una rete per Nginx Proxy Manager (NPM). Apri la sezione Reti e fai clic sul pulsante Aggiungi rete per creare una nuova rete.

    Dai un nome alla rete e lascia invariate tutte le impostazioni. Fare clic sul pulsante Crea la rete per terminare.

    Visita le pile e crea una nuova pila utilizzando il pulsante Aggiungi pila.

    Assegna allo stack il nome nginx-proxy-manager e incolla il seguente codice al suo interno.

    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
          # Add any other Stream port you want to expose
          # - '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"
          # Uncomment the line below if IPv6 is not enabled on your 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
    

    Abbiamo impostato due variabili di ambiente per impostare le password MySQL del database e di root. Portainer può essere utilizzato per impostare segreti utilizzando variabili di ambiente. Scorri la pagina verso il basso e fai clic sul pulsante Aggiungi variabile di ambiente per aggiungere password complesse.

    Fare clic sul pulsante Distribuisci lo stack per creare e avviare il contenitore NPM.

    Accedi a NPM

    Apri l'URL https://:81 nel tuo browser e otterrai la seguente schermata. Immettere le seguenti credenziali predefinite per accedere.

    Indirizzo email: [email  Password: changeme

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

    Visita Host >> Host proxy e fai clic sul pulsante Aggiungi host proxy.

    Inserisci il nome di dominio come portainer.example.com. Scegli lo schema come https. Immettere il nome del contenitore come Forward Hostname e 9443 come Forward port. Seleziona le opzioni Blocca exploit comuni e Opzioni supporto Websocket.

    Passa alla scheda SSL e seleziona Richiedi un nuovo certificato SSL dal menu a discesa. Controlla le opzioni Forza SSL e supporto HTTP/2 per proteggere e ottimizzare la tua connessione SSL. Inserisci l'indirizzo e-mail per ricevere le notifiche di rinnovo e accettare i termini di servizio. Fare clic sul pulsante Salva per terminare la configurazione dell'host proxy per Portainer.

    Connettere Portainer al contenitore NPM

    Abbiamo configurato l'host proxy, ma il contenitore non è ancora connesso alla rete NPM. Torna alla dashboard di Portainer, visita la sezione Contenitori e seleziona il contenitore di Portainer.

    Seleziona npm-network dal menu a discesa nella sezione Reti connesse e fai clic sul pulsante Unisciti alla rete per aggiungere il contenitore Portainer alla rete dei gestori proxy.

    Potresti ricevere un errore ma aggiornare la pagina e dovresti vedere il contenitore aggiunto alla rete 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 pubblicamente accessibile 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 portainer.

    $ cd ~/portainer
    

    Apri il file di composizione Docker 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 contenitore Portainer.

    Arrestare il contenitore Portainer.

    $ docker-compose down --remove-orphans
    

    Avviare nuovamente il contenitore con la configurazione aggiornata.

    $ docker-compose up -d
    

    Passaggio 6: distribuire un contenitore utilizzando il modello di app

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

    Visita la sezione Modelli di app e seleziona qualsiasi modello. Assegnagli un nome e seleziona la rete da utilizzare. Utilizza la sezione delle opzioni avanzate per distribuire porte, reti e montaggi di volumi personalizzati.

    Fare clic sul pulsante Distribuisci il contenitore per terminare la distribuzione dell'applicazione. Qui stiamo distribuendo il contenitore Redis.

    Passaggio 7: gestire i contenitori

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

    Fai clic sul contenitore hw-redis creato di recente per procedere.

    In alto, puoi vedere un elenco di azioni che puoi eseguire su un container in esecuzione. Puoi fermare e uccidere il contenitore. Recreate creerà il contenitore da zero. L'opzione Duplica/Modifica ti consentirà di creare un altro contenitore identico consentendo la possibilità di modificare le impostazioni prima di avviarlo.

    Lo stato del contenitore mostra il tempo di esecuzione, l'indirizzo IP e altri dettagli sul contenitore.

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

    L'opzione Inspect esegue il comando docker inspect sul contenitore e ne mostra l'output.

    L'opzione Statistiche mostra l'utilizzo del contenitore in tempo reale.

    È possibile avviare la console del contenitore utilizzando l'opzione Console. Verrà richiesto il comando e l'utente di sistema da eseguire.

    Premi il pulsante Connetti per avviare la console.

    L'opzione Attach esegue il comando docker attach.

    Ci sono altre opzioni nella pagina dei dettagli del contenitore. Puoi creare un'immagine utilizzando un contenitore esistente. Altre opzioni includono la modifica di un criterio di riavvio dei contenitori e la connessione o la disconnessione di una rete a un contenitore esistente.

    Attacca un contenitore esterno a Portainer

    La creazione di qualsiasi contenitore al di fuori di Portainer verrà visualizzata al suo interno purché venga creata sullo stesso sistema in cui è in esecuzione Portainer. Questo è possibile perché Portainer è collegato a Docker tramite il websocket.

    Proviamo eseguendo il container Hello World Docker.

    $ 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 contenitori nel terminale. Stiamo usando il flag -a per mostrare l'elenco di tutti i contenitori, compresi quelli bloccati. Puoi vedere il nome del contenitore 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 Portainer Containers e il contenitore hello world verrà visualizzato come bloccato nell'elenco con lo stesso nome.

    Conclusione

    Questo conclude il nostro tutorial sull'installazione e l'utilizzo di Portainer per la gestione di Docker e Nginx Proxy Manager. Esploreremo la creazione di immagini docker, la creazione di contenitori personalizzati e l'utilizzo di Portainer con Docker swarm in un prossimo tutorial. Se hai domande, pubblicale nei commenti qui sotto.