{"id":210,"date":"2018-10-29T17:59:36","date_gmt":"2018-10-29T16:59:36","guid":{"rendered":"http:\/\/dtp-soft.de\/?p=210"},"modified":"2018-10-29T17:59:36","modified_gmt":"2018-10-29T16:59:36","slug":"docker-grundlagen","status":"publish","type":"post","link":"http:\/\/dtp-soft.de\/?p=210","title":{"rendered":"Docker: Grundlagen"},"content":{"rendered":"\n<p>Momentan bin ich dabei, mich mit Docker zu besch\u00e4ftigen.<br>Docker wurde im M\u00e4rz 2013 herausgegeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was Docker nicht ist<\/h2>\n\n\n\n<p>Docker ist keine Programmiersprache und Docker ist auch kein Framework um Isolation zu erreichen. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Docker ist auch keine Virtualisierung, denn bei Virtualisierung wird Hardware simuliert, auf der die Programme ausgef\u00fchrt werden. Virtuelle Maschinen brauchen meist verh\u00e4ltnism\u00e4\u00dfig lange, um zu booten und sie brauchen ein eigenes Betriebssystem (f\u00fcr das man eventuell auch eine Lizenz braucht). Virtualisierung ist f\u00fcr kleine Aufgaben daher ein ziemlicher Verwaltungsoverhead.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was Docker IST<\/h2>\n\n\n\n<p>Docker ist ein Tool zum Helfen bei allgemeinen Problemen wie Installation, Entfernen, Updaten, Verteilen, Vertrauen und Verwaltung von Software.<\/p>\n\n\n\n<p>Docker ist open source und darf daher von jedem verwendet, ver\u00e4ndert und weitergegeben werden.<\/p>\n\n\n\n<p>Docker ist eigentlich ein Kommandozeilenprogramm, ein Hintergrund-Daemon und ein Satz von Remote Services.<\/p>\n\n\n\n<p>Docker benutzt die bestehenen Technologien, die von Linux schon seit l\u00e4ngerem unter dem Begriff &#8222;container&#8220; verwendet werden. Durch Docker wird die Verwendung quasi standardisiert.<\/p>\n\n\n\n<p>Docker l\u00e4uft auf dem host im User-Space, also nicht mit root- oder kernel-Rechten.<\/p>\n\n\n\n<p>Ein <strong>Image<\/strong> ist ein Schnappschu\u00df mit allem, was zum Aufsf\u00fchren der Anwendung n\u00f6tig ist.<br>Ein <strong>Container<\/strong> ist ein Image, welches ausgef\u00fchrt wird.<\/p>\n\n\n\n<p>Aus einem Image k\u00f6nnen beliebig viele Container erstellt werden, diese teilen <em>nicht<\/em> ihre \u00c4nderungen, die sie vornehmen, jeder Container l\u00e4uft in seinem eigenen Bereich.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Probleme, die Docker l\u00f6st<\/h2>\n\n\n\n<p>Durch die Verwendung von Docker kann man folgende Problemen l\u00f6sen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>zwei Anwendungen brauchen unterschiedliche Versionen von einer Software<br><\/li><li>was bleibt sp\u00e4ter \u00fcber, wenn man die Anwendung entfernt?<\/li><li>kann man alle Abh\u00e4ngigkeiten entfernen?<\/li><li>kannst du dich an alle \u00c4nderungen erinnern, die du zum Installieren der jetzt zu deinstallierenden Anwendung machen musstest?<\/li><li>Portabilit\u00e4t: Images k\u00f6nnen unter jedem OS mit Docker ausgef\u00fchrt werden.<\/li><\/ul>\n\n\n\n<p>Als <strong>detached container <\/strong>wird ein Container bezeichnet, der im Hintergrund l\u00e4uft ohne an Input oder Output angeschlossen zu sein.<br>Als <strong>interactive container <\/strong>wird entsprechend ein Container bezeichnet, der an Input und\/oder Output angeschlossen ist.<\/p>\n\n\n\n<p>Docker hilft beim Vermeiden von u.a. folgenden Konflikten:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>2 Programme binden sich an den gleichen Port<br><\/li><li>2 Programme versuchen, die gleiche temp. Datei zu benutzen<\/li><li>2 Programme benutzen unterschiedliche Versionen einer globalen &#8222;DLL&#8220;<\/li><li>2 Kopien des selben Programms wollen die gleiche PID-Datei verwenden<\/li><li>Ein Programm ver\u00e4ndert Umgebungsvariablen und ein anderes kann nicht mehr richtig arbeiten.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Identifizierung von Containern<\/h2>\n\n\n\n<p>Docker erzeugt zu jedem container eine 1024bit Nummer mit der er eindeutig zu identifizieren ist. Die ID kann \u00fcberall verwendet werden, wo container anzugeben sind. Da sich die IDs normalerweise schon in den ersten 12 Stellen unterscheiden, reicht die abgek\u00fcrzte Schreibweise normalerweise schon aus.<\/p>\n\n\n\n<p>Man kann sich die erstellte ID nat\u00fcrlich auch speichern <br>Linux: CID = $(docker create webserver)<br>Das kann nat\u00fcrlich zu Metakonflikten f\u00fchren, wenn eine Umgebungsvariable f\u00fcr mehrere IDs benutzt werden sollte.<\/p>\n\n\n\n<p>Dieses Problem kann man zwar nicht umgehen, aber verschieben, indem man die ID in eine Datei schreiben l\u00e4\u00dft:<br>docker &#8211;cidfile \/tmp\/webcid webserver<br>erzeugt eine container ID Datei mit der ID drin. Das hat aber die gleichen Namensprobleme, wie manuell benannte container und Umgebungsvariablen.<\/p>\n\n\n\n<p>Docker erzeugt aber zu jedem Container auch einen menschenlesbaren automatischen Namen. Dieser besteht aus einem (englischen) Adjektiv, einem Unterstrich und dem Nachnamen eines einflu\u00dfreichen Wissenschaftlers, z.B. confused_einstein<br>Ob das wirklich besser handzuhaben ist als eine 12-stellige Nummer, sei dahingestellt.<\/p>\n\n\n\n<p>Wenn man einen container starten will, der Links zu anderen containern braucht, muss es den anderen container bereits gestartet geben. Ringverkettungen sind somit nicht m\u00f6glich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fehlerbehandlung<\/h2>\n\n\n\n<p>Wenn ein Programm abst\u00fcrzt (oder \u00fcberhaupt beendet wird) kann Docker automatisch versuchen, den container neu zu starten.<br>Dazu kann man beim Erstellen eines containers (run oder create) den Parameter &#8211;restart angeben. Er kennt 4 Einstellungen:<br>\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Immer neustarten, unabh\u00e4ngig von Bedingungen<\/li><li>F\u00fcr eine vorbestimmte Zeit versuchen, den container neu zu starten<\/li><li>Versuchen neu zu starten, wenn ein Fehler festgestellt wurde<\/li><li>Nie neu starten  (Standard)<\/li><\/ul>\n\n\n\n<p>\nDocker versucht dabei nicht st\u00e4ndig den container neu zu starten, sondern benutzt eine exponentielle Strategie. Zu jedem Versuch wird die Wartezeit verdoppelt. W\u00e4hrend der Restart-Phase k\u00f6nnen keine Befehle ausgef\u00fchrt werden, die ein laufendes System brauchen.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entrypoints<\/h2>\n\n\n\n<p>Docker hat Entrypoints, die immer ausgef\u00fchrt werden, egal welches Kommando man expizit \u00fcbergibt Man kann den Entrypoint mit &#8211;entrypoint=&#8220;cat&#8220; \u00fcberschreiben, um sich z.B. das Startskript selbst anzeigen zu lassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Momentan bin ich dabei, mich mit Docker zu besch\u00e4ftigen.Docker wurde im M\u00e4rz 2013 herausgegeben. Was Docker nicht ist Docker ist keine Programmiersprache und Docker ist auch kein Framework um Isolation zu erreichen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[27],"tags":[],"class_list":["post-210","post","type-post","status-publish","format-standard","hentry","category-docker"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=210"}],"version-history":[{"count":5,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions"}],"predecessor-version":[{"id":217,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions\/217"}],"wp:attachment":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=210"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}