Portainer installeren en gebruiken voor Docker beheer met Nginx Proxy Manager

Portainer is een open-source container management oplossing voor Docker, Kubernetes, en Nomad die het starten, maken en draaien van containers op een eenvoudige manier vereenvoudigt. Het biedt een webgebaseerd dashboard om containers, images, netwerken, en volumes te beheren.

In deze zelfstudie leer je de Portainer container management oplossing op een Linux server te installeren en te configureren, en te gebruiken om Docker containers te maken en te beheren om verschillende apps te draaien. Je leert ook om deze containers achter Nginx te zetten met de Nginx proxy manager.

Vereisten

  • Een Linux server met Ubuntu / Debian / Cent OS / Rocky Linux 8 / Alma Linux.
  • Een niet-root gebruiker met sudo privileges.
  • Een Fully Qualified Domain Name (FQDN) die wijst naar de server voor Portainer (portrainer.example.com) en Nginx Proxy Manager (npm.example.com).

Stap 1 – Firewall instellen

Cent OS/Rocky Linux/Alma Linux

Je zou de Firewalld firewall geïnstalleerd moeten hebben. Controleer de status van de firewall.

$ sudo firewall-cmd --state
running

Open poorten 80, 9443 en 443. Portainer gebruikt poort 9443 om zijn web UI via HTTPS bloot te stellen.Nginx Proxy Manager gebruikt poort 81 voor zijn UI.

$ 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

Herlaad de firewall om de veranderingen in te schakelen.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Ubuntu en Debian systemen gebruiken standaard ufw (Uncomplicated Firewall).

Controleer of de firewall draait.

$ sudo ufw status

Als hij draait, open dan poorten 80, 9443 en 443.

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

Open de SSH poort als de firewall niet draait.

$ sudo ufw allow "OpenSSH"

Schakel de firewall in als hij niet draait.

$ sudo ufw enable

Als hij wel draait, herlaad hem dan om de veranderingen toe te passen.

$ sudo ufw reload

Stap 2 – Installeer Docker

Cent OS/Rocky Linux/Alma Linux

Voer het volgende commando uit om Docker te installeren.

$ 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

Schakel de Docker service in en start hem.

$ sudo systemctl start docker --now

Voeg je gebruikersnaam toe aan de Docker groep.

$ sudo usermod -aG docker $USER

Log uit het systeem en log weer in om de verandering toe te passen.

Stap 3 – Installeer Docker Compose

Download en installeer de Docker compose binary.

$ 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

Pas uitvoerbare toestemming toe op de binary.

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

Stap 4 – Installeer Portainer

Maak een map voor Portainer.

$ mkdir ~/portainer

Schakel over naar de directory.

$ cd ~/portainer

Maak het Docker Compose bestand aan en open het om te bewerken.

$ nano docker-compose.yaml

Plak er de volgende code in.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Laten we het Docker compose bestand doornemen.

  • We trekken de nieuwste versie van de Portainer Community Edition van Docker Hub. Portainer Community Editie is gratis te gebruiken, terwijl hun Business editie een betaalde licentie vereist. Je kunt de Business Editie trekken, maar er zal je om de licentiesleutel gevraagd worden om hem te gebruiken.
  • We hebben onze container de naam portainer gegeven ter identificatie en koppeling.
  • De restart policy is ingesteld op always zodat de container tijdens het opstarten aanblijft.
  • De instelling privileged: true is om Portainer toegang te geven tot de Docker socket en in een bevoorrechte context te laten draaien omdat we SELinux gebruiken. Als je geen SELinux gebruikt, kun je deze instelling verwijderen. Deze instelling geeft Portainer container toegang tot alles op het host systeem, inclusief toegang tot de hardware. Schakel deze instelling dus alleen in als je weet wat je doet.
  • De sectie volumes brengt de map op de host in kaart met de mappen in de container met behulp van Bind mounts. We hebben de map ~/portainer/data aan de container blootgesteld voor het opslaan van eventuele relevante gegevens en Docker socket API voor het beheer van de container. Het label :Z vertelt Docker dat we SELinux draaien op onze host. Als je SELinux niet ingeschakeld hebt, moet je het label verwijderen.

Start Portainer.

$ docker-compose up -d

Controleer de status van de 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

Stap 5 – Portainer openen en configureren

Open de URL https://<yourserverIP>:9443 in je browser, en je krijgt het volgende scherm.

Gordijn Installatiescherm

Je wordt gevraagd een nieuwe administrator gebruiker aan te maken. Voeg je gebruikersgegevens toe. Vink het vakje Allow collection of anonymous statistics uit als je privacy belangrijk vindt. Klik op de knop Create user om de installatie te starten en een nieuwe beheerdersaccount aan te maken.

Vervolgens kom je in het volgende dashboard scherm.

Dashboard van het portier

Na een paar seconden ververst het automatisch en toont je het volgende scherm.

Gordijn Home

Het toont je de lokale omgeving waarin Portainer draait. Klik op de lokale omgeving om aan de slag te gaan.

Portainer Omgeving Homepage

De meeste secties spreken voor zich. De sectie Stacks helpt bij het maken van containers met Docker compose files. Je kunt containers direct inzetten met de categorie Containers in de zijbalk. Je kunt de huidige docker omgeving configureren via de sectie Hosts. De sectie App Templates wordt geleverd met voorgeïnstalleerde Docker compose bestanden voor het installeren van de meest voorkomende applicaties. Je kunt ook aangepaste sjablonen maken.

In de sectie Settings kun je verschillende instellingen maken, zoals het toevoegen van aangepaste Docker registers, het toevoegen van meerdere hosts voor Docker zwerm, het configureren van gebruikerstoegang, het back-uppen van gegevens, en het aanpassen van Portainer.

Stap 5 – Zet Portainer achter een reverse proxy met Nginx Proxy Manager (NPM)

Laten we, voor we verder gaan, Portainer achter een omgekeerde proxy zetten met Nginx Proxy Manager. Nginx Proxy Manager is een Docker toepassing die een webbeheer UI biedt voor het instellen van Nginx als een reverse proxy host. Het kan ook gebruikt worden als redirect of als streaming host.

Installeer NPM

De eerste stap is om een netwerk aan te maken voor Nginx Proxy Manager (NPM). Open de sectie Netwerken en klik op de knop Netwerk toevoegen om een nieuw netwerk aan te maken.

Lijst van portainer netwerken

Geef een naam aan het netwerk en laat alle instellingen ongewijzigd. Klik op de knop Creëer het netwerk om te eindigen.

Portainer Netwerk Pagina Maken

Ga naar de Stacks en maak een nieuwe stack met de Add stack knop.

Portainer Stapels Bladzijde

Geef de stack een naam als nginx-proxy-manager en plak er de volgende code in.

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

Portainer Stapel toevoegen pagina

We hebben twee omgevingsvariabelen ingesteld om database en root MySQL wachtwoorden in te stellen. Portainer kan gebruikt worden om geheimen in te stellen met omgevingsvariabelen. Scroll naar beneden op de pagina en klik op de omgevingsvariabele knop Add om sterke wachtwoorden toe te voegen.

Portainer Stack Omgevingsvariabelen

Klik op de knop Deploy the stack om de NPM container te maken en te starten.

Toegang tot NPM

Open de URL https://<yourserverIP>:81 in je browser, en je krijgt het volgende scherm. Voer de volgende standaard referenties in om in te loggen.

E-mailadres: [email protected] Wachtwoord: changeme

Vervolgens wordt je meteen gevraagd een naam en een emailadres in te stellen. Klik op de Save knop, en je wordt gevraagd een nieuw wachtwoord te maken. Klik nogmaals op de Save knop om te beginnen.

Nginx Proxy Manager Dashboard

Ga naar de Hosts >> Proxy Hosts en klik op de knop Proxy Host toevoegen.

Voeg Portainer toe als Proxy Host

Voer de domeinnaam in als portainer.example.com. Kies het schema als https. Voer de naam van de container in als Forward Hostname en 9443 als Forward port. Vink de opties Block Common Exploits en Websockets Support aan.

Portainer NPM SSL opties

Ga naar het SSL tabblad en kiesRequest a new SSL Certificate uit het dropdown menu. Vink de optiesForce SSL en HTTP/2 Support aan om je SSL verbinding te beveiligen en te optimaliseren. Voer het emailadres in om verlengingsmeldingen te ontvangen en ga akkoord met de servicevoorwaarden. Klik op de knop Save om het instellen van de Proxy Host voor Portainer te voltooien.

Verbind Portainer met de NPM Container

We hebben de Proxy host ingesteld, maar de container is nog steeds niet verbonden met het NPM netwerk. Ga terug naar het Portainer dashboard, bezoek de sectie Containers, en selecteer de portainer container.

Kies npm-network uit het dropdown menu onder de sectie Verbonden netwerken en klik op de knopJoin network om de Portainer container aan het netwerk van de proxy manager toe te voegen.

Portainer Verbonden Netwerken

Je krijgt misschien een foutmelding, maar ververs de pagina, en je zou de container toegevoegd moeten zien aan het NPM netwerk.

Portainer verbonden met NPM

Je zou Portainer moeten kunnen benaderen met de URL https://portainer.example.com in je browser.

Je kunt een gelijkaardige procedure volgen om NPM achter een publiek toegankelijke URL te zetten zoals, https://npm.example.com zoals besproken in onze Nginx Proxy Manager tutorial.

Nu je een openbare URL voor Portainer hebt ingesteld, kun je de blootliggende poort 9443 verwijderen. Om dat te doen ga je terug naar de Terminal en schakel je naar de portainer directory.

$ cd ~/portainer

Open het Docker compose bestand om te bewerken.

$ nano docker-compose.yaml

Verwijder de ports sectie door ze uit te becommentariëren, zoals hieronder.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Hier hebben we de gegevens van het NPM netwerk toegevoegd omdat we de Portainer container opnieuw zullen moeten starten.

Stop de Portainer container.

$ docker-compose down --remove-orphans

Start de container opnieuw met de bijgewerkte configuratie.

$ docker-compose up -d

Stap 6 – Zet een container in met App Template

Portainer biedt verschillende voorgedefinieerde sjablonen om toepassingen direct te starten met minimale configuratie.

Portainer App Sjablonen

Ga naar de sectie App Templates en kies een willekeurig sjabloon. Geef het een naam, en selecteer het te gebruiken netwerk. Gebruik de sectie geavanceerde opties om aangepaste poorten, netwerken, en volume mounts in te zetten.

Klik op de knop Deploy the container om het uitrollen van je toepassing te voltooien. Hier zetten we de Redis container in.

Portainer Redis App Inzet

Stap 7 – Containers beheren

Laten we een bestaande container beheren. Open de containers pagina, en je ziet alle draaiende containers.

Lijst van containercontainers

Klik op de recent aangemaakte hw-redis container om verder te gaan.

Container acties

Bovenaan zie je een lijst van acties die je op een draaiende container kunt uitvoeren. Je kunt de container stoppen en doden. Recreate maakt de container helemaal opnieuw. Met de optieDuplicate/Edit kun je een andere identieke container maken, waarmee je instellingen kunt veranderen voordat je hem lanceert.

De Container status toont de draaitijd, het IP adres en andere details over de container.

De optie Logs toont de uitvoer van het docker logs commando. Omdat de uitvoer van het commando niet in het cachegeheugen wordt opgeslagen, wordt het commando telkens als je de pagina vernieuwt van nul af aan uitgevoerd.

Container Logs

De Inspect optie voert het commando docker inspect uit op de container en toont de uitvoer ervan.

Container containers inspecteren

De optie Stats toont je het gebruik van de container in real-time.

Container Stats

Je kunt de Container console starten met de optie Console. Je wordt gevraagd naar het commando en de systeemgebruiker om uit te voeren.

Portainer Container Console Configuratie

Druk op de knop Connect om de console te starten.

Container Console schelp

De optie Attach voert het docker attach commando uit.

Er zijn nog andere opties op de Container details pagina. Je kunt een image maken met behulp van een bestaande container. Andere opties zijn het veranderen van het herstartbeleid van een container en het verbinden of ontkoppelen van een netwerk met een bestaande container.

Een externe container aan Portainer koppelen

Het aanmaken van een willekeurige container buiten Portainer zal er in verschijnen, zolang hij gemaakt is op hetzelfde systeem waarop Portainer draait. Dit is mogelijk omdat Portainer met Docker verbonden is via de websocket.

Laten we testen door de Hello World Docker container te draaien.

$ 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/

Bekijk de containerlijst in de terminal. We gebruiken de -a vlag om de lijst van alle containers te tonen, ook de gestopte. Je ziet de naam van de container als 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
.....

Bekijk nu de Portainer Containers pagina, en de hello world container verschijnt als gestopt in de lijst met dezelfde naam.

Portainer Hallo Wereld Container

Conclusie

Dit beëindigt onze tutorial over het installeren en gebruiken van Portainer voor Docker beheer en Nginx Proxy Manager. We zullen het bouwen van docker images, het maken van aangepaste containers en het gebruik van Portainer met Docker zwerm verkennen in een komende tutorial. Als je vragen hebt, stel ze dan in de opmerkingen hieronder.