Docker
- hat als Pionier viel zum Erfolg der Containerisierung beigetragen
- gilt heute als De-facto-Standard für Container
Architektur
Docker-Engine
-
Open-Source-Containerisierungstechnologie
-
zum Erstellen und Containerisieren von Anwendungen
-
Aufbau als Client-Server-Anwendung
-
zentrale Komponente von Docker
-
ist verantwortlich für Erstellen, Ausführen und Verwalten von Containern
-
besteht aus
- Server: Docker Daemon
- Client: Docker CLI
Docker-Client
- Befehlszeilenschnittstelle (CLI)
Aufbau
Lifecycle
Technologie
- in Programmiersprache GO geschrieben
- nutzt mehrere Funktionen des Linux-Kernels, um seine Funktionalität bereitzustellen
- isolierter Arbeitsbereich eines Containers mithilfe von Namespaces
- Namespaces bilden Isolationsebene
- jeder Aspekt eines Containers wird in separatem Namespace ausgeführt
- Zugriff eines Aspekts ist auf diesen Namespace beschränkt
Grundlagen
Image
- schreibgeschützte Vorlage
- enthält eine Anwendung mit allen notwendigen Abhängigkeiten
- Basis, um Container zu erstellen
- werden oft in Schichten (Layers) aufgebaut, um effizienter wiederverwendet zu werden
Layer
- Änderung an einem Image
- jede Anweisung in einem Dockerfile führt zu einer Änderung am Image
- Beispiele:
FROM
,RUN
,COPY
Von StackOverflow - What are Docker image "layers"?:
Basically, a layer, or image layer is a change on an image, or an intermediate image. Every command you specify (FROM, RUN, COPY, etc.) in your Dockerfile causes the previous image to change, thus creating a new layer. You can think of it as staging changes when you're using git: You add a file's change, then another one, then another one...
Repository
- gleichnamige Images mit verschiedenen Tags
Container
- laufende Instanz eines Images
- enthält alles, was die Anwendung zum Laufen benötigt
- ist isoliert vom restlichen System
Dockerfile
- Textdatei
- enthält Befehle, um Docker Images zu erstellen
- beschreibt, wie die Umgebung eines Containers aufgebaut werden soll
Registry
- Speicherort für Docker Images
- Beispiel: Docker Hub
- aus Registry können Images herunter- (pulled) und hochgeladen (pushed) werden
Docker Engine
siehe Docker-Engine
Docker Volumes
- in Dockerfile können Verzeichnisse als VOLUME gekennzeichnet werden, die auch nach dem Löschen und Neu-Initialisieren eines Containers erhalten bleiben sollen
- bei Volume werden Daten nicht im Container, sondern ausserhalb auf dem Host-Computer gespeichert
- bei Neu-Initialisierung eines Containers bleiben Daten erhalten
unbenannte Volumes - anonymous volumes
- Standard
- Daten werden in zufällig benanntem Unterverzeichnis von
/var/lib/docker/volumes
des Host-Computers gespeichert
benannte Volumes - named volumes
- Benennung von Volumes beim Erstellen eines Containers
-v volumename:containerverzeichnis
-
docker run -d --name mariadb-test -v myvolume:/var/lib/mysql mariadb
- Name für Unterverzeichnis kann angegeben werden
Verhalten: Wenn das Volume noch nicht existiert, werden die Daten des erstellen Containers darin abgelegt. Existiert das Volume schon, werden die Daten des Volumes im Container verwendet.
Volumes in eigenen Verzeichnissen - mounted volumes
- Angeben eines Verzeichnisses für Volume
-v hostverzeichnis:containerverzeichnis
- Beispiel
docker run -d -v /home/user/databases:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=geheim mariadb
Verhalten: Der Container verwendet immer die Daten des Volumes und kopiert keine Daten des Containers in das Volume, wenn das Volume noch leer ist. Somit muss das Volume-Verzeichnis selbst mit den benötigten Start-Daten befüllt werden.