Sie sind hier
E-Book

Docker

Software entwickeln und deployen mit Containern

AutorAdrian Mouat
Verlagdpunkt
Erscheinungsjahr2016
Seitenanzahl368 Seiten
ISBN9783960880363
FormatPDF/ePUB
KopierschutzWasserzeichen
GerätePC/MAC/eReader/Tablet
Preis36,90 EUR
Docker-Container bieten eine einfache, schnelle und robuste Möglichkeit, Software zu entwickeln, zu verteilen und laufen zu lassen - besonders in dynamischen und verteilten Umgebungen. Mit diesem praktischen Leitfaden lernen Sie, warum Container so wichtig sind, was durch den Einsatz von Docker möglich ist und wie Sie es in Ihren Entwicklungsprozess einbinden. Dieses Buch ist aktuell zu Docker 1.12 und ideal für Entwickler, Operations-Techniker und Administratoren - insbesondere, wenn Sie einen DevOps-Ansatz verfolgen. Es nimmt Sie mit auf eine Reise von den Grundlagen bis zum Ausführen Dutzender Container auf einem Multi-Host-System mit Networking und Scheduling. Im Verlauf des Buches erfahren Sie, welche Schritte zum Entwickeln, Testen und Bereitstellen einer Webanwendung mit Docker notwendig sind. • Beginnen Sie mit Docker, indem Sie eine einfache Webanwendung entwickeln und bereitstellen. • Nutzen Sie Techniken aus dem Continuous Deployment, um Ihre Anwendung mehrmals pro Tag in die Produktivumgebung zu bringen. • Lernen Sie Optionen und Techniken kennen, um mehrere Container gleichzeitig zu protokollieren und zu überwachen. • Befassen Sie sich mit dem Erkennen im Netzwerk und mit Services: Wie finden sich Container gegenseitig und wie verbinden Sie sie? • Orchestrieren und clustern Sie Container, um Load Balancing zu ermöglichen, Ihr System skalierbar zu machen sowie Failovers und Scheduling umzusetzen. • Sichern Sie Ihr System, indem Sie den Prinzipien der 'Defense in Depth' und dem Konzept der geringsten Rechte folgen. • Setzen Sie Container ein, um eine Microservices-Architektur aufzubauen.

Adrian Mouat ist Chief Scientist bei Container Solutions - einem europaweit vertretenen Serviceunternehmen, das sich auf Docker und Mesos spezialisiert hat. Zuvor war er Anwendungsberater bei EPCC, das zur University of Edinburgh gehört.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe

1 Was Container sind und warum man sie nutzt


Container ändern die Art und Weise, wie wir Software entwickeln, verteilen und laufen lassen, grundlegend. Entwickler können Software lokal bauen, weil sie wissen, dass sie auch woanders genauso laufen wird – sei es ein Rack in der ITAbteilung, der Laptop eines Anwenders oder ein Cluster in der Cloud. Administratoren können sich auf die Netzwerke, Ressourcen und die Uptime konzentrieren und müssen weniger Zeit mit dem Konfigurieren von Umgebungen und dem Kampf mit Systemabhängigkeiten verbringen. Der Einsatz von Containern wächst in der gesamten Branche mit einer erstaunlichen Geschwindigkeit – von den kleinsten Startups bis hin zu großen Unternehmen. Entwickler und Administratoren sollten davon ausgehen, dass sie innerhalb der nächsten Jahre Container regelmäßig einsetzen werden.

Container sind eine Verkapselung einer Anwendung und ihrer Abhängigkeiten. Auf den ersten Blick scheint das nur eine abgespeckte Version einer virtuellen Maschine (VM) zu sein – wie eine VM findet sich in einem Container eine isolierte Instanz eines Betriebssystems (Operating System, OS), mit dem wir Anwendungen laufen lassen können.

Container haben aber eine Reihe von Vorteilen, durch die Anwendungsfälle möglich werden, welche mit klassischen VMs schwierig oder unmöglich zu realisieren wären:

  • Container teilen sich Ressourcen mit dem Host-Betriebssystem, wodurch sie um eine wesentliche Größenordnung effizienter sind als virtuelle Maschinen. Container können im Bruchteil einer Sekunde gestartet und gestoppt werden. Anwendungen, die in Containern laufen, verursachen wenig bis gar keinen Overhead im Vergleich zu Anwendungen, die direkt auf dem Host-Betriebs-system gestartet werden.

  • Die Portierbarkeit von Containern besitzt das Potenzial, eine ganze Klasse von Bugs auszumerzen, die durch subtile Änderungen in der Laufzeitumgebung entstehen – sie könnte sogar die seit Anbeginn der Softwareentwicklung bestehende Litanei der Entwickler »Aber bei mir auf dem Rechner lief es doch!« beenden.

  • Die leichtgewichtige Natur von Containern sorgt dafür, dass Entwickler dutzende davon zur gleichen Zeit laufen lassen können, wodurch das Emulieren eines produktiv nutzbaren, verteilten Systems möglich wird. Administratoren können viel mehr Container auf einer einzelnen Host-Maschine laufen lassen, als dies mit VMs möglich wäre.

  • Container haben zudem Vorteile für Endanwender und Entwickler außerhalb des Bereitstellens in der Cloud. Benutzer können komplexe Anwendungen herunterladen und laufen lassen, ohne sich Stunden mit Konfiguration und Installation herumzuschlagen oder über die Änderungen Sorgen machen zu müssen, die am System notwendig wären. Umgekehrt brauchen sich die Entwickler solcher Anwendungen nicht mehr um solche Unterschiede in den Benutzerumgebungen und um eventuelle Abhängigkeiten Gedanken machen.

Wichtiger ist noch, dass sich die grundlegenden Ziele von VMs und Containern unterscheiden – eine VM ist dafür gedacht, eine fremde Umgebung vollständig zu emulieren, während ein Container Anwendungen portabel und in sich abgeschlossen macht.

1.1 Container versus VMs


Obwohl Container und VMs auf den ersten Blick sehr ähnlich wirken, gibt es einige wichtige Unterschiede, die sich am einfachsten über ein Schaubild aufzeigen lassen.

Abb. 1–1 Drei VMs laufen auf einem Host.

In Abbildung 1–1 sind drei Anwendungen zu sehen, die auf einem Host in getrennten VMs laufen. Der Hypervisor1 wird dazu benötigt, VMs zu erstellen und laufen zu lassen, den Zugriff auf das zugrunde liegende Betriebssystem und die Hardware zu steuern und bei Bedarf Systemaufrufe umzusetzen. Jede VM erfordert eine vollständige Kopie des Betriebssystems für sich, dazu die gewünschte Anwendung und alle Bibliotheken, die dafür notwendig sind.

Abb. 1–2 Drei Container laufen auf einem Host.

Im Gegensatz dazu sehen Sie in Abbildung 1–2, wie die gleichen drei Anwendungen in einem containerisierten System laufen könnten. Anders als bei VMs wird der Kernel des Host2 von den laufenden Containern gemeinsam genutzt. Sie sind also immer darauf beschränkt, den gleichen Kernel zu nutzen wie der Host. Die Anwendungen Y und Z verwenden die gleichen Bibliotheken, und sie müssen dafür keine identischen Kopien davon haben, sondern können auf die gleichen Dateien zugreifen. Die Container Engine ist für das Starten und Stoppen von Containern genauso verantwortlich wie der Hypervisor bei einer VM. Aber Prozesse, die innerhalb von Containern laufen, entsprechen nativen Prozessen auf dem Host, und es kommt kein Overhead durch die Ausführung des Hypervisors hinzu.

Sowohl VMs wie auch Container können genutzt werden, um Anwendungen von anderen Anwendungen zu isolieren, die auf dem gleichen Host laufen. VMs haben durch den Hypervisor eine weitgehendere Isolation, und es handelt sich bei ihnen um eine vertraute und durch Erfahrung gehärtete Technologie. Container sind verglichen damit recht neu, und viele Firmen scheuen sich, den Isolations-Features von Containern zu trauen, bevor diese ihr Können gezeigt haben. Aus diesem Grund findet man häufig Hybridsysteme mit Containern, die innerhalb von VMs laufen, um die Vorteile beider Technologien vereinen zu können.

1.2 Docker und Container


Container sind ein altes Konzept. Schon seit Jahrzehnten gibt es in UNIX-Systemen den Befehl chroot, der eine einfache Form der Dateisystem-Isolation bietet. Seit 1998 gibt es in FreeBSD das Jail-Tool, welches das chroot-Sandboxing auf Prozesse erweitert. Solaris Zones boten 2001 eine recht vollständige Technologie zum Containerisieren, aber diese war auf Solaris OS beschränkt. Ebenfalls 2001 veröffentlichte Parallels Inc. (damals noch SWsoft) die kommerzielle Container-technologie Virtuozzo für Linux, deren Kern später (im Jahr 2005) als Open Source unter dem Namen OpenVZ bereitgestellt wurde.3 Dann startete Google die Entwicklung von CGroups für den Linux-Kernel und begann damit, seine Infrastruktur in Container zu verlagern. Das Linux Containers Project (LXC) wurde 2008 initiiert, und in ihm wurden (unter anderem) CGroups, Kernel-Namensräume und die chroot-Technologie zusammengeführt, um eine vollständige Containerisierungslösung zu bieten. 2013 lieferte Docker schließlich die fehlenden Teile für das Containerisierungspuzzle, und die Technologie begann, den Mainstream zu erreichen.

Docker nahm die bestehende Linux-Containertechnologie auf und verpackte und erweiterte sie in vielerlei Hinsicht – vor allem durch portable Images und eine benutzerfreundliche Schnittstelle –, um eine vollständige Lösung für das Erstellen und Verteilen von Containern zu schaffen. Die Docker-Plattform besteht vereinfacht gesagt aus zwei getrennten Komponenten: der Docker Engine, die für das Erstellen und Ausführen von Containern verantwortlich ist, sowie dem Docker Hub, einem Cloud Service, um Container-Images zu verteilen.

Die Docker Engine bietet eine schnelle und bequeme Schnittstelle für das Ausführen von Containern. Zuvor waren für das Laufenlassen eines Containers mit einer Technologie wie LXC umfangreiches Wissen und viel manuelle Arbeit nötig. Auf dem Docker Hub finden sich unglaublich viele frei verfügbare Container-Images zum Herunterladen, so dass Anwender schnell loslegen können und es vermeiden, Arbeit doppelt zu erledigen, die andere schon gemacht hatten. Zu weiteren Tools, die von Docker entwickelt wurden, gehören der Clustering Manager Swarm, die GUI Kitematic für die Arbeit mit Containern und das Befehlszeilentool Machine für die Erzeugung von Docker Hosts.

Durch das Bereitstellen der Docker Engine als Open Source konnte Docker eine große Community aufbauen und auf deren Hilfe bei Bugfixes und Verbesserungen zählen. Das massive Wachstum von Docker hat dazu geführt, dass es ein De-facto-Standard wurde, und das wiederum sorgte für Druck aus der Branche, einen unabhängigen, formalen Standard für die Runtime und das Format der Container zu entwickeln. 2015 schließlich wurde dafür die Open Container Initiative4 gegründet – eine Initiative, die von Docker, Microsoft, CoreOS und vielen weiteren wichtigen Gruppen und Firmen unterstützt wird. Ihre Mission ist das Entwickeln solch eines Standards. Das Containerformat und die Runtime von Docker dienen dabei als Ausgangsbasis Seit der Version 1.11 basiert die Docker Engine auf dem RunC-Kern, der eine Implementierung des Open-Container-Standards ist.

Die wachsende Verbreitung von Containern geht vor allem auf Entwickler zurück, die nun erstmals Tools zur Verfügung hatten, um Container effektiv zu nutzen. Die kurze Startzeit von Docker-Containern hat für die Entwickler einen hohen Stellenwert, weil sie natürlich schnelle und iterative Entwicklungszyklen bevorzugen, in denen sie die Ergebnisse von Codeänderungen möglichst direkt sehen können. Die Portierbarkeits- und Isolationsgarantien von Containern vereinfachen die Zusammenarbeit mit anderen Entwicklern und Administratoren: Entwickler können sicher sein, dass ihr Code in allen Umgebungen laufen wird, während sich die Administratoren auf das Hosten und Orchestrieren von Containern konzentrieren können, statt sich mit dem Code herumschlagen, der darin läuft.

Die Änderungen, die Docker angestoßen hat, sorgen für eine deutlich unterschiedliche Art und Weise, wie...

Blick ins Buch
Inhaltsverzeichnis
Geleitwort zur deutschen Übersetzung7
Vorwort9
Inhaltsverzeichnis13
1 Was Container sind und warum man sie nutzt21
1.1 Container versus VMs22
1.2 Docker und Container24
1.3 Eine Geschichte von Docker27
1.4 Plugins und Plumbing28
1.5 64-Bit-Linux29
2 Installation31
2.1 Docker auf Linux installieren31
2.1.1 SELinux im Permissive Mode ausführen32
2.1.2 Ohne sudo starten33
2.2 Docker auf Mac OS oder Windows installieren33
2.3 Ein schneller Check35
3 Erste Schritte37
3.1 Ihr erstes Image ausführen37
3.2 Die grundlegenden Befehle38
3.3 Images aus Dockerfiles erstellen42
3.4 Mit Registries arbeiten46
3.4.1 Private Repositories47
3.5 Das offizielle Redis-Image verwenden48
3.6 Zusammenfassung52
4 Grundlagen von Docker53
4.1 Die Architektur von Docker53
4.1.1 Zugrunde liegende Technologien54
4.1.2 Zugehörige Technologien55
4.1.3 Docker Hosting58
4.2 Wie Images gebaut werden58
4.2.1 Der Build Context59
4.2.2 Imageschichten60
4.2.3 Caching62
4.2.4 Basis-Images63
4.2.5 Anweisungen im Dockerfile65
4.3 Container mit der Außenwelt verbinden69
4.4 Container verlinken70
4.5 Daten mit Volumes und Datencontainern verwalten71
4.5.1 Daten gemeinsam nutzen74
4.5.2 Datencontainer74
4.6 Häufig eingesetzte Docker-Befehle76
4.6.1 Der Befehl run77
4.6.2 Container verwalten80
4.6.3 Docker-Info82
4.6.4 Container-Info83
4.6.5 Arbeit mit Images84
4.6.6 Die Registry verwenden87
4.7 Zusammenfassung88
5 Docker in der Entwicklung einsetzen91
5.1 Sag »Hallo Welt!«91
5.2 Mit Compose automatisieren101
5.2.1 Der Compose-Workflow102
5.3 Zusammenfassung104
6 Eine einfache Webanwendung erstellen105
6.1 Eine einfache Webseite erstellen106
6.2 Auf vorhandene Images zurückgreifen108
6.3 Caching ergänzen113
6.4 Microservices116
6.5 Zusammenfassung117
7 Bereitstellen von Images119
7.1 Namensgebung für Images und Repositories119
7.2 Der Docker Hub120
7.3 Automatisierte Builds122
7.4 Private Distribution124
7.4.1 Eine eigene Registry betreiben124
7.4.2 Kommerzielle Registries131
7.5 Die Imagegröße verringern132
7.6 Herkunft eines Image134
7.7 Zusammenfassung135
8 Continuous Integration und Testen mit Docker137
8.1 identidock mit Unit-Tests versehen137
8.2 Einen Jenkins-Container erstellen142
8.2.1 Builds triggern150
8.3 Das Image pushen150
8.3.1 Sinnvolles Taggen151
8.3.2 Staging und Produktion153
8.3.3 Image Sprawl153
8.3.4 Jenkins Slaves durch Docker betreiben154
8.4 Backups für Jenkins154
8.5 Gehostete CI-Lösungen154
8.6 Testen und Microservices155
8.6.1 Im Produktivumfeld testen157
8.7 Zusammenfassung157
9 Container deployen159
9.1 Ressourcen mit Docker Machine aufsetzen160
9.2 Einen Proxy verwenden163
9.3 Ausführungsoptionen169
9.3.1 Shell-Skripten170
9.3.2 Einen Process Manager einsetzen (oder systemd, sie alle zu knechten)172
9.3.3 Ein Tool zum Configuration Management einsetzen175
9.4 Host-Konfiguration179
9.4.1 Ein Betriebssystem wählen179
9.4.2 Einen Storage-Treiber wählen180
9.5 Spezialisierte Hosting-Möglichkeiten183
9.5.1 Triton183
9.5.2 Google Container Engine185
9.5.3 Amazon EC2 Container Service185
9.5.4 Giant Swarm188
9.6 Persistente Daten und Produktivcontainer190
9.7 Gemeinsame Geheimnisse190
9.7.1 Geheimnisse im Image ablegen190
9.7.2 Geheimnisse in Umgebungsvariablen übergeben191
9.7.3 Geheimnisse in Volumes übergeben192
9.7.4 Einen Key/Value-Store einsetzen192
9.8 Vernetzen194
9.9 Produktiv-Registry194
9.10 Continuous Deployment/Delivery194
9.11 Zusammenfassung195
10 Protokollieren und Überwachen197
10.1 Protokollieren198
10.1.1 Standard-Logging von Docker198
10.1.2 Logs zusammenfassen200
10.1.3 Mit ELK loggen200
10.1.4 Docker-Logging mit syslog211
10.1.5 Logs aus Dateien auslesen217
10.2 Überwachen und Benachrichtigen217
10.2.1 Mit den Docker-Tools überwachen218
10.2.2 cAdvisor219
10.2.3 Cluster-Lösungen221
10.3 Kommerzielle Monitoring- und Logging-Lösungen224
10.4 Zusammenfassung224
11 Vernetzung und Service Discovery229
11.1 Ambassadors230
11.2 Service Discovery234
11.2.1 etcd235
11.2.2 SkyDNS239
11.2.3 Consul244
11.2.4 Registrieren249
11.2.5 Andere Lösungen250
11.3 Networking-Optionen252
11.3.1 Bridge252
11.3.2 Host253
11.3.3 Container253
11.3.4 None254
11.4 Neues Docker-Networking254
11.4.1 Netzwerktypen und Plugins256
11.5 Vernetzungslösungen256
11.5.1 Overlay257
11.5.2 Weave259
11.5.3 Flannel263
11.5.4 Project Calico269
11.6 Zusammenfassung274
12 Orchestrieren, Clustering und Verwaltung277
12.1 Clustering- und Orchestrierungstools278
12.1.1 Swarm279
12.1.2 fleet286
12.1.3 Kubernetes292
12.1.4 Mesos und Marathon301
12.2 Container-Management-Plattformen312
12.2.1 Rancher313
12.2.2 Clocker314
12.2.3 Tutum316
12.3 Zusammenfassung317
13 Container sichern und beschränken319
13.1 Worüber Sie sich Gedanken machen sollten320
13.2 Verteidigung in der Tiefe322
13.2.1 Least Privilege322
13.3 identidock absichern323
13.4 Container nach Host trennen325
13.5 Updates anwenden326
13.5.1 Nicht unterstützte Treiber vermeiden330
13.6 Imageherkunft330
13.6.1 Docker Digests331
13.6.2 Docker Content Trust331
13.6.3 Reproduzierbare und vertrauenswürdige Dockerfiles336
13.7 Sicherheitstipps338
13.7.1 Einen Benutzer setzen339
13.7.2 Netzwerkzugriffe von Containern beschränken340
13.7.3 setuid/setgid-Binaries entfernen342
13.7.4 Den Speicher begrenzen343
13.7.5 Den CPU-Einsatz beschränken344
13.7.6 Neustarts begrenzen345
13.7.7 Zugriffe auf die Dateisysteme begrenzen346
13.7.8 Capabilities einschränken346
13.7.9 Ressourcenbeschränkungen (ulimits) anwenden348
13.8 Einen gehärteten Kernel ausführen350
13.9 Linux Security Modules351
13.9.1 SELinux351
13.9.2 AppArmor354
13.10 Auditing355
13.11 Reaktion auf Zwischenfälle356
13.12 Zukünftige Features357
13.13 Zusammenfassung357
Index359
www.dpunkt,de0

Weitere E-Books zum Thema: Informatik - Algorithmen - Softwaresysteme

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Weitere Zeitschriften

Atalanta

Atalanta

Atalanta ist die Zeitschrift der Deutschen Forschungszentrale für Schmetterlingswanderung. Im Atalanta-Magazin werden Themen behandelt wie Wanderfalterforschung, Systematik, Taxonomie und Ökologie. ...

aufstieg

aufstieg

Zeitschrift der NaturFreunde in Württemberg Die Natur ist unser Lebensraum: Ort für Erholung und Bewegung, zum Erleben und Forschen; sie ist ein schützenswertes Gut. Wir sind aktiv in der Natur ...

cards Karten cartes

cards Karten cartes

Die führende Zeitschrift für Zahlungsverkehr und Payments – international und branchenübergreifend, erscheint seit 1990 monatlich (viermal als Fachmagazin, achtmal als ...

Die Versicherungspraxis

Die Versicherungspraxis

Behandlung versicherungsrelevanter Themen. Erfahren Sie mehr über den DVS. Der DVS Deutscher Versicherungs-Schutzverband e.V, Bonn, ist der Interessenvertreter der versicherungsnehmenden Wirtschaft. ...