DOCKER-LERNPFAD AUF UBUNTU SERVER
Docker → Portainer → Testcontainer → Compose → ERPNext
Gesamtanleitung · Lernpfad

Vom frischen Ubuntu Server
bis zu ERPNext mit Portainer

Eine zusammenhängende Anleitung für Docker-Grundlagen, Portainer, Testcontainer, Docker Compose und anschließend ERPNext.

Stand 16.09.2026 Ubuntu 26.04.1 LTS Docker Engine Portainer CE ERPNext v16
UbuntuServerbasis
DockerContainer-Engine
PortainerWeb-GUI
NGINX-Testerster Container
ERPNextCompose-Umgebung
LERNIDEE
Du installierst nicht sofort ERPNext. Erst lernst du Docker und Portainer an einem kleinen Testcontainer kennen. Danach verstehst du wesentlich besser, was Easy Install für ERPNext im Hintergrund erzeugt.

Womit du am sinnvollsten anfängst

Portainer ist eine Verwaltungsoberfläche für Docker. Deshalb kommt zuerst Docker, dann Portainer und erst danach eine größere Anwendung wie ERPNext.

1
Ubuntu Server vorbereiten – Updates, SSH, Zeit, Netzwerk.
2
Docker Engine installieren – offizielle Docker-Pakete und Compose-Plugin.
3
Docker testenhello-world und grundlegende CLI-Befehle.
4
Portainer installieren – Container, Images, Volumes und Netzwerke visuell kennenlernen.
5
NGINX-Testcontainer – Ports, Logs, Start/Stop und Löschen ausprobieren.
6
Docker Compose – einen kleinen Stack als YAML-Datei starten.
7
ERPNext installieren – Easy Install nutzt dein vorhandenes Docker.
8
ERPNext in Portainer analysieren – Container, Logs, Volumes, Netzwerke und Ressourcen nachvollziehen.

Server auf einen sauberen Ausgangsstand bringen

1
System aktualisieren
sudo apt update
sudo apt full-upgrade -y
2
Grundwerkzeuge installieren
sudo apt install -y ca-certificates curl wget dnsutils
3
Zeitzone setzen
sudo timedatectl set-timezone Europe/Berlin
timedatectl
4
Version prüfen
cat /etc/os-release
uname -a
NETZWERK
Für einen Server ist eine stabile, bekannte IP-Adresse sinnvoll. Ob du sie statisch am Server oder per DHCP-Reservierung am Router vergibst, ist eine separate Netzwerkentscheidung.

Docker Engine aus dem offiziellen Repository

Docker unterstützt Ubuntu 26.04 LTS offiziell. Für einen Server ist Docker Engine die passende Variante – nicht Docker Desktop.

Docker-Repository einrichten

sudo apt update
sudo apt install -y ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Docker und Compose installieren

sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

Funktion prüfen

sudo systemctl status docker --no-pager
sudo docker run --rm hello-world
sudo docker version
sudo docker compose version
ERWARTUNG
hello-world lädt ein kleines Testimage, startet daraus einen Container und beendet ihn wieder. Wenn die Bestätigung erscheint, funktioniert die Docker-Basis.

Docker ohne sudo verwenden – optional

Für Lern- und Einzelbenutzersysteme ist es bequem, den eigenen Benutzer zur Gruppe docker hinzuzufügen.

sudo usermod -aG docker "$USER"

Danach vollständig ab- und wieder anmelden – oder für die aktuelle Shell:

newgrp docker
docker run --rm hello-world
SICHERHEIT
Mitgliedschaft in der Gruppe docker gewährt praktisch Root-Rechte über den Docker-Daemon. Nur vertrauenswürdige Benutzer aufnehmen.

Die Docker-Weboberfläche zuerst sicher bereitstellen

Portainer CE läuft selbst als Docker-Container und verwendet den Docker-Socket, um den lokalen Docker-Daemon zu verwalten.

Portainer-Datenvolume anlegen

docker volume create portainer_data

Empfohlene Lern-/Admin-Variante: nur lokal binden

docker run -d \
  -p 127.0.0.1:9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:sts

Damit ist Portainer nicht direkt im LAN oder Internet erreichbar. Vom eigenen Rechner kannst du einen SSH-Tunnel öffnen:

ssh -L 9443:127.0.0.1:9443 BENUTZER@SERVER-IP

Danach im Browser:

https://127.0.0.1:9443
ZERTIFIKAT
Portainer erzeugt standardmäßig ein selbstsigniertes TLS-Zertifikat für Port 9443. Beim ersten Aufruf ist deshalb eine Browserwarnung normal.

Portainer prüfen

docker ps
docker logs portainer --tail=50
DOCKER-SOCKET
Portainer erhält über /var/run/docker.sock sehr weitreichende Kontrolle über den Host. Portainer sollte deshalb wie eine Administrationsoberfläche behandelt und nicht ungeschützt öffentlich freigegeben werden.

Was du dir vor ERPNext ansehen solltest

Portainer-BereichWas du dort lernst
Containerslaufende und gestoppte Container, Ports, Status, Logs und Console.
Imageslokal vorhandene Container-Images und deren Größe.
Volumespersistente Daten, die einen Containerneustart überleben.
Networksvirtuelle Docker-Netze und Kommunikation zwischen Containern.
StacksDocker-Compose-Anwendungen aus mehreren Diensten.
StatsCPU-, RAM- und Netzwerkverbrauch eines Containers.
MERKSATZ
Portainer ist die Oberfläche. Die eigentliche Arbeit erledigt weiterhin Docker. Deshalb solltest du wichtige CLI-Befehle parallel lernen.

NGINX starten und in Portainer beobachten

NGINX eignet sich als erster Test, weil du sofort siehst, was ein Image, Container und veröffentlichter Port bedeuten.

docker run -d \
  --name nginx-test \
  -p 127.0.0.1:8080:80 \
  nginx:alpine

Mit CLI prüfen

docker ps
curl http://127.0.0.1:8080
docker logs nginx-test

Im Portainer-Webinterface

  • Containers → nginx-test öffnen.
  • Status, Image und Port-Mapping ansehen.
  • Logs öffnen.
  • Container einmal stoppen und wieder starten.
  • Ressourcenverbrauch unter Stats ansehen.

Test wieder entfernen

docker rm -f nginx-test
LERNZIEL
Du hast jetzt den vollständigen Weg gesehen: Image → Container → Port → HTTP-Antwort → Logs → Stop/Start → Löschen.

Vom einzelnen Container zum Stack

ERPNext besteht aus mehreren Containern. Deshalb solltest du vor ERPNext mindestens einmal einen kleinen Compose-Stack selbst starten.

Projektordner erstellen

mkdir -p ~/docker-lab/nginx/html
cd ~/docker-lab/nginx

Eigene Testseite

cat > html/index.html <<'EOF'
<!doctype html>
<html lang="de">
<head><meta charset="utf-8"><title>Docker-Test</title></head>
<body>
  <h1>Docker Compose funktioniert!</h1>
</body>
</html>
EOF

compose.yml

cat > compose.yml <<'EOF'
services:
  web:
    image: nginx:alpine
    container_name: nginx-compose-test
    ports:
      - "127.0.0.1:8081:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped
EOF

Stack starten

docker compose up -d
docker compose ps
curl http://127.0.0.1:8081

Logs und Beenden

docker compose logs
docker compose down
WICHTIG
Mit Compose beschreibst du den gewünschten Zustand in YAML. Docker erzeugt daraus Container, Netzwerke und gegebenenfalls Volumes. Genau dieses Prinzip verwendet ERPNext in deutlich größerem Umfang.

Die Begriffe, die du vor ERPNext beherrschen solltest

BegriffBedeutung
ImageUnveränderliche Vorlage, aus der Container gestartet werden.
ContainerLaufende Instanz eines Images mit eigener Prozess- und Dateisystemumgebung.
VolumeVon Docker verwalteter persistenter Speicher.
Bind MountEin konkreter Host-Pfad wird in einen Container eingebunden.
NetworkVirtuelles Netz, über das Container miteinander kommunizieren.
Port-MappingHost-Port wird auf einen Container-Port veröffentlicht.
ComposeBeschreibung einer Multi-Container-Anwendung in YAML.
StackZusammengehörige Container und Ressourcen einer Anwendung.

Jetzt erst die größere Anwendung installieren

ERPNext Easy Install nutzt dein bereits installiertes Docker. Für die Standard-HTTPS-Variante brauchst du zusätzlich einen gültigen DNS-Namen und erreichbare Ports 80/443.

VoraussetzungBeispiel
Site-Name / FQDNerp.firma.de
A-Recordzeigt auf deine öffentliche IPv4-Adresse
AAAA-Recordnur wenn IPv6 wirklich erreichbar ist
Router80/TCP und 443/TCP zum Ubuntu-Server weiterleiten
E-Mailfür Let's Encrypt, z. B. admin@firma.de
getent ahosts erp.firma.de
dig +short A erp.firma.de
dig +short AAAA erp.firma.de
WICHTIG
Portainer bleibt bei dieser Anleitung auf 127.0.0.1:9443 gebunden. Dadurch kollidiert es nicht mit ERPNext auf 80/443 und bleibt als Adminoberfläche getrennt.

Frappe Easy Install mit vorhandenem Docker

Das Easy-Install-Skript erkennt, dass Docker bereits vorhanden ist, lädt frappe_docker, erzeugt Compose-Dateien und richtet die Produktionsumgebung ein.

Installer laden

mkdir -p ~/erpnext-install
cd ~/erpnext-install

wget https://raw.githubusercontent.com/frappe/bench/develop/easy-install.py
python3 easy-install.py deploy --help

ERPNext deployen

python3 easy-install.py deploy \
  --project=erpnext-prod \
  --email=admin@firma.de \
  --sitename=erp.firma.de \
  --app=erpnext

Wichtige erzeugte Dateien

DateiFunktion
~/erpnext-prod-compose.ymlgenerierte Compose-Konfiguration.
~/erpnext-prod.envUmgebungswerte wie Site-Regel, Datenbankpasswort und ERPNext-Version.
~/erpnext-prod-passwords.txtAdministrator- und MariaDB-root-Passwort.
~/erpnext-install/easy-install.logInstallationslog für die Fehlersuche.
chmod 600 ~/erpnext-prod-passwords.txt
cat ~/erpnext-prod-passwords.txt
ERGEBNIS
Wenn DNS und Portweiterleitung stimmen, sollte ERPNext anschließend unter https://erp.firma.de erreichbar sein.

Jetzt wird Portainer besonders nützlich

Nach der Installation siehst du in Portainer mehrere ERPNext-Container. Genau hier zahlt sich der vorherige Lernschritt aus.

FrontendWeboberfläche / Assets
BackendFrappe / ERPNext
WorkerQueues / Jobs
Schedulerzeitgesteuerte Aufgaben
MariaDBDatenbank
RedisCache / Queues

Was du in Portainer prüfen kannst

  • Welche Container laufen?
  • Welches Image nutzt ein Container?
  • Wie viel CPU und RAM verbraucht MariaDB?
  • Welche Logs schreibt das Backend?
  • Welche Volumes gibt es?
  • Welche Container teilen sich ein Docker-Netzwerk?
QUELLE DER WAHRHEIT
ERPNext weiterhin über Easy Install beziehungsweise die generierte Compose-Konfiguration pflegen. Portainer primär zum Beobachten, Diagnostizieren und kontrollierten Start/Stop verwenden. Änderungen an Ports, Env-Variablen oder dem Stack nicht parallel in Portainer und in Easy Install pflegen.

Die wichtigsten Befehle neben Portainer

docker ps
docker image ls
docker volume ls
docker network ls
docker stats

ERPNext-Compose-Projekt prüfen

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml ps

Logs

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml logs --tail=200

Neustart

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml restart

ERPNext-Daten sichern

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml exec backend \
  bench --site erp.firma.de backup --with-files --compress
BACKUP-REGEL
Ein Backup auf demselben Server schützt nicht gegen Serververlust. Produktive Sicherungen zusätzlich auf ein separates Ziel kopieren und Wiederherstellungen testen.

ERPNext über Easy Install aktualisieren

cd ~/erpnext-install

wget -O easy-install.py \
  https://raw.githubusercontent.com/frappe/bench/develop/easy-install.py

python3 easy-install.py upgrade --project=erpnext-prod

Nach dem Update

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml ps

Die drei wichtigsten Docker-Sicherheitsfallen

1 · PUBLISHED PORTS
Docker weist darauf hin, dass veröffentlichte Container-Ports UFW-Regeln umgehen können. Verlasse dich daher nicht darauf, dass UFW einen mit -p 0.0.0.0:PORT:PORT veröffentlichten Dienst automatisch abschirmt.
2 · DOCKER-GRUPPE
Benutzer in der Gruppe docker besitzen faktisch Root-nahe Rechte über den Docker-Daemon.
3 · DOCKER-SOCKET
Portainer erhält Zugriff auf /var/run/docker.sock. Deshalb darf ein kompromittiertes Portainer-Konto nicht als „nur Web-GUI“ betrachtet werden – es kann den Docker-Host kontrollieren.

Für diesen Lernaufbau

  • Portainer nur über localhost + SSH-Tunnel erreichbar.
  • Testcontainer ebenfalls nur an localhost binden.
  • ERPNext veröffentlicht bewusst nur die benötigten Webports 80/443.
  • MariaDB und Redis nicht separat nach außen veröffentlichen.
  • Router-Portweiterleitungen regelmäßig prüfen.

Von unten nach oben prüfen

EbenePrüfungBefehl / Hinweis
HostUbuntu / Ressourcenuptime, free -h, df -h
DockerDienst läuft?systemctl status docker
ContainerStatus / Restart-Loopsdocker ps -a
LogsFehlermeldungendocker logs NAME
Composegesamter ERPNext-Stackdocker compose ... ps
DNSName zeigt auf richtige IP?getent ahosts erp.firma.de
NetzRouter / 80 / 443Portweiterleitung und Provider prüfen

Portainer selbst

docker ps --filter name=portainer
docker logs portainer --tail=100

ERPNext

docker compose -p erpnext-prod \
  -f ~/erpnext-prod-compose.yml logs --tail=200

Der gesamte Lernpfad in Kurzform

1
Ubuntu aktualisieren und Netzwerk/SSH prüfen.
2
Docker Engine + Compose-Plugin aus dem offiziellen Docker-Repository installieren.
3
hello-world ausführen.
4
Portainer mit persistentem Volume starten und per SSH-Tunnel öffnen.
5
Portainer-Bereiche Containers, Images, Volumes, Networks und Stats ansehen.
6
NGINX als ersten Testcontainer starten, Logs lesen, stoppen und löschen.
7
Kleinen NGINX-Compose-Stack erstellen und wieder entfernen.
8
DNS und 80/443 für ERPNext vorbereiten.
9
ERPNext mit Easy Install deployen.
10
ERPNext-Container anschließend in Portainer analysieren.
11
Updates und Backups weiterhin über Easy Install / Bench / Compose durchführen.

Offizielle Grundlage

Die Befehle und Hinweise wurden für den Stand 16.09.2026 anhand der aktuellen offiziellen Docker-, Portainer-, Frappe- und Ubuntu-Dokumentation aufgebaut.

LERNZIEL ERREICHT
Wenn du diesen Ablauf einmal bewusst durchgehst, kennst du nicht nur ERPNext, sondern auch die Docker-Grundlagen, auf denen ERPNext auf deinem Server läuft.