Wie man Docker richtig einsetzt

3. Dezember 2019

Lang: cs en de es

Docker hat sich ausgebreitet. Es ist gut, es zu lernen (für einen Linux-Typ wird es ein Kinderspiel sein). Aber es ist auch notwendig, es zu verstehen und richtig zu benutzen. Es ist auch gut, einige fortgeschrittene Funktionen zu kennen, wenn Sie benutzerdefinierte Docker-Container erstellen oder die Leistung von Docker auf einem Mac oder Windows verbessern wollen.

Docker hat sich ausgebreitet. Es ist gut, es zu lernen (für einen Linux-Typ wird es ein Kinderspiel sein). Aber es ist auch notwendig, es zu verstehen und richtig zu benutzen. Es wird auch gut sein, einige fortgeschrittene Funktionen zu kennen, wenn du deine eigenen Docker-Container baust oder die Docker-Performance auf einem Mac oder Windows löst.

Dieser Artikel ist eine Anleitung oder ein Tutorial für den Einstieg in Docker. Er beschreibt, wie Docker funktioniert und wie man es verwendet. Tutorials zu spezifischen Anwendungen werden später folgen.
Wer eine Anwendung in Docker zum Laufen bringen möchte und kein Interesse an einer Schulung hat, kann eine individuelle Zusammenarbeit vereinbaren.

Docker ist eine der Visualisierungstechnologien, speziell die Container-Virtualisierung. Es handelt sich um eine Virtualisierung, die sich die Fähigkeiten des Linux-Kernels zunutze macht, weshalb Docker in erster Linie für Linux konzipiert ist. Auf verschiedene Weise kann es aber auch auf Windows und Mac OS X zum Laufen gebracht werden, was auch oft geschieht.

Eine Anwendung in Docker läuft als Systemprozess, der sich den Speicher und den Systemkern teilt. Da der Kernel gemeinsam genutzt wird, muss die Anwendung nur die Funktionen nutzen, die der Kernel hat. Für die meisten gängigen Anwendungen werden jedoch keine besonderen oder neuen Funktionen benötigt.

Konkret nutzt Docker die Virtualisierung. cgroups und Namespaces.

Wozu ist Docker gut?

Sie können Anwendungen auch ohne Docker ausführen und entwickeln. Docker ist also nicht notwendig, aber es gibt ein paar typische Anwendungen, für die eine Docker-Bereitstellung nützlich ist.

  • Testing
  • Befehlszeilenanwendungen - das Ergebnis ist eine vollständig funktionierende Anwendung. Es kann auch eine Anwendung sein, die mit wine läuft.
  • Zustandslose Anwendungen.
  • State-Anwendungen - Daten müssen separat in Volumes gespeichert werden.
  • Entwicklung - Vagrant wird auch dafür verwendet, aber Docker ist am beliebtesten. (Vagrant ist ein einfacher Wrapper um die CLI-Schnittstelle von Virtualbox)
  • Offener Betrieb - die Umgebung, wie Sie sie brauchen.
  • HA, Skalierung - Lösung mit Orchestrierungswerkzeug z.B. Kubernetes.
  • Testing, schnelle Migration auf neue Softwareversionen. Zum Beispiel ein Upgrade von PHP.
  • Lösung der Anwendung.
  • Migration.
  • Schnellstart.

Wie ich schreibe, hat sich Docker vor allem bei Webanwendungen stark durchgesetzt. Aber für einige Anwendungen ist es besser geeignet, zum Beispiel für Virtualbox. Auch für den Einsatz unter Mac OS X und Windows wäre VirtualBox besser geeignet, da die nicht-native Verwendung von Docker zu Leistungsproblemen führt.
Für den erfahrenen Linux-Admin wird es kein Problem sein, eine reproduzierbare Umgebung in VirtualBox vorzubereiten, z.B. mit Ansible

Die Umgebung in Docker läuft isoliert, so dass die darin laufende Anwendung nicht mit anderen Anwendungen interferieren kann. Es ist auch möglich, für jede Anwendung eine eigene Umgebung zu erstellen. Es ist möglich, die Umgebung schnell zu ändern, zum Beispiel, um auf neue Versionen zu aktualisieren oder die Anwendung mit verschiedenen Versionen von Bibliotheken zu testen.

Virtualisierung

Erfahren Sie in diesem Video mehr über die Arten der Virtualisierung und die spezifischen Technologien, die Virtualisierung implementieren:

Docker-Installation

Zuerst muss man Docker installieren, wenn man eine Linux-Distribution von Mageia Version 6 oder 7 hat, ist Docker in deren Repositories. Und so lädt es den folgenden Befehl, um Docker zu installieren:

urpmi docker
Um Docker als normaler Benutzer verwalten zu können, muss man der Gruppe docker beitreten.

Docker unter Debian

Docker ist nicht in der Debian Linux Distribution enthalten. Daher müssen wir das offizielle Docker-Repository hinzufügen und können dann Docker installieren.

Zuerst fügen wir die Zertifikate des Repositorys hinzu:

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
 

Erstellen Sie eine Konfigurationsdatei für das Repository:
echo "deb https://download.docker.com/linux/debian $(lsb_release -cs) stable">> /etc/apt/sources.list.d/docker.list

Docker installieren:
apt-get update && apt-get install docker-ce

Mit diesem Befehl können Sie feststellen, ob Docker läuft:
systemctl status docker

Quelle - Anleitung auf Englisch: wie man docker auf debian 9 installiert und benutzt . Ich habe dies bereits auf Debian 10.s getan.

Eindrücke

Um sich mit einer neuen Technologie vertraut zu machen, muss man die grundlegenden Konzepte erklären.

Abbild

Ein Image ist das, was eine vorbereitete Umgebung ohne lokale Änderungen darstellt. Aus der Sicht eines Programmierers könnte man es eine Klasse nennen.

Container

Ein Container kann mit einer Instanz eines Objekts verglichen werden. Er ist eine laufende Umgebung, die aus einem Image erstellt wird und bereits die Daten oder lokalen Änderungen enthält, die er erstellt hat.

In der Virtualisierung ist die Beziehung zwischen Image und virtueller Maschine normalerweise 1:1. In Docker hingegen können Sie beliebig viele Container aus einem einzigen Image ausführen.

Docker komponieren

Mit docker-compose lässt sich definieren, wie mehrere Docker-Container laufen, wie sie eingerichtet werden sollen und wie sie verknüpft werden sollen. Die Konfiguration von docker-compose wird in eine Datei im YAML-Format geschrieben. Sie enthält Informationen darüber, welche Container von welchen Images gestartet werden sollen, welche Volumes verbunden werden sollen und wie sie über ein virtuelles Netzwerk verbunden werden sollen.

Kubernetes

Kubernetes ist ein Orchestrierungswerkzeug für Docker und andere ähnliche Technologien. Dieses Tool steuert und verwaltet Container, damit sie nach Bedarf laufen. Es schaltet sie automatisch ein und aus usw..

Docker-Schwarm

Docker swarm ist ein Orchestrierungswerkzeug von Docker, derzeit ist Kubernetes weiter verbreitet.

Befehle zur Nutzung von Docker

Mit diesem Befehl werden die Daten heruntergeladen und ein Beispiel-Docker-Image erstellt, das Sie ausprobieren können.

docker run hello-world

Auflistung der laufenden Container:

docker ps
Sie können auch andere Informationen zu den Containern sehen, z. B. welche Ports von der lokalen Maschine auf welche im Container abgebildet werden.

Auflistung der vorhandenen Panels:

Docker-Images

In der Dockerdatei kann man eine eigene Konfiguration für die Erstellung des Images definieren.
Zum Beispiel

FROM php:7.2.18-cli-alpine3.9
RUN php -v
CMD php -v

Erstelle das Image gemäß deiner Dockerdatei und nenne es alpine-php72:
docker build -t alpine-php72 .alpine-php72

Mit diesem Befehl wird das Image gestartet.
 docker run alpine-php72
Sie werden feststellen, dass beim Erstellen des Images die PHP-Version ausgegeben wird und dann, wenn das Image gestartet wird.

Sie können über die Weboberfläche nach vorgefertigten Containern suchen https://hub.docker.com/ oder von der Konsole aus mit dem Befehl:

docker search NAME

So startet man die Konsole, also den Bash-Interpreter im Container mit der ID e286a85fdcac:

docker exec -it e286a85fdcac /bin/bash

Damit wird der Container aus dem Image web gestartet und der lokale Port 8080 auf den Port 80 des Containers gemappt:

docker run -ditp 8080:80 web
Was im Container auf Port 80 läuft, ist also auf localhost:8080 verfügbar.

Wir starten den Container aus dem Image docketette-web-alpine, das wir auch www nennen. und falls bereits ein Container mit diesem Namen existiert, wird dieser gelöscht und ein neuer erstellt.

docker run -it --rm --name www -p 80:80 -p 9001:9001 dockette-web-alpine

Bedeutung der Schalter

-t Allocate und pseudo-tty
-i STDIN offen halten, auch wenn nicht angeschlossen
-d trennt unser Terminal
-P gibt alle offenen Ports an zufällige Ports weiter und schließlich --name entspricht einem Namen, den wir vergeben wollen. Jetzt können wir die Ports sehen, indem wir den Befehl docker port [CONTAINER] ausführen

Kopieren, Hinzufügen

Wenn man den COPY-Befehl in einer Dockerdatei gibt, kopiert er die lokale Datei in das Image. Das ist gut für das Hochladen von Konfigurations- oder anderen Dateien, die im Container benötigt werden.

Kopieren Sie die virtualhost-Konfiguration für den Apache-Webserver:

COPY site.conf /etc/apache2/sites-available/000-default.conf

Der Befehl ADD funktioniert fast auf die gleiche Weise.

Volumina

Volumes ist eine Möglichkeit, lokale Daten in einen Container zu bekommen, damit man gleichzeitig daran arbeiten kann. Es ist also ideal für die Entwicklung, wo man Dateien lokal bearbeitet und der Container Zugriff auf sie hat, so dass man sie sofort ausführen kann.

Ein Beispiel, bei dem man die Verwendung von Volumes ausprobieren und im Container überprüfen kann, dass das, was man erstellt, an beiden Orten sichtbar ist:

docker run -v /root/container_dir:/root/host -i -t debian /bin/bash

Manuell ein Volume erstellen. Der Speicherort ist auf der Festplatte gemäß der Docker-Konfiguration.

docker volume create my-vol

Liste der verfügbaren Volumes: docker volume ls

Anzeige der Details eines bestimmten Datenträgers: docker volume inspect my-vol

Starten eines Docker-Containers mit einer Mageia 7-Distribution und Anhängen des erstellten Volumes an /srv und Ausführen der Shell im Container: docker run --mount source=my-vol,destination=/srv -it mageia7 /bin/bash

Wenn du ein Leistungsproblem löst, ist Volumen auf Mac oder Windows eine Möglichkeit, die meisten Dinge direkt im Docker zu haben. Oder alles im Docker zu haben und auf seine Daten zuzugreifen. Wenn Sie ein größeres Leistungsproblem haben, gibt es die Möglichkeit, eine andere Art der Virtualisierung wie Virtualbox zu wählen.
Aber Dinge rund um Entwicklung und Devops sind schon für die persönliche Beratung.

Mehr dazu Docker-Volumen.

Hinweise

Nur eine Sache gehört in einen Container.

Docker-Video erste Verwendung

Dieses Video erklärt die grundlegenden Konzepte und Befehle und zeigt Ihnen, wie Sie Docker zum ersten Mal verwenden.

Erweiterte Verwendung von Docker

Sie können Umgebungsvariablen definieren

 ENV PHP_CLI_DIR=/etc/php/7.3/cli

Kopieren Sie die Datei in den laufenden Container:

docker cp foo.txt mycontainer:/foo.txt

Verknüpfen von Containern. Starten Sie einen Container mit einer Datenbank und dann einen Container mit einem Projekt, das sich mit der Datenbank verbinden soll. docker run --name somemysql -e MYSQL_ROOT_PASSWORD=pass1234 -d mysql docker run --name someproject --link somemysql:mysql -d project - MYSQL_DATABASE=dbname

Wenn Sie einige Daten einmal in die DB laden müssen, können Sie einen dieser Befehle verwenden:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
cat dump.sql | docker-compose exec -T  mysql -u  -p 

Für die Datenbankinitialisierung erwartet der normale MariaDB-Container eine Initialisierungs-SQL-Datei in /docker-entrypoint-initdb.d/dump.sql So kann man z.B. mit dem Parameter v (für volume) die Verbindung der Initialisierungs-SQL-Datei zum Docker-Container nachfixieren.

-v./dump.sql:/docker-entrypoint-initdb.d/dump.sql

Die Logs für jeden Container befinden sich hier: /var/lib/docker/containers/

Wenn der Docker-Container im Hintergrund läuft (typisch für einen Server), kann man sich so mit STDOU verbinden:

 docker logs -f f6010bf5a375

Videa docker

Entwicklung einer PHP/Nette3-Webanwendung in Docker

Hier ist ein Video-Livestream, der den Einsatz von Docker in der Webanwendungsentwicklung zeigt:

Docker komponieren

In meiner Linux-Distribution (Mageia 6) konnte ich aufgrund einer Kollision docker-compose nicht installieren (vermutlich wegen der Überentwicklung von Docker), Also habe ich docker-compose manuell heruntergeladen und in das System integriert.
Befehl zum Herunterladen, Speichern und Setzen von Berechtigungen: curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Erfahren Sie mehr über die Installation von docker-compose.

Konfiguration von docker compose

Die Konfiguration für docker-compose wird in die Datei docker-compose.yml geschrieben. Dort kann man angeben, von welchen Images welche Container gestartet werden sollen. Wie Volumes und Ports gemappt werden sollen und welche anderen Konfigurationswerte an sie übergeben werden sollen.

Diese Konfiguration legt fest, dass sich die Dockerdatei im gleichen Verzeichnis befindet. Sie gibt den Namen des Quellcontainers an und wie das Image genannt werden soll. Die Portzuordnung wird angegeben. Die Variable NETTE_DEBUG=1 ist eine Umgebungsvariable, die wir verwenden können, um eine andere Projektkonfiguration in PHP zu laden.

version: '3.6'
  
Dienste:

  Web:
    build: ./
    Abbild: linuxserveradmin
    container_name: linuxserveradmin
    Umgebung:
     - NETTE_DEBUG=1
    volumes:
      - .:/srv

    Ports:
      - 8081:80

Führen Sie das, was Sie in der Datei docker-compose konfiguriert haben, in einem Rutsch mit dem Befehl aus:

docker-compose up

Löschen

Alle Docker-Container auflisten:

docker inspect -f '{{ .Mounts }}' containerid
Image löschen:
docker rmi hello-world
Um alle Docker-Images zu löschen, verwenden Sie den folgenden Befehl:
docker rmi $(docker images -a -q) -f
Dieser Befehl löscht alle Container, Netzwerke, Images und erstellten Caches: docker system prune -a

Cache

Docker speichert Daten im Cache und verwendet diese Daten dann. Zum Beispiel hat das Image Informationen über Pakete im Repository zwischengespeichert. Aber wenn ein Update hereinkommt, verschwinden die alten Pakete, und wenn Ihre Schicht auf diesen zwischengespeicherten Daten aufbaut, versucht sie, das herunterzuladen, was nicht mehr existiert. Aus diesem Grund ist es eine gute Idee, vor jedem apt-get update-Befehl, der die Repository-Informationen aktualisiert, ein apt-get install auszuführen.
Dann schreibt man es wie folgt in das Dockerfile:

RUN apt-get -qq update && apt-get install -y ........
Diese Schalter besagen, dass man den interaktiven Modus nicht verwenden soll, da Docker ihn automatisch ausführt.

Rebuild des Images ohne Verwendung des Caches:

docker-compose build --no-cache

Automatisches Starten von Containern

Deaktivieren Sie den automatischen Containerstart nach einem Neustart:

docker update --restart=no 491dfa4b274a

Einstellen des Containers, dass er automatisch startet, wenn der Computer hochfährt:
docker update --restart=yes 491dfa4b274a

Oder Sie müssen den Container mit dem Parameter
 --restart always

Für die gleiche Funktionalität in der docker-compose YAML-Datei angeben:
    restart:
      Always

Docker und BTRFS

Ich verwende das BTRFS-Dateisystem, das von Docker genutzt wird. Auch dies ist ein Beispiel dafür, warum man Linux verwenden sollte und warum man das BTRFS-Dateisystem und andere gute moderne Technologien, die die Arbeit effizienter machen, nutzen sollte.
Die Auflistung der Schichten, die sich in BTRFS befinden, d.h. Subvolumes, zeigt der Befehl:

 btrfs subvolume list /.
Und siehe da, man sieht eine Reihe von Subvolumes, die Docker erstellt hat.

GUI-Anwendungen in Docker

Sie können auch GUI-Anwendungen in Docker ausführen. Hier zeige ich Ihnen den grundlegenden Weg, eine GUI-Anwendung Augen laufen zu lassen.

Erstellen Sie das folgende Dockerfile:

VON centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]

Erstellen Sie das Image:
docker build -t gui-app .
Starten Sie den Image-Container und das darin befindliche Programm:
docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" gui-app

Ausführen von Adobe Acrobad Reader unter Linux ohne Installation - d.h. mit Docker:

docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" -v $HOME:/srv mgor/acroread

Docker - Entwicklung von Webanwendungen

Wenn Sie Webanwendungen entwickeln, ist es eine gute Idee, ein Standard-Docker-Image zu haben. Ich habe ein solches Image für Sie vorbereitet. Für PHP8 habe ich vorbereitet docker image with PHP8. Es gibt auch andere von mir vorbereitete Images mit älteren PHP-Versionen, z.B. Version 5.6, 7.4 usw.

Wenn Sie Webanwendungen programmieren in den PHP-Frameworks Nette oder Symfony programmieren, habe ich ein Docker-Image mit der Konfiguration für diese Frameworks vorbereitet. Sie müssen also nur den Docker-Container starten und den Quellcode der Anwendung anhängen. Hier ist Docker-Image für Nette und hier ist Docker-Image für Symfony.

Dann muss man nur noch eine docker-compose.yml Datei erstellen, um die Entwicklungsumgebung zu starten. mit folgendem Inhalt/Konfiguration:
version: '3.6'

services:

  web:
    image: debian-apache-php8.0-nette
    container_name: linuxserveradmin_web
    Umgebung:
     - NETTE_DEBUG=1
    working_dir: /var/www/html

    Volumes:
      - .:/var/www/html
      - ./docker/development/web/msmtprc:/etc/msmtprc
    Ports:
      - 8081:80
      - 8082:443
Die Datei msmtprc enthält die Konfiguration für den Versand von E-Mails über einen externen SMTP-Server. Und das Docker-Image ist so konfiguriert, dass die mail()-Funktion in PHP automatisch Mails über den konfigurierten externen Mailserver versendet. Details finden Sie im Artikel Wie man den Mailversand in PHP in Docker konfiguriert.

Schulung

Für Unternehmen, die ihre Abläufe rationalisieren wollen, kann ich Docker empfehlen. Und durch Docker-Schulung und anschließende Zusammenarbeit werden wir gemeinsam Docker in die Unternehmen bringen.

Docker Hub

Video, wie man ein Docker-Image erstellt und es auf Docker Hub hochlädt:

Für die Entwicklung von Projekten in PHP mit dem Nette Framework. oder Symfony können Sie das von mir erstellte Docker-Image verwenden, das alles enthält, was Sie brauchen: Apache, Composer, PHP mit Modulen. Hier ist Docker-Image für Symfony mit PHP7.4 und Docker-Image für Nette mit PHP7.4. Ich verwende diese Docker-Images auch auf meinem Schulungskursen zur Entwicklung von Webanwendungen.

Windows und Docker

Man kann Docker auch unter Windows betreiben, aber die Installation ist komplizierter und die Leistung ist schwächer. Es gibt mehrere Möglichkeiten, Docker unter Windows zum Laufen zu bringen:

Docker-Tutorials

Links und Ressourcen

docker
Docker-Hub
Docs Docker

Andere Ressourcen

https://dckr.cz/
docker-800-days-pote
vojta.kalcik.cz navody:docker
docker mariadb
Start-Container-automatisch/
proc-powered-docker/

Nette in Docker

docker nette
nette ist php 7.3 - November 2019, ich selbst betreibe Nette bereits auf PHP 7.4

Články na podobné téma

VMware-Lizenzierungsänderung
Ausführen von Microsoft SQL Server unter Linux
Sicherung: der Proxmox Backup Server
Linux als Router und Firewall
Hochladen eines Docker-Images in die Docker-Registry
Linux: Verwaltung logischer Datenträger
Linux-Software-RAID
Ausführen einer Webanwendung hinter einem Proxy
Migration von Postfächern
Mehrstufige Docker-Erstellung
Sichern Ihrer Daten durch Einschalten des Computers
Podman
Importieren von Windows in die Proxmox-Virtualisierung
Docker und PHP-Mail
Proxmox-Virtualisierung
Docker und Cron
Lenovo ThinkPad X1 Carbon: Inbetriebnahme des LTE-Modems EM7544
Yocto-Projekt: Erstellen eines eigenen Betriebssystems für eingebettete Geräte
Vorbereiten eines Linux-Servers für die Ausführung einer Webanwendung in Python
Wie man eine schlechte Dateifreigabeleistung in Docker behebt
Installation von Linux auf einem dedizierten HPE ProLiant DL320e Server
Wie man eine Webanwendung einem Belastungstest unterzieht
Warum das JFS-Dateisystem verwenden
Booten von einer 4TB-Festplatte mit GTP unter UEFI
Btrfs-Dateisystem
Raspberry PI
WINE - Ausführen von Windous Programmen unter Linux
GNU/Linux-Betriebssystem

Newsletter

Wenn Sie daran interessiert sind, gelegentlich Neuigkeiten per E-Mail zu erhalten.
Sie können sich registrieren, indem Sie Ihre E-Mail-Adresse eingeben News-Abonnement.


+