So einfach ist Docker

(Server-)Software als Docker-Container zu installien ist so viel einfacher als auf blankem Metall. Mit unseren Docker-Tipps klappt der Einstieg kinderleicht.

In Pocket speichern vorlesen Druckansicht 148 Kommentare lesen

Empfohlener redaktioneller Inhalt

Mit Ihrer Zustimmung wird hier ein externes YouTube-Video (Google Ireland Limited) geladen.

Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit können personenbezogene Daten an Drittplattformen (Google Ireland Limited) übermittelt werden. Mehr dazu in unserer Datenschutzerklärung.

Lesezeit: 18 Min.
Von
  • Jan-Keno Janssen

Docker ist kompliziert? Stimmt nicht, zumindest nicht mehr, wenn man das grundlegende Prinzip verstanden hat. c't 3003 erklärt die ersten Schritte.

Die Befehle und Konfigurationsdateien, die im Video benutzt werden, haben wir ein einer Sammlung bei GitHub zusammengestellt.

(Hinweis: Dieses Transkript ist für Menschen gedacht, die das Video oben nicht schauen können oder wollen. Der Text gibt nicht alle Informationen der Bildspur wieder.)

Guckt mal hier, das ist Docker. Damit könnt ihr zum Beispiel auf einem Home-Server superschnell Software installieren. Ich habe zwar schon häufig Docker benutzt, aber noch nie direkt und ungefiltert, sondern immer nur über andere Software, also zum Beispiel über Unraid. Ich muss auch sagen, dass mich Docker in der puren Form immer ein bisschen abgeschreckt hat.

Aber jetzt habe ich mir von meinen Kollegen endlich mal alles erklären lassen, was da eigentlich genau passiert bei Docker, und da nehme ich euch jetzt einfach mal mit. Also, wenn ihr dieses Video zu Ende geguckt habt, dann habt ihr Docker verstanden. Bin ich mir jedenfalls ziemlich sicher. Bleibt dran.

Liebe Hackerinnen, liebe Internet-Surfer, herzlich willkommen hier bei...

Ich bin wirklich tief eingestiegen in Docker, also eine Technik, mit der auch groĂźe Firmen heute Server-Software betreiben. DafĂĽr habe ich mich mit meinen Kollegen Niklas und Jan im BĂĽro eingeschlossen, und die beiden haben mir gezeigt, wie Docker funktioniert.

Einmal ist Docker eine Firma, also Docker Incorporated, die diesen lustigen Wal als Logo hat. Gleichzeitig ist Docker aber auch ein Open-Source-Programm, das man kostenlos benutzen kann. Mit Docker betreibt man Software in sogenannten Containern.

Zitat von Jan Mahn: Die Firma Docker hat sich das Produkt namens Docker ausgedacht. Docker hat die Art, wie Server-Software heute verteilt wird, radikal verändert. Kleine Unternehmen und große Firmen gleichermaßen nutzen heute Container. Docker ist nur eine Firma, die das unterstützt. Andere Produkte oder Open-Source-Projekte sind zum Beispiel Podman oder Kubernetes, wenn man im großen Firmenumfeld mit Containern arbeitet. Es lohnt sich absolut, sich heute mit Containern zu beschäftigen, und Docker ist ein guter Einstieg, denn diese Technik wird in allen Firmen, gerade die mit Software arbeiten, eingeführt. Das ist einfach ein Skill, der in der Profi-IT nützlich ist.

Warum Container so cool sind, versteht man am besten, wenn man sich anschaut, wie man Software frĂĽher installiert hat. Ich habe mir mal die Installationsanleitung fĂĽr Nextcloud rausgesucht, die ja nicht nur bei euch sehr beliebt ist.

Okay, man braucht also nur den Web-Server Apache, ein paar Erweiterungen dafür, die Programmiersprache PHP, außerdem 100 PHP-Pakete und einen Datenbank-Server. Das Zeug holt man sich über den Linux-Paketmanager, dann muss man die Datenbank einfach nochmal selbst zusammenhacken, also sowas wie "create user" und dann noch schnell Nextcloud irgendwo runterladen, in den richtigen Ordner verschieben, entpacken, Rechte setzen. Den Web-Server konfigurieren und dann am besten noch dieser Anleitung folgen, um den Web-Server schön und sicher einzurichten. Ich muss sagen, ich habe da jetzt schon nach den ersten Schritten die Lust verloren und würde dann normalerweise bei Dropbox bleiben. Ich wollte doch eigentlich nur Nextcloud installieren und jetzt nicht ein Studium in Apache abschließen.

Mit Docker geht das halt super einfach. Docker verpackt Prozesse zusammen mit allen nötigen Abhängigkeiten in sogenannten Containern. Der Prozess darin denkt, er sei auf dem Computer ganz alleine unterwegs und hätte alles, was er zum Leben braucht. Der Nextcloud-Container hätte also seinen Web-Server, sein PHP und das ganze Geraffel, das man sonst per Hand heranschaffen müsste, schon eingebaut.

Was so ein Dienst braucht, steckt fertig verdrahtet in sogenannten Images, aus denen Container hochgefahren werden. Wenn ich meinen Nextcloud-Server mal kaputt gespielt habe, starte ich einfach einen neuen Container aus dem Image und alles ist wieder da, wo es hingehört.

Das alleine ist schon toll, aber es wird noch besser. Die Images muss ich mir nämlich nicht selbst bauen. Dafür gibt es öffentliche Sammlungen, in denen zum Beispiel Hersteller von Software ihre Images hochladen können. Die größte öffentliche Sammlung ist der Docker-Hub unter hub.docker.com. Wenn man hier "Nextcloud" in die Suche eintippt, findet man fertige Images, aus denen ein Nextcloud-Server hochfährt. Man muss nur noch wissen, wie man mit Docker arbeitet, und das erkläre ich euch jetzt.

Ihr braucht zum Nachmachen nur einen am Netz hängenden Rechner mit einem Linux drauf. Das kann ein Raspberry Pi, ein gemieteter Linux-Server in der Cloud, eine virtuelle Maschine oder ein gebrauchter Thin-Client sein, den ich übrigens hier als Home-Server benutze. Da haben wir auch mal ein Video dazu gemacht. Zum Testen, Programmieren und Experimentieren kann man Docker auch einfach auf einem Windows-PC oder Mac installieren. Für einen echten Server würden wir aber Linux empfehlen und natürlich Zugriff auf dessen Kommandozeile. Ganz ohne Kommandozeile geht es nicht, aber das tut echt alles nicht weh.

Alle Befehle, die ich euch hier empfehle, findet ihr in der Infobox in einem Dokument zum Nachmachen unten in der Beschreibung.

Docker kann man auf unterschiedlichen Wegen installieren. Linux-Puristen mögen den folgenden Weg vielleicht doof finden, weil man einem Skript einer anderen Firma vertrauen muss. Es geht aber einfach am schnellsten, und vertrauen muss man der Firma hinter Docker eh irgendwie, wenn man Docker nutzen will.

Also, mit diesen zwei Befehlen kann man Docker installieren:

curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh ./get-docker.sh

Wenn ihr bei curl eine Fehlermeldung bekommt, dann kann es sein, dass eure Linux-Distribution kein curl installiert hat. Dann macht ihr einfach apt install curl. Schreibe ich euch aber auch in die Befehlsliste rein.

Damit ich nicht jedes Mal sudo vor alle Docker-Befehle schreiben muss, gebe ich dem aktuellen Nutzer noch schnell das Recht, Docker zu nutzen:

sudo usermod -aG docker $USER

Der erste Befehl, den ich verinnerlichen musste, heiĂźt docker ps. Damit sehe ich immer, welche Container auf meinem Server gerade laufen. Keine, ich habe ja auch gerade erst angefangen.

Wenn man im Docker-Universum eine Anwendung sucht, landet man wahrscheinlich zuerst auf dem Docker-Hub unter hub.docker.com. Oben gebe ich einfach meinen Suchbegriff ein, zum Beispiel "Nextcloud", und bekomme 2716 Treffer. Kann ich jetzt einfach jeden nehmen? Welcher ist eigentlich der beste? Da frage ich jetzt nochmal die Expertenkollegen.

Zitat von Jan Mahn: Der Docker-Hub ist eine Registry, in der ganz viele Images sind. Die gute Nachricht ist, man findet dort eine Menge. Die schlechte Nachricht ist, jeder kann dort eigentlich einen Account anlegen und Dinge hochladen. Man muss also genau schauen, von wem man dort ein Image herunterlädt. Am besten filtert man links auf den Haken "Official Images". Dann findet man offizielle Images, die von der Firma Docker Inc. mit dem jeweiligen Hersteller zusammengebaut wurden.

Auf keinen Fall sollte man ein Docker-Image von einem unbekannten Nutzer herunterladen. Im Docker-Hub findet man auch eine ganze Menge Images, die man nicht haben möchte, teilweise auch von Nutzern, die irgendetwas Böses im Schilde führen. Dann ist zum Beispiel die Software, die man haben möchte, in dem Container, aber nebenbei läuft auch noch ein Crypto-Trojaner. Und das möchte man dann natürlich nicht.

Okay, verstanden. Bestenfalls nimmt man also die Images mit den grünen Haken und lässt die Finger von allen anderen, die man nicht kennt.

Jetzt will ich aber was sehen fĂĽr mein Geld und fange mal klein an. Ich versuche es einfach mal mit einem kleinen Nginx-Webserver. Ich tippe im Docker-Hub "Nginx" in die Suche ein und finde gleich den ersten mit grĂĽnem Haken. Den starte ich jetzt auf meinem Server. Jan hat mir den Befehl dafĂĽr schon mal verraten:

docker run -p 80:80 nginx

Der Befehl docker run startet einen Container. Das ist auch irgendwie logisch. Soll mal keiner sagen, Kommandozeile sei schwarze Magie. Ganz am Ende des Befehls steht der Name des Images, das ich im Docker-Hub gefunden habe. Das -p 80:80 sagt Docker, dass der Port 80 auf der Netzwerkkarte meines Servers an den Container weitergeleitet werden soll. Der Webserver antwortet dann direkt, wenn ich die IP-Adresse des Servers eingebe.

Übrigens, wenn ihr eure IP-Adresse gerade nicht wisst, könnt ihr unter Linux immer ip a eingeben. Da steht dann eure IP-Adresse.

So, das will ich jetzt mal ausprobieren. Also los: docker run -p 80:80 nginx. Tada, da passieren tatsächlich Dinge auf meiner Kommandozeile. Jetzt sollte ich eine Website sehen. Ich gebe einfach die IP-Adresse im Browser ein. Achtet darauf, dass ihr nicht "https" davor schreibt, sondern nur "http". Das Thema "https" lassen wir in diesem Video erst mal raus.

Auf jeden Fall abgefahren, ich bin jetzt Webserverbetreiber! Wenn ich den Container wieder runterfahren will, kann ich einfach Strg + C drĂĽcken. Dann wird der Prozess abgebrochen. Oder man kann sonst auch immer docker stop eingeben.

Das war jetzt easy. Der nächste Schritt darf gern ein bisschen schwieriger sein. Eines der Projekte, nach dem ihr immer wieder fragt, ist ja Pi-hole. Das ist ein Server, den man im Heimnetz betreibt und der als DNS-Server alle Domains filtert, die irgendwelche gefährlichen Sachen im Internet ausliefern oder Werbung. Ich schaue jetzt mal, ob ich Pi-hole auch mit Docker so schnell einrichten kann.

Ich gehe in den Docker-Hub und gebe "Pi-hole" ein. Jawohl, da ist es! Da ist sogar eine ganze Anleitung dabei, was ich jetzt so zu tun habe. Das hatte Jan mir auch schon angekĂĽndigt: Mit docker run und docker stop will man im Alltag eigentlich nichts zu tun haben. Viel cooler ist es mit Docker Compose.

Mit Docker Compose generiert man eine Datei namens docker-compose.yml und definiert darin, welche Container mit welchen Eigenschaften man gern hätte. ".yml" ist die Abkürzung für YAML. Das ist ein Dateiformat, bei dem man mit Einrückungen arbeitet.

Ich lege jetzt mal so eine Datei an: nano docker-compose.yml. Da kopiere ich jetzt das rein, das ich im Docker-Hub gefunden habe, also den langen Schnipsel aus der README, der mit version: '3' beginnt.

Okay, ich habe mir nochmal erklären lassen, was es damit auf sich hat. Die erste Zeile mit der Version ist schon mal überflüssig. Die braucht Docker heute nicht mehr. Also weg damit! Dann kommen "services". Das sind die Container und dann die Erklärung, wie der Container "pihole" aussehen soll. Das Image ist "pihole/pihole" aus dem Docker-Hub. Dann kommen Portweiterleitungen. Das kennen wir ja schon vom Webserver.

Danach folgen Umgebungsvariablen, über die ich Pi-hole steuere. Meine Zeitzone ändere ich direkt mal mit: Ich wohne ja nicht in "America/Chicago", sondern in "Europe/Berlin". Darunter kann ich mir ein Passwort für Pi-hole ausdenken. Die Raute weg und dann WEBPASSWORD: 'keno3003'. Den Rest lassen wir so; das ist Netzwerk-Kram und hat erst mal weniger mit Docker zu tun.

Ich speichere mit Strg + O, dann "Y" für Yes, und dann nochmal Strg + X zum Beenden. Die Datei ist fertig. Hochfahren lässt sich das Ganze dann mit docker compose up -d. Das "up" macht soweit Sinn, es startet die Container. Das "-d" sorgt dafür, dass ich die Log-Einträge nicht alle auf der Kommandozeile sehe. Vor allem gibt es die Kommandozeile danach wieder frei.

"D" steht für "detached". Das heißt, wenn ich das -d nicht eingeben würde, könnte ich auf dieser Kommandozeile erst mal nichts mehr machen und müsste eine neue öffnen.

Jetzt kann ich zum Beispiel auch docker ps eingeben, um zu sehen, welche Docker-Container gerade laufen. Ganz wichtig: In diese docker-compose.yml-Datei kann ich viele Docker-Container reinschreiben, nicht nur einen. Ich kann einfach alle hintereinander weg da reinschreiben. So sieht das gerade bei mir aus. Da sind gleich drei Docker-Container drin.

docker run und docker compose up sind schon mal zwei Wege, um Container zu verwalten. Natürlich wollte ich auch wissen, was ich mache, wenn mich die Kommandozeile nervt. Das hat mich einfach super genervt. Es gibt auch etwas dafür, nämlich das Open-Source-Tool "Portainer". Das ist eine lokale Webseite, auf der ich dann Container mit der Maus verwalten kann.

Wie das geht? Einfach diesen Schnipsel nehmen, den wir euch unter diesem Video verlinkt haben, und auch in die Datei docker-compose.yml unter "services" einfĂĽgen: nano docker-compose.yml, alles da rein, also die Datei, die ihr noch von der Pi-hole-Installation habt. Dahinter schreiben, eingerĂĽckt einfĂĽgen.

Speichern mit Strg + O, "Y" und dann Strg + X zum Beenden. Danach docker compose up -d, und dann kommt der Portainer auf meinen Server geflogen. Dann im Browser schauen, ob es geklappt hat. Also IP des Servers, Doppelpunkt 9000. Und ja, da ist der Portainer! Ich soll mir ein Passwort ausdenken, weiter auf den fetten Button "Getting Started" und dann auf "Local".

Links sehe ich meine Container, zum Beispiel mein Nginx-Experiment. Das kann ich jetzt einfach anklicken und löschen, wenn ich es nicht mehr haben will.

In Portainer gibt es jetzt ziemlich viel zu entdecken. Ich kann euch nicht alles in diesem Video zeigen, was man hier alles machen kann. Wir können jetzt zum Beispiel einmal Wordpress ganz ohne Kommandozeile einrichten. Das geht folgendermaßen: Links gibt es in Portainer sogenannte Templates für viele praktische Anwendungen. Da könnt ihr einfach mal "Wordpress" eingeben. Und da ist es dann auch schon.

Klick, ein Name, "Superblock" zum Beispiel, und dann unten "Deploy the stack". Jetzt heiĂźt es kurz warten. Und tada! Nochmal schnell im Browser die IP eintippen, und da ist mein Wordpress-Blog. Danke, Docker!

Und jetzt raucht euch vielleicht ein bisschen der Kopf. Ja, das muss ich zugeben, ging mir auch so, als ich mit Docker angefangen habe. Aber wenn man es einmal ausprobiert hat, wird das wirklich plötzlich alles ganz logisch. Macht das mal! Schnappt euch einen Raspberry Pi, schnappt euch einen Linux-Rechner, probiert das einfach mal aus. Docker installieren, Docker-Compose-Datei anlegen, und wenn ihr wollt, auch mal Portainer hochfahren.

Docker-Profis seid ihr nach diesem schnellen Ritt natĂĽrlich noch nicht. DafĂĽr fehlen noch ein paar Sachen, wie Zertifikate, HTTPS, Backups und so weiter. Wenn euch das Video interessiert und viele von euch das gucken, machen wir auf jeden Fall auch einen Nachklapp dazu.

Mein Fazit: Wenn man es einmal gecheckt hat, dann wird einem sofort klar, warum Docker so praktisch ist. Die Hemmschwelle, mal kurz etwas zu installieren, ist über den Docker-Hub super niedrig, weil das buchstäblich nur ein paar Sekunden dauert. Egal, ob man Portainer oder die Kommandozeile verwendet, man kann sich da einfach überall durchprobieren.

Ach ja, und updaten lässt sich die mit Docker installierte Software auch total komfortabel. Entweder manuell mit dem Befehl docker-compose pull oder ihr macht es euch noch einfacher und installiert einfach den Docker-Container "Watchtower". Das habe ich so gemacht, indem ich das hier in meine docker-compose.yml reingeschrieben habe. Der Watchtower fragt jetzt regelmäßig auf dem Server nach, ob es was Neues gibt, und installiert das dann, wenn es was gibt. Nice!

Achso, was ich gerne noch ergänzen will, weil ich mich das vorher auch gefragt habe: Was ist eigentlich der Unterschied zwischen einer VM und einem Docker-Container? Ganz einfach: In einer VM läuft immer ein ganzes Betriebssystem, also zum Beispiel der Linux-Kernel -- während der Docker-Container das Betriebssystem des Servers mitnutzt. Das heißt: Eine VM verbraucht immer mehr Ressourcen als ein Docker-Container. Achso, und was ist eigentlich Podman: Das ist quasi der Nachfolger von Docker, und Podman kann man 1:1 ersetzen. Das heißt, die Befehle hier aus dem Video sind eins zu eins die gleichen, nur dass man halt zum Beispiel podman ps tippt, um alle laufenden Container zu sehen statt docker ps. Podman kann sogar den Docker-Hub benutzen, um nach Images zu suchen.

Jetzt seid ihr dran. Probiert das, wie gesagt, sehr gerne mal aus. Wenn ihr noch Fragen habt – die werdet ihr bestimmt haben, die hatte ich auch – schreibt sie gerne in die Kommentare. Teilt auch gerne ganz allgemein eure Erfahrungen mit Docker. Wir lesen wirklich alle Kommentare, das verspreche ich euch. Tschüss!


c't 3003 ist der YouTube-Channel von c't. Die Videos auf c’t 3003 sind eigenständige Inhalte und unabhängig von den Artikeln im c’t Magazin. Die Redakteure Jan-Keno Janssen und Lukas Rumpler sowie die Video-Producer Şahin Erengil und Pascal Schewe veröffentlichen jede Woche ein Video.

(jkj)