Docker auf Ubuntu Server

Docker Logo

Jeder hat bestimmt schon mal von Docker gehört. Laut Wikipedia ist Docker eine Open-Source-Software, mit deren Hilfe Anwendungen mittels Betriebssystem-Virtualisierung in Containern isoliert werden kann. Zweck des Ganzen ist hauptsächlich die vereinfachte Bereitstellung von Anwendungen. Alles klar? Der Nicht-Informatiker wird nun große Augen machen, da das Ganze doch sehr schwammig klingt.

Der folgende Artikel soll daher in einfachen Worten erklären, was Docker eigentlich ist und wofür man es einsetzen kann. Anschließend wird die Installation von Docker Schritt für Schritt auf einem Ubuntu Server erklärt.

Was ist Docker?

Zunächst soll in einfachen Worten erklärt werden, was Docker eigentlich ist. Wer Docker bereits kennt, kann diesen Abschnitt getrost überspringen und direkt zur Installation unter Ubuntu Server springen.

Vereinfacht gesagt, adressiert Docker ein altes Problem der IT: Bei der Programmierung von Software ist man immer mit gewissen Abhängigkeiten konfrontiert. So wird beispielsweise zur Ausführung eines Java-Programms die Java-Laufzeitumgebung benötigt. Ein anderes Beispiel ist PHP: Ohne einen Webserver sind PHP-Skripte nahezu nutzlos. Dem Software-Entwickler sind diese Abhängigkeiten bekannt und er hat seine Entwicklungs-Maschine entsprechend eingerichtet. Wenn die erstellte Software nun an Kollegen oder Kunden verteilt wird, kann es passieren, dass benötigte Module, Laufzeitumgebungen oder Treiber nicht auf jedem System vorhanden sind. Hier müssen die Abhängigkeiten dann mühevoll aufgelöst und die entsprechenden Module/Laufzeitumgebungen/Treiber nachinstalliert werden, was durchaus lästig sein kann.

Eine mögliche Lösung des Problems ist die Virtualisierung von Systemen. Dazu ein Praxisbeispiel: Wer meinen Blog verfolgt, dem ist sicher aufgefallen, dass ich mich auch mit virtualisierten Systemen beschäftige. Artikel wie Ubuntu Server als Hyper-V Gastsystem installieren und optimal einrichten und Nextcloud auf Ubuntu Server mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban lassen erahnen, dass ich eine virtuelle Linux-Maschine unter Windows betreibe, die für das Hosting meiner eigenen Cloud verantwortlich ist. Warum wähle ich diesen vermeintlich umständlichen Weg?
Nextcloud ist eine PHP-Anwendung. Für PHP benötige ich einen Webserver. Unter Windows gibt es im Prinzip nur IIS (ja, es gibt auch Installer für Apache oder nginx, allerdings ist das unter Windows kein Spaß, da diese Server aus dem Linux-Umfeld kommen und nicht wirklich unter Windows zu Hause sind). IIS arbeitet allerdings nur sehr schlecht mit PHP zusammen, was die Nextcloud-Entwickler dazu veranlasst hat, Windows als Server-Plattform nicht zu unterstützen. Also bestehen vereinfacht gesagt folgende Abhängigkeiten: Nextcloud > PHP > Webserver (Apache, nginx, etc.) > Linux. Um die eigenen Cloud zum Laufen zu bekommen, benötige ich also ein Linux-System, welches ich kurzerhand mittels Hyper-V unter Windows virtualisieren kann. Diese virtuelle Maschine dient dann ausschließlich zum Hosten der eigenen Cloud.

Allerdings bedeuten virtuelle Systeme einen erheblichen Aufwand. Siehe dazu folgende Abbildung, die den schematischen Aufbau eines Systems zur Virtualisierung zeugt:

Virtualisierung mittels virtueller Maschinen
Virtualisierung mittels virtueller Maschinen

Direkt auf der Server-Hardware läuft dabei das Host-Betriebssystem. Der sog. Hypervisor sorgt für die Abstraktion der eigentlichen Hardware für virtuelle Systeme. Darauf bauen dann VMs mit ihren jeweiligen Gast-Betriebssystemen auf. Auf diesen Gast-Systemen sind dann alle Abhängigkeiten (Libraries/Binaries) installiert, die die jeweiligen Anwendungen zur Ausführung benötigen.

Vorteil: Die virtuellen Maschinen sind voneinander und vom Host-Betriebssystem getrennt und können unterschiedliche Anwendungsfälle abdecken.

Nachteil: Der Betrieb von (mehreren) virtuellen Maschinen ist ressourcenintensiv. Auch wenn leistungsstarke Hardware zum Einsatz kommt und die VMs auf SSDs laufen, dauert es eine Zeit lang, bis eine virtuelle Maschine gebootet wurde und ihren Aufgaben nachgehen kann. Darüber hinaus ist ein erhöhter administrativer Aufwand notwendig, da neben dem Host-Betriebssystem auch die virtuellen Maschinen getrennt voneinander verwaltet werden müssen (z.B. Versorgung mit Updates).

Docker ist auch eine Art Virtualisierung, dennoch ist der Grundgedanke hier ein anderer: Software mitsamt allen Abhängigkeiten wird hier in einem „Container“ zusammengefasst. Einen Container kann man sich dabei wie eine Zip-Datei vorstellen, in der alles enthalten ist, was zur Ausführung der Software benötigt wird. Allerdings müssen die Inhalte nicht entpackt und installiert werden, sondern der Container kann als Einheit verwendet werden, der seine Aufgaben durch die Ausführung mit Docker einfach erledigen kann.

Folgende Abbildung zeigt schematisch den Einsatz von Containern:

Virtualisierung mittels Containern
Virtualisierung mittels Containern

Wie man sieht, sind hier weniger Komponenten im Einsatz: Es wird beispielsweise kein Hypervisor benötigt, da die Container direkt auf dem Host-Betriebssystem ausgeführt werden. Dies macht auch den Einsatz von Gast-Betriebssystemen überflüssig.

Vorteile: Ein Container ist sehr leichtgewichtig, da dieser direkt auf dem unterliegenden Betriebssystem ausgeführt wird. Lediglich alle Abhängigkeiten und die benötigten Anwendungen selbst sind in den Containern enthalten. Dies macht sich u.a. bemerkbar, dass Container nach dem Start über Docker sofort (innerhalb weniger Sekunden) einsatzbereit sind. Dennoch sind die einzelnen Container voneinander getrennt (Sandboxing).

Das ist eigentlich alles, was sich hinter der „Magie“ hinter Docker verbirgt. Am Ende des theoretischen Teils des Artikels sollen noch einige Begrifflichkeiten aus der Docker-Welt erklärt werden, auch die man immer wieder stoßen wird, wenn man sich mit dem Thema beschäftigt:

  • Image: Ein Image stellt eine Art Template dar. Dieses Template beinhaltet alle Abhängigkeiten der Software, die später ausgeführt werden soll. Dies könnte beispielsweise ein Betriebssystem mitsamt Webserver, PHP und WordPress sein. Ein Image ist vergleichbar mit einem ISO-Image einer DVD.
  • Dockerfile: Ein Dockerfile ist zunächst eine reine Textdatei, die deklarativ beschreibt, was in einem Docker-Image enthalten ist. Mehr Informationen zu Dockerfiles sind in der Dockerfile reference zu finden. Beispiele für Dockerfiles kann man sich in diesem GitHub-Repository ansehen.
  • Container: Ein Container ist eine lauffähige Instanz eines Images, oder besser gesagt ein Image, welches gerade ausgeführt wird. Dies ist vergleichbar mit einer DVD, die aus einem ISO-Image gebrannt wurde und in ein DVD-Laufwerk eingelegt wurde.
  • Docker Hub:  Ein Webdienst, der vorgefertigte Docker-Images enthält. Diese Images können später ganz einfach durch Docker heruntergeladen und ausgeführt werden.

Installation von Docker auf Ubuntu Server

Nun geht es an die Praxis: Die Installation von Docker unter Ubuntu Server. Als Basis dienst hier Ubuntu Server 16.04 LTS.

Docker ist zunächst in zwei Ausprägungen erhältlich: Die kostenlose Community Edition (CE) und die kostenpflichtige Enterprise Edition (EE). Wir beschäftigen uns hier mit der Community Edition.

Wenn alte Versionen von Docker bereits installiert sind, sollten diese zunächst entfernt werden:

apt-get remove docker docker-engine docker.io

Die empfohlene Vorgehensweise ist die Installation aus dem offiziellen Docker-Repositories. Dazu wird das System erst einmal auf den aktuellen Stand gebracht:

apt update && apt upgrade -V && apt-get dist-upgrade

Als nächstes werden die Pakete installiert, die für den weiteren Verlauf benötigt werden:

apt install apt-transport-https ca-certificates curl software-properties-common

Nun wird der GPG-Key von Docker dem System bekannt gemacht:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Anschließend wird das Docker-Repository für apt-get hinzugefügt. Zu beachten ist hier die Architektur des Systems. Der folgende Befehl fügt das Repository für 64 Bit Systeme hinzu. Wenn eine andere System-Architektur zum Einsatz kommt (z.B. bei einen Raspberry Pi), dann muss hier ein anderes Repository angegeben werden (siehe Get Docker CE for Ubuntu). Wir verwenden hier auch den Stable-Release, damit nur stabile Versionen von Docker zum Einsatz kommen:

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

Nach dem Hinzufügen des Repositories muss noch ein Update der Paketquellen durchgeführt werden:

apt update

Anschließend kann Docker in der Community Edition installiert werden:

apt install docker-ce

Nach diesen Schritten ist Docker einsatzbereit. Testen kann man die Installation durch das Ausführen eines Test-Images, welches lediglich eine Statusmeldung über Docker ausgibt:

docker run hello-world
Docker ist einsatzbereit
Docker ist einsatzbereit

An dieser Stelle noch ein Hinweis: Wenn Docker Images heruntergeladen und ausgeführt werden, findet man diese im Verzeichnis /var/lib/docker. Auch wenn Docker später wieder deinstalliert werden sollte, bleiben auf dem System bereit gestellte Container in diesem Verzeichnis bestehen.

Fazit

In diesem Artikel wurden zunächst einmal die Grundlagen von Docker ermittelt. Anschließend wurde gezeigt, wie man Docker mit wenigen Schritten unter Ubuntu Server installieren kann.

Nach der Docker-Installation kann das System nun eingesetzt werden. In einem bald folgenden Artikel wird ein praktisches Beispiel folgen, wie Docker verwendet werden kann, um Nextcloud um sinnvolle Funktionen zu erweitern (Stichwort: Collabora).

Weiterführende Artikel

Links

14 Kommentare zu „Docker auf Ubuntu Server“

  1. Hallo, vielen Dank für deine immer wirklich einfach verständlich und sehr gut gemachten Tutorials. Ich bin seit Jahren ein großer (stiller) Fan :) Meine OwnCloud läuft danke deines Tutorials seit Jahren, würde sie aber vielleicht gerne auf NextCloud umstellen. Dazu gleich die erste Frage. Hat es einen Grund wieso du deine NextCloud in Ubuntu installierst und diese nicht auch als Docker Container laufen hast? Ich habe z. B. gerade einen Docker Container aufgesetzt um GitLab und Mattermost zu nutzen. Mir ist im Moment aber noch unklar, wie ich das Konstrukt auf HTTPS umstelle bzw. mein letsencrypt cert in den container bekomme :D Es gibt ein NextCloud Image welche letsencrypt mitbringt. Sollte ich das ans laufen bekommen, kann ich die letsencrypt installation aus diesem Container in dem GitLab/Mattermost Container nutzen?

    Vielleicht bringst du zum Thema Docker noch das ein oder andere Tutorial? Würde mich freuen!

    VG

    1. Hi Markus,

      der Grund, warum ich die „klassische“ Installation bevorzuge, ist ganz einfach: Als ich angefangen habe, mich mit dem Thema zu beschäftigen, war Docker noch nicht so im kommen wie jetzt. Hier habe ich erst einmal sehr viel Zeit in Untersuchungen stecken müssen, wie man eine Linux-VM unter Windows ordentlich ans Laufen bekommt. Wenn dies geschafft ist, ist es quasi kein Hexenwerk mehr, auch Nextcloud, Let’s Encrypt oder andere Webanwendungen zum Laufen zu bekommen.
      Mit Docker hatte ich mich lange Zeit nicht beschäftigt, erst Nextcloud/Collabora war der konkrete Anlass, sich mal intensiver mit diesem Thema auseinanderzusetzen. Hier betrachte ich den Docker-Container eher als Blackbox, der nur eine konkrete Aufgabe übernimmt (Online-Office-Funktionalität), ohne dass ich genau wissen muss, die das Image realisiert wurde. Diese Vorstellung gefällt mir sehr gut.

      Klar, es gibt auch eine Docker-Image für Nextcloud, sowie für viele weitere Webanwendungen. Wenn man diese allein stehend einsetzt, dann ist das sicher auch eine interessante Lösung. Wenn diese Container allerdings zusammen arbeiten sollen, dann wird die Sache schon etwas komplizierter: Hier muss ein Container dann sämtliche Web-Requests entgegen nehmen und ggf. an andere Docker-Container weiterleiten. Hier würde ich vermutlich die Config-Dateien der virtuellen Hosts auf ein Volume auslagern (welches dann in Docker gemountet wird), da die Configs angepasst werden müssen und diese Änderungen persistent sein müssen. Vielleicht gibt es hier noch elegantere Lösungen, allerdings würde ich das erst einmal als Ansatzpunkt nehmen.
      Ein „Gebilde“ aus mehreren Docker-Containern zum Laufen zu bekommen, die dann noch untereinander kommunizieren sollen, ist denke ich um einiges komplizierter, als eine „einfache“ Installation der Webanwendungen, Webserver, etc. auf einer einzelnen Maschine.

      Wenn an dem Thema Docker im allgemeinen großes Interesse besteht, dann kann ich mich nochmal intensiver mit dem Thema auseinandersetzen. Vielleicht springt ja das eine oder andere Tutorial dabei raus. ;)

      Gruß,
      Jan

  2. Hallo Jan,

    zunächst mal ein riesen Kompliment und meinen herzlichsten Dank für deine, auch für einen Laien, nachvollziehbaren und verständlichen Tutorials!!!

    Mit Hilfe deiner Vorarbeit (ownCloud 9 auf Ubuntu Server 16.04 LTS mit nginx, MariaDB, PHP 7 und Let’s Encrypt) ist es sogar mir gelungen, meinen eigenen NAS zu betreiben, den ich inzwischen um DNLA-Funktionalität und einen Mumble-/Murmur-Server erweitert habe.

    Anfang des Jahres hatte ich mir vorgenommen, einen Mail-Server aufzusetzen und bin bei der Suche nach einer geeigneten Suite auf Mailcow gestoßen.

    Als ich mich nun zu Beginn der dunklen Jahreszeit wieder mit dem Thema befassen wollte, musste ich feststellen, daß Mailcow 0.14 wohl nicht mehr aktuell ist und das Projekt inzwischen auf Docker (Mailcow: dockerized) umgestellt wurde.

    Solltest Du bei deiner intensiveren Auseinandersetzung mit dem Thema Docker über diesen Ansatz stolpern, wäre es natürlich grandios, wenn eine Erweiterung deines Tutorials auf der Basis von „Nextcloud auf Ubuntu Server mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban“ dabei herausspringen würde. ;-) ;-)

    Bis dahin nochmals meinen herzlichsten Dank und größten Respekt für deine bisher geleistete Arbeit!!

    1. Hallo Ingo,

      danke für das Lob, das lese ich immer wieder gerne. ;)

      Das Thema mailcow habe ich nun mal in die Todo-Liste aufgenommen – versprechen kann ich aber wie immer nichts. Einen Mail-Server zu betreiben ist eine reichlich komplexe Sache. Hier brauche ich vermutlich erst wohl etwas Zeit, um mich hier einzuarbeiten.

      Gruß,
      Jan

  3. Kurze Frage. Kann ich Docker auf einem virtuellem Server mit Ubuntu 16.04 installieren oder ist eine „Virtualisierung“ in einer „Virtualisierung“ zu viel des guten?

      1. Hallo Jan,

        danke. Ich hatte Probleme mit meiner Installation und wollte wissen ob es generell möglich ist. Wie ich nun herausgefunden habe und wie du ja bestätigst ist es das. Nur leider hat mein Hoster für den V-Server den Kernel angepasst so dass es bei dem nicht möglich ist. Leider schade.

        Gruß
        Frank

  4. Hallo,
    ich habe docker nach dieser Anleitung installiert.
    Die Installation lief auch wie gewünscht – vielen Dank dafür.

    Ich habe nur ein Problem:
    Nach einem „apt update“ erhalte ich folgende Meldung:

    W: https://download.docker.com/linux/ubuntu/dists/jammy/InRelease: Schlüssel ist im veralteten Schlüsselbund trusted.gpg gespeichert (/etc/apt/trusted.gpg), siehe den Abschnitt MISSBILLIGUNG in apt-key(8) für Details.

    Kannst Du mir einen Tipp geben, wie ich das richtig stelle?
    Vielen Dank

    1. Hi,

      ja, unter Ubuntu 22.04 hat sich beim Verwalten der Repo-Keys etwas verändert. Die alte Methode klappt weiterhin, es wird aber eine Warnung ausgegeben.
      Um dies unter 22.04 „richtig“ zu machen, sind hier folgende Befehle notwendig:
      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

      Gruß,
      Jan

      1. Vielen Dank, das ist richtig.
        Vorher musste ich noch Folgendes „korrigieren“:

        # nano /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
        >
        # deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable
        # deb-src [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable
        ### Quellen auskommentieren

        # apt-key list
        >
        docker_Schlüssel wird oben angezeigt

        # apt-key del 0EBF CD88
        ### die letzten acht Ziffern der Key-ID angeben

  5. Hat bereits jemand erfolgreich portainer auf ubuntu server 22.04 per https unter nginx mit eigenen Zertifikaten angesprochen ?
    Also z.B. aufrufbar über eine subdomain wie https://portainer.meinedomain.de ähnlich zu dem erfolgreichem nextcloud-Artikel hier, aber irgendwie klappt’s noch nicht..

    1. Hi Ronald,

      mit Portainer habe ich bisher noch nichts gemacht, daher kann ich hier denke ich nicht weiter helfen. Aber vielleicht hat das ja schon mal ein Leser des Blogs zum Laufen gebracht.

      Gruß,
      Jan

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert