{"id":7393,"date":"2021-08-22T13:07:47","date_gmt":"2021-08-22T11:07:47","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7393"},"modified":"2022-12-12T18:31:18","modified_gmt":"2022-12-12T16:31:18","slug":"docker-auf-dem-raspberry-pi-installieren-erste-container-starten-einfach-erklaert","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/docker-auf-dem-raspberry-pi-installieren-erste-container-starten-einfach-erklaert\/","title":{"rendered":"Docker auf dem Raspberry Pi installieren &#038; erste Container starten einfach erkl\u00e4rt"},"content":{"rendered":"<p><a href=\"https:\/\/u-labs.de\/portal\/docker-auf-dem-raspberry-pi-das-sind-die-vorteile-von-containertechnologie-auf-dem-einplatinencomputer\/\" title=\"Docker auf dem Raspberry Pi?  Das sind die Vorteile von Containertechnologie auf dem Einplatinencomputer\">In unserem vorherigen Beitrag\/Video haben wir uns mit der Frage besch\u00e4ftigt, ob Docker auf dem Raspberry Pi Sinn macht.<\/a> Zusammengefasst war das Ergebnis: Es gibt durchaus einige sinnvolle Anwendungsf\u00e4lle, um Containertechnologien wie Docker auf dem Pi einzusetzen. Wenn ihr euch daf\u00fcr entschieden habt bzw. Docker ausprobieren m\u00f6chtet, zeigt euch folgender Beitrag, wie man Docker auf dem Raspberry Pi installiert.<\/p>\n<h2 class=\"wp-block-heading\">Vorbereitung: System auf den aktuellen Stand bringen<\/h2>\n<p>Wie vor jeglicher Softwareinstallation sollten wir zun\u00e4chst die Paketquellen inklusive der Pakete aktualisieren, um m\u00f6gliche Konflikte zu vermeiden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt update &amp;&amp; sudo apt upgrade<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Docker auf dem Raspberry Pi installieren<\/h2>\n<p>F\u00fcr die eigentliche Installation hat uns Docker ein Bash-Skript zur Verf\u00fcgung gestellt. Es f\u00fcgt automatisch die offiziellen Paketquellen hinzu und installiert die Pakete, wie z.B. docker-ce. Dieses Skript laden wir herunter und f\u00fchren es aus:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">curl -fsSL https:\/\/get.docker.com -o install-docker.sh\nbash install-docker.sh<\/code><\/pre>\n<p>Damit Docker ohne Root-Rechte (also ohne sudo) ausgef\u00fchrt werden kann, wird unser aktueller Benutzer in die gleichnamige Benutzergruppe aufgenommen. Anschlie\u00dfend mit newgrp die Gruppenmitgliedschaft neu laden &#8211; dadurch ist die \u00c4nderung sofort wirksam, ohne eine neue Konsolensitzung zu starten.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo usermod -aG docker $USER\nnewgrp docker<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Starten unserer ersten Docker-Containers auf dem Raspberry Pi<\/h2>\n<p>Der Klassiker <em>Hello World<\/em> ist auch als Docker-Image verf\u00fcgbar und bietet sich als erster Test an. <\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker run hello-world<\/code><\/pre>\n<p>Ein sinnvolleres Beispiel ist dagen ein Webserver. Auf Basis des aktuellsten Nginx-Images starten wir einen gleichnamigen Container. Damit wir auf den Nginx Webserver zugreifen k\u00f6nnen, ist eine Portweiterleitung notwendig. In diesem Beispiel wird Port 80 des Containers auf Port 80 des Hosts weitergeleitet. Das Format ist <strong>Host:Container<\/strong>. Soll Port 80 des Containers auf Port 81 des Hosts bereitgestellt werden, lie\u00dfe sich dies \u00fcber <strong>-p 81:80<\/strong> realisieren.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker run --name webserver -p 80:80 nginx:latest<\/code><\/pre>\n<p>Rufen wir nun im Browser <strong>http:\/\/<\/strong> gefolgt vom Hostname oder der IP-Adresse des Pi auf, erscheint die Standard-Willkommensseite des Nginx Webservers. Da wir den Container im Vordergrund gestartet haben, sehen wir auf der Konsole die Zugriffslog &#8211; mit unserer soeben durchgef\u00fchrten Testabfrage.<\/p>\n<p>Standardm\u00e4\u00dfig laufen Container im Vordergrund und k\u00f6nnen daher mit STRG + C beendet werden. <\/p>\n<h3 class=\"wp-block-heading\">Bereitstellen eigener HTML-Dateien \u00fcber den Webserver<\/h3>\n<p>Um eigene Dateien wie z.B. statische HTML-Seiten bereitzustellen, m\u00fcssen wir ein Volume mounten. Docker-Container sind standardm\u00e4\u00dfig isoliert. Sie haben keinen Zugriff auf Ordner oder Dateien des Hostsystemes &#8211; au\u00dfer wir stellen diese \u00fcber ein Volume bereit. Dazu gibt es das Argument <strong>-v Hostpfad:Containerpfad<\/strong> &#8211; im Beispiel legen wir einen Ordner <strong>\/tmp\/www<\/strong> an. Dieser soll vom Webserver ausgeliefert werden. Beispielhaft mit einer kleinen index.html Seite:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">mkdir \/tmp\/www\necho &#039;&lt;h1&gt;Hallo vom ersten Nginx Webserver auf deinem Pi!&lt;\/h1&gt;&#039; &gt; \/tmp\/www\/index.html<\/code><\/pre>\n<p>Da der Name eines Containers einmalig sein muss, ist es notwendig, zun\u00e4chst den oben erstellten Container namens <strong>webserver<\/strong> zu l\u00f6schen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker rm webserver<\/code><\/pre>\n<p>Nun kann ein neuer gestartet werden, dem wir <strong>\/tmp\/www<\/strong> in <strong>\/usr\/share\/nginx\/html<\/strong> bereitstellen. Der Container hat aus seiner Sicht ein eigenes Dateisystem, unabh\u00e4ngig vom Host. Nginx wurde in seinem Image so konfiguriert, dass alle Dateien und Ordner innerhalb von  <strong>\/usr\/share\/nginx\/html<\/strong>  ausgeliefert werden. Durch folgendes Volume h\u00e4ngen wir dort den Ordner <strong>\/tmp\/www<\/strong> des Hostsystemes ein:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker run --name webserver -p 80:80 -v \/tmp\/www:\/usr\/share\/nginx\/html nginx:latest<\/code><\/pre>\n<p>Wie zuvor kann nun <strong>http:\/\/<\/strong> gefolgt vom Hostname oder der IP-Adresse des Pi aufgerufen werden, um unsere Testseite im Browser anzuschauen.<\/p>\n<p>Der Container l\u00e4uft allerdings nur, so lange die Konsole ge\u00f6ffnet ist und der Befehl l\u00e4uft. Schlie\u00dfen wir die Konsole oder beenden den laufenden <strong>docker run<\/strong> Befehl mit STRG + C, l\u00e4uft der Webserver nicht mehr. Je nachdem was wir mit Docker machen m\u00f6chten ist dies in Ordnung. F\u00fcr Prozesse die st\u00e4ndig im Hintergrund laufen sollen, macht es wenig Sinn. Docker bietet daf\u00fcr den sogenannten <strong>detach mode<\/strong> an: Er startete den Container im Hintergrund, v\u00f6llig unabh\u00e4ngig von der aktuellen Konsolensitzung. In etwa vergleichbar, als w\u00fcrde der Prozess im Container als Systemd-Dienst oder mit screen gestartet werden.<\/p>\n<p>Daf\u00fcr gen\u00fcgt es, den Schalter <strong>-d<\/strong> an<strong> docker run<\/strong> anzuh\u00e4ngen<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker run -d --name webserver -p 80:80 -v \/tmp\/www:\/usr\/share\/nginx\/html nginx:latest<\/code><\/pre>\n<p>Die Ausgabe des Containers \u00f6ffnet sich dadurch nicht mehr automatisch, da er ja im Hintergrund gestartet wird. Wir k\u00f6nnen sie mit <strong>docker log<\/strong> jedoch jederzeit \u00f6ffnen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker logs -f webserver<\/code><\/pre>\n<p>Durch <strong>-f<\/strong> <strong>f<\/strong>olgt Docker den Bildschirmausgaben, wir sehen also neue Eintr\u00e4ge sofort auf der Konsole. Alternativ k\u00f6nnen wir den Befehl auch ohne -f verwenden. Dann erscheinen nur \u00e4ltere Logs, die bis zum Aufruf des Befehles vorlagen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In unserem vorherigen Beitrag\/Video haben wir uns mit der Frage besch\u00e4ftigt, ob Docker auf dem Raspberry Pi Sinn macht. Zusammengefasst war das Ergebnis: Es gibt durchaus einige sinnvolle Anwendungsf\u00e4lle, um Containertechnologien wie Docker auf dem Pi einzusetzen. Wenn ihr euch daf\u00fcr entschieden habt bzw. Docker ausprobieren m\u00f6chtet, zeigt euch folgender Beitrag, wie man Docker auf &#8230;<\/p>\n","protected":false},"author":5,"featured_media":7396,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[912,497],"class_list":["post-7393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-container","tag-docker"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7393"}],"version-history":[{"count":4,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7393\/revisions"}],"predecessor-version":[{"id":9838,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7393\/revisions\/9838"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/7396"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}