{"id":13975,"date":"2022-06-15T00:17:57","date_gmt":"2022-06-14T22:17:57","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=13975"},"modified":"2022-06-15T00:18:17","modified_gmt":"2022-06-14T22:18:17","slug":"docker-installation-mit-cloud-init","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/de\/docker-installation-mit-cloud-init\/","title":{"rendered":"Docker Installation und Konfiguration mit Cloud-Init"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg\" alt=\"blog_header\" class=\"wp-image-13959\" srcset=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg 1200w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation-600x315.jpg 600w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation-768x403.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p>Docker ist eine freie Software mit der Du Anwendungen in einer isolierten Umgebung betreiben kannst. Diese Umgebung ist von Infrastruktur auf dem Du Deinen Docker-Container laufen l\u00e4sst getrennt. Wir alle kennen den Satz \u201eAber es l\u00e4uft doch auch auf meinem System!\u201c. Docker versucht genau das zu gew\u00e4hrleisten. Die Umgebung, auf dem deine App oder Dein Programm unter Docker l\u00e4uft hei\u00dft <em>Container<\/em>. Dieser <em>Container<\/em> kann sowohl auf deinem Host-System als auch auf anderen Systemen repliziert werden. Alles was Du daf\u00fcr tun musst, ist Docker auf dem jeweiligen System zu installieren.<br>Weitere Informationen \u00fcber Container und die Unterschiede zu virtuellen Maschinen findest Du in <a href=\"https:\/\/contabo.com\/blog\/de\/container-vs-virtuelle-maschinen\/\" target=\"_blank\" rel=\"noreferrer noopener\">diesem Artikel.<\/a><\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Warum sollte Ich Docker benutzen?<\/h2>\n\n\n\n<p>Es gibt viele Situationen in denen Docker Deinen Workflow bereichern kann. Hierbei ist Docker schnell und sicher:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Entwicklung:<\/strong> Wenn Deine Entwickler etwas lokal entwickeln und dies mit Dir teilen wollen ist es manchmal schwierig, die exakte Umgebung auf anderen Maschinen zu replizieren. (z.B. anderes Betriebssystem, ben\u00f6tigte Software fehlt, \u2026). Sollte dieses Programm allerdings in einer standardtisierten Umgebung \u2013 in diesem Fall ein Docker Container \u2013 verpackt sein, musst Du auf der anderen Maschine lediglich Docker installieren und die Anwendung l\u00e4uft genau so wie auf der Maschine Deines Entwicklers, da die Umgebung von Docker repliziert wird.<\/li><li><strong>Ver\u00f6ffentlichung:<\/strong> Der obige Teil gilt auch f\u00fcr die Produktivumgebung: Sobald die Software ausgiebig getestet wurde und bereit f\u00fcr die Ver\u00f6ffentlichung ist, muss nur der aktualisierte Container hochgeladen werden.<\/li><li><strong>Portabilit\u00e4t:<\/strong> Die einzige Voraussetzung, um solch einen Container zu betreiben ist, das Docker installiert ist. Somit kannst du einen Container auf dem lokalen PC Deines Entwicklers, auf einem physischen oder virtuellen Server in einem Rechenzentrum oder auf einer Cloud Instanz betreiben. Es ist keine spezielle Umgebung notwendig, da Docker die n\u00f6tige Umgebung selbst erzeugt.<\/li><\/ul>\n\n\n\n<p>Zusammenfassend l\u00e4sst sich sagen, dass Docker Dir hilft, die Entwicklung zu vereinfachen, indem es die genaue Umgebung schafft, die f\u00fcr die Ausf\u00fchrung der Anwendung erforderlich ist, und dadurch auch die Bereitstellung der Anwendung zuverl\u00e4ssiger und konsistenter macht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist nochmal Cloud-Init?<\/h2>\n\n\n\n<p>Du kannst dir Cloud-Init wie Docker vorstellen, allerdings f\u00fcr Cloud-Instanzen und nicht f\u00fcr einzelne Anwendungen. Eine Cloud-Init Konfiguration beschreibt den gew\u00fcnschten Zustand der Instanz und Cloud-Init richtet die Instanz genau wie beschrieben ein. Cloud-Init hat viele eingebaute Module, mit denen Du fast jedes Verhalten Deiner Instanz anpassen kannst, wie z.B. das Einrichten von Benutzern und Gruppen, das Hinzuf\u00fcgen von SSH-Schl\u00fcsseln, das Installieren von Software, das einfach Ausf\u00fchren von Befehlen oder das Erstellen von Dateien.<\/p>\n\n\n\n<p>Allerdings ist Cloud-Init nicht nur dazu da, eine einzelne Installation eines neuen VPS zu automatisieren, sondern hilft Dir dabei, eine Reihe neuer Instanzen in gro\u00dfen Umfang einzurichten. Du erstellst einmalig eine Konfiguration und kannst sie dann mehrfach verwenden um neue Instanzen einzurichten. Dies spart im Falle eines Serverfehlers Zeit, die Du anders nutzen kannst. Au\u00dferdem ist Cloud-Init auch hilfreich, wenn Du schnell mehrere Instanzen ben\u00f6tigst um die wachsende Arbeitslast zu bew\u00e4ltigen.<\/p>\n\n\n\n<p>Wenn Du mehr \u00fcber die Grundlagen von Cloud-Init erfahren willst, empfehlen wir Dir unseren <a href=\"https:\/\/contabo.com\/blog\/de\/was-ist-cloud-init\/\" target=\"_blank\" rel=\"noreferrer noopener\">Artikel \u00fcber Cloud-Init.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum sollte Ich Docker zusammen mit Cloud-Init verwenden?<\/h2>\n\n\n\n<p>Stell Dir vor, Deine Anwendung ist mit Docker standardisiert. Nun ist es an der Zeit, diese Anwendung zu ver\u00f6ffentlichen bzw. bereitzustellen. Du musst dich nicht viel um die Anwendung an sich k\u00fcmmern, da Du diese in einen Docker Container gepackt hast. Bevor Du diesen Container allerdings starten kannst, muss Docker allerdings auf Deinem Server installiert werden. Um Docker auf deinem Server zu installieren, musst Du Docker zun\u00e4chst einrichten, alle ben\u00f6tigten Pakete installieren und ggf. Sicherheitsvorkehrungen treffen usw. All dies ben\u00f6tigt viel Zeit bevor Du den eigentlichen Container starten und somit die Anwendung bereitstellen kannst. Hier kommt Cloud-Init ins Spiel: Cloud-Init hilft Dir, diesen Prozess zu automatisieren indem es Deinen Server bereits einrichtet (und Docker installiert). Du kannst also direkt loslegen und deinen Docker Container starten und deine Anwendung bereitstellen.<\/p>\n\n\n\n<p>Machen wir uns also an die Arbeit und erstellen eine Cloud-Init Konfigurationsdatei.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erste Schritte mit Docker<\/h2>\n\n\n\n<p>Um mitmachen zu k\u00f6nnen, musst Du Docker zun\u00e4chst auf deinem System installieren. In der <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">offiziellen Docker Dokumentation <\/a>findest Du Installationsanleitungen f\u00fcr verschiedene Betriebssysteme.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ein Demo-Projekt erstellen<\/h3>\n\n\n\n<p>Der Einfachheit halber erstellen wir eine einfache NodeJS Anwendung, die <em>express<\/em> als Webserver verwendet, um eine \u201eHello World\u201c Nachricht anzuzeigen. Stelle sicher, dass NodeJS auf Deinem Server installiert ist und f\u00fchre die folgenden Befehle in Deinem Terminal aus:<\/p>\n\n\n\n<p><code>npm init -y<\/code><\/p>\n\n\n\n<p><code>npm install express<\/code><\/p>\n\n\n\n<p>Hierdurch wird ein neues NodeJS Projekt eingerichtet und <em>express<\/em> installiert. Erstelle nun eine <em>index.js<\/em> Datei, in die wir folgenden Code einf\u00fcgen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const express = require(\"express\");\r\nconst app = express();\r\n\r\n\/\/ Use PORT specified in the environment variables or use 3000 as fallback\r\nconst PORT = process.env.PORT || 3000;\r\n\r\n\/\/ Listen to incoming GET requests\r\napp.get(\"\/\", function(request, response) {\r\n    response.send(\"Hello from NodeJS in Docker!\");\r\n});\r\n\r\n\/\/ Start the app on the specifiec port\r\napp.listen(PORT, function() {\r\n    console.log(`App is running on http:\/\/localhost:${PORT}`);\r\n});<\/code><\/pre>\n\n\n\n<p>Um diese Anwendung zu testen f\u00fchre den folgenden Befehl aus:<\/p>\n\n\n\n<p><code>node index.js<\/code><\/p>\n\n\n\n<p>Diesen Befehl f\u00fcgen wir allerdings zum <em>package.json<\/em> hinzu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\r\n  \"name\": \"docker-cloudinit-sample\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"\",\r\n  \"main\": \"index.js\",\r\n  \"scripts\": {\r\n    \"start\": \"node index.js\"\r\n  },\r\n  \"keywords\": &#91;],\r\n  \"author\": \"\",\r\n  \"license\": \"ISC\",\r\n  \"dependencies\": {\r\n    \"express\": \"^4.18.1\"\r\n  }\r\n}<\/code><\/pre>\n\n\n\n<p>Nun k\u00f6nnen wir unsere Anwendung mit dem folgenden Befehl starten:<\/p>\n\n\n\n<p><code>npm run start<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die Dockerfile<\/h3>\n\n\n\n<p>Wir selbst wissen nat\u00fcrlich, wie die Anwendung ausgef\u00fchrt wird und was installiert werden muss, Docker allerdings nicht.<\/p>\n\n\n\n<p>Diese Informationen teilen wir Docker mit dem sogenannten Dockerfile mit. Also erstellen wir eins. Wir fangen mit einem Image an, aber anstatt Debian oder Ubuntu zu verwenden, wo wir&nbsp; NodeJS selbst installieren m\u00fcssten, k\u00f6nnen wir das Node-Image verwenden. In diesem Image ist NodeJS bereits installiert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:16<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes brauchen wir ein Verzeichnis, in dem wir arbeiten k\u00f6nnen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WORKDIR \/usr\/src\/app<\/code><\/pre>\n\n\n\n<p>Denke daran, dass Docker die im Dockerfile angegebenen Schritte zwischenspeichert. Im n\u00e4chsten Schritt kopieren wir also nur die Paketdateien (package.json und package-lock.json) und installieren die Abh\u00e4ngigkeiten. Das bedeutet, dass Docker die Abh\u00e4ngigkeiten nicht jedes Mal neu installiert, wenn wir etwas im Quellcode \u00e4ndern \u2013 dieser Schritt wird nur dann erneut ausgef\u00fchrt, wenn sich die Paketdateien \u00e4ndern.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY package*.json .\/\r\nRUN npm install\r\n# Use this in production:\r\n# RUN npm ci --only=production<\/code><\/pre>\n\n\n\n<p>Jetzt musst Du nur noch den Code kopieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY . .<\/code><\/pre>\n\n\n\n<p>Nun k\u00f6nnen wir auch den Port angeben, auf dem die Anwendung laufen soll. Denke daran, dass dieser Port der interne Port innerhalb des Containers ist. Einen Port, um von au\u00dferhalb des Containers auf diesen zuzugreifen, weisen wir sp\u00e4ter zu. In diesem Beispiel verwendet die NodeJS Anwendung den Port 80 innerhalb des Containers.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ENV PORT=80<\/code><\/pre>\n\n\n\n<p>Um die Anwendung zu starten m\u00fcssen wir den Befehl ausf\u00fchren, welchen wir bei der Erstellung der NodeJS Anwendung angegeben haben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CMD npm run start<\/code><\/pre>\n\n\n\n<p>Hier ist das finale Dockerfile:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:16\r\nWORKDIR \/usr\/src\/app\r\nCOPY package*.json .\/\r\nRUN npm install\r\nCOPY . .\r\nENV PORT=80\r\nCMD npm run start<\/code><\/pre>\n\n\n\n<p>Denke aber daran, dass Docker alle erforderlichen Abh\u00e4ngigkeiten installiert. Wir wollen also eine <em>.dockerignore<\/em>-Datei erstellen, um den Order <em>node_modules<\/em> zu ignorieren (f\u00fcge dieser Datei alles hinzu, was von Docker ignoriert werden soll, z.B. Protokolle):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># .dockerignore\r\nnode_modules<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ein Image erstellen<\/h3>\n\n\n\n<p>Das Image kann mit einem einzigen Befehl erstellt werden:<\/p>\n\n\n\n<p><code>docker build . -t &lt;Dein Benutzername>\/node-web-app<\/code><\/p>\n\n\n\n<p>Verwende <code>.<\/code> als zweites Argument, wenn Du den Befehl im Verzeichnis der Anwendung ausf\u00fchren willst, oder ersetze den . mit dem Pfad der Anwendung. Mit dem Flag <code>-t<\/code> kannst Du einen Namen f\u00fcr das Image angeben. Diesen ben\u00f6tigten wir sp\u00e4ter, wenn wir Container aufsetzen und in die Registry stellen wollen.<\/p>\n\n\n\n<p>Hinweis: Wenn Du versuchst, das Image auf dem Server zu verwenden, kann es aufgrund der Plattform (<em>linux\/amd64 und linux\/amd64\/v8<\/em>) zu einem Fehler kommen. Du kannst dieses Problem beheben, indem Du die Plattform im Build-Prozess angibst (f\u00fcge <code>\u2013plattform linux\/amd64<\/code> an den Befehl an).<\/p>\n\n\n\n<p>Um das Image zu testen, k\u00f6nnen wir einen neuen Container mit dem soeben erstellten Image aufsetzen:<\/p>\n\n\n\n<p><code>docker run -p 5000:80 -d &lt;Dein Benutzername>\/node-web-app<\/code><\/p>\n\n\n\n<p>Mit dem Flag <code>-p<\/code> kannst du einen Port, der von au\u00dfen zug\u00e4nglch ist, einem Port innerhalb des Containers zuordnen. Erinnere Dich daran, dass wir den Port in dem Dockerfile auf <em>80<\/em> gesetzt haben. <em>5000:80<\/em> sagt Docker, das wir den \u00f6ffentlichen Port <em>5000<\/em> auf den internen Port <em>80<\/em> innerhalb des Containers umleiten wollen. Das hei\u00dft, wenn wir <em>&lt;IP>:5000<\/em> anfragen, wird die Anfrage an diesen Container gesendet und innerhalb des Containers als Anfrage an den Port <em>80<\/em> behandelt.<\/p>\n\n\n\n<p>Wenn Du in Deinem Browser <em>localhost:5000<\/em> \u00f6ffnest, solltest Du <em>\u201eHello from NodeJS in Docker!\u201c<\/em> sehen k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Image-Hosting<\/h3>\n\n\n\n<p>Bevor wir das Image auf dem Produktionsserver verwenden k\u00f6nnen, m\u00fcssen wir es irgendwo hosten. Ein beliebter Ort daf\u00fcr ist der <a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Docker Hub<\/a>. Hier werden bereits viele fertige Docker-Images gehostet (z.B. das Node-Image, das wir bei der Erstellung des Dockerfiles verwendet haben) und man kann auch eigene Images hochladen. Eine weitere M\u00f6glichkeit ist die Verwendung anderer Registries, wie <a href=\"https:\/\/aws.amazon.com\/ecr\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">AWS ECR<\/a>.<\/p>\n\n\n\n<p>F\u00fcr diese Anleitung erstellen wir ein kostenloses Konto bei Docker Hub und ver\u00f6ffentlichen das Image dort. Nachdem Du Dein Konto erstellt hast, klicke auf die Registerkarte \u201eRepositories\u201c und erstelle ein neues Repository. Ein Repository kann viele Images enthalten (die als Tags gespeichert werden).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1620\" height=\"1138\" src=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/docker_hub_image_hosting.png\" alt=\"docker_hub_image_hosting\" class=\"wp-image-13972\" srcset=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/docker_hub_image_hosting.png 1620w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/docker_hub_image_hosting-600x421.png 600w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/docker_hub_image_hosting-768x539.png 768w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/docker_hub_image_hosting-1536x1079.png 1536w\" sizes=\"auto, (max-width: 1620px) 100vw, 1620px\" \/><\/figure>\n\n\n\n<p>Wir pushen die Images mit der Docker-CLI in die Registry, genauso wie wir es bei der Erstellung des Images gemacht haben. Doch bevor der Push-Befehl verf\u00fcgbar ist, m\u00fcssen wir uns mit docker login anmelden.<\/p>\n\n\n\n<p>Um das Image zu pushen, musst Du sicherstellen, dass es genau wie in Deinem Repository benannt ist. Du kannst hier auch einen Tag hinzuf\u00fcgen:<\/p>\n\n\n\n<p><code>docker tag &lt;Dein Benutzername>\/node-web-app &lt;dockerhub repo name>:&lt;tag><\/code><\/p>\n\n\n\n<p>Der finale Befehl sieht in etwa so aus:<\/p>\n\n\n\n<p><code>docker tag einlinuus\/node-demo-app einlinuus\/testing:node<\/code><\/p>\n\n\n\n<p>Und dieses Image kann nun in den Docker Hub gepusht werden:<\/p>\n\n\n\n<p><code>docker push &lt;dockerhub repo name>:&lt;tag><\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation von Docker und Konfiguration von Containern mit Cloud-Init<\/h2>\n\n\n\n<p>In dieser Anleitung verwenden wir das Image, das wir gerade auf Docker Hub hochgeladen haben als Beispiel.<\/p>\n\n\n\n<p>Wenn Du diesen Teil \u00fcbersprungen hast, verwende das folgende Docker-Image:<\/p>\n\n\n\n<p><a href=\"https:\/\/hub.docker.com\/repository\/docker\/einlinuus\/testing\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">einlinuus\/testing:node<\/a><\/p>\n\n\n\n<p>Dies ist genau das Image, das wir in den obigen Schritten \u201eErste Schritte mit Docker\u201c erstellt und hochgeladen haben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker mit einem einfachen Script installieren:<\/h3>\n\n\n\n<p>Docker kann mit verschiedenen Methoden installiert werden, aber wir beginnen mit einem einfachen Script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#cloud-config\r\nruncmd:\r\n  - curl -fsSL https:\/\/get.docker.com | sh\r\n  - docker pull einlinuus\/testing:node\r\n  - docker run -d -p 80:80 einlinuus\/testing:node<\/code><\/pre>\n\n\n\n<p>Das ist eine ziemlich einfache Konfiguration, da wir nur ein Modul (runcmd) mit 3 Befehlen verwenden:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>L\u00e4d das Script mit cURL herunter und f\u00fchrt es aus.<\/li><li>L\u00e4d das Docker-Image von Docker Hub herunter und speichert es lokal.<\/li><li>F\u00fchrt das heruntergeladene Image aus und ordnet es Port 80 dem Port 80 im Container zu (damit unsere App \u00fcber den Standard-HTTP-Port erreichbar ist, ohne das eine Port-Spezifikation erforderlich ist)<\/li><\/ol>\n\n\n\n<p>Das ist im Grunde alles, was Du brauchst, um Docker mit Cloud-Init zu installieren und einzurichten. Aber wie in der <a href=\"https:\/\/docs.docker.com\/engine\/install\/debian\/#install-using-the-convenience-script\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">offiziellen Docker-Dokumentation <\/a>angegeben, wird dieses simple Script in Produktionsumgebungen nicht empfohlen. Und da unser Ziel darin besteht, den Server produktionsreich zu machen, sollten wir uns auch eine andere Installationsmethode ansehen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker Repository<\/h3>\n\n\n\n<p>Um Docker mit dieser Methode zu installieren, m\u00fcssen wir zun\u00e4chst das Docker-Repository hinzuf\u00fcgen. Danach k\u00f6nnen die erforderlichen Pakete wie jedes andere Paket auch installiert werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#cloud-config\r\npackage_update: true\r\npackage_upgrade: true\r\npackages:\r\n  - apt-transport-https\r\n  - ca-certificates\r\n  - curl\r\n  - gnupg-agent\r\n  - software-properties-common\r\nruncmd:\r\n  - curl -fsSL https:\/\/download.docker.com\/linux\/debian\/gpg | apt-key add -\r\n  - add-apt-repository \"deb &#91;arch=$(dpkg --print-architecture)] https:\/\/download.docker.com\/linux\/debian $(lsb_release -cs) stable\"\r\n  - apt-get update -y\r\n  - apt-get install -y docker-ce docker-ce-cli containerd.io\r\n  - systemctl start docker\r\n  - systemctl enable docker\r\n  - docker pull einlinuus\/testing:node\r\n  - docker run -d -p 80:80 einlinuus\/testing:node<\/code><\/pre>\n\n\n\n<p>Das obige Script funktioniert f\u00fcr Debian. Falls Dein Server unter Ubuntu l\u00e4uft, ersetze das \u201edebian\u201c durch \u201eubuntu\u201c.<\/p>\n\n\n\n<p>Diese Konfiguration sieht vielleicht komplexer aus, als sie tats\u00e4chlich ist:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Update &amp; Upgrade der Pakete (mit dem Standard-Paketmanager)<\/li><li>Installiert die folgenden Pakete: apt-transport-https, ca-certificates, curl, gnupg-agent, software-properties-common<br>Diese Pakete sind entweder f\u00fcr Docker selbst, oder f\u00fcr den Installationsprozess erforderlich<\/li><li>F\u00fcgt das Docker-Repository zur Liste apt-repository hnzu<\/li><li>Aktualisiert die Repository-Liste<\/li><li>Installiert die folgenden Pakete: docker-ce, docker-ce-cli, containered.io<br>Dies war vorher nicht m\u00f6glich (Schritt 2), da das Docker-Repository nicht hinzugef\u00fcgt wurde.<\/li><li>Startet und aktiviert den Docker-Dient<\/li><\/ol>\n\n\n\n<p>Die beiden letzten Befehle sind \u00e4hnlich wie bei der letzten Installationsmethode: Das Image wir heruntergeladen und es wird ein neuer Container mit diesem Image gestartet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Installation und Konfiguration von Docker auf verschiedenen Servern kann schnell nervig werden. Mit Cloud-Init dauert das nur wenige Sekunden.<\/p>\n","protected":false},"author":50,"featured_media":13959,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1399],"tags":[1443,1458],"ppma_author":[1491],"class_list":["post-13975","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-linux-de","tag-vps-de"],"uagb_featured_image_src":{"full":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg",1200,630,false],"thumbnail":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation-150x150.jpg",150,150,true],"medium":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation-600x315.jpg",600,315,true],"medium_large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation-768x403.jpg",768,403,true],"large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg",1200,630,false],"1536x1536":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg",1200,630,false],"2048x2048":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2022\/06\/blog-head_1200x630_docker-installation.jpg",1200,630,false]},"uagb_author_info":{"display_name":"Tobias Mildenberger","author_link":"https:\/\/contabo.com\/blog\/de\/author\/tobias\/"},"uagb_comment_info":0,"uagb_excerpt":"Die Installation und Konfiguration von Docker auf verschiedenen Servern kann schnell nervig werden. Mit Cloud-Init dauert das nur wenige Sekunden.","authors":[{"term_id":1491,"user_id":50,"is_guest":0,"slug":"tobias","display_name":"Tobias Mildenberger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/077178d5dce6c3d4c0c0396857a7e544bfdf8adf04145fff5160b33a22e28b1f?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/13975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=13975"}],"version-history":[{"count":0,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/13975\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media\/13959"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=13975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=13975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=13975"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/ppma_author?post=13975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}