Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
|
docker [2025/02/23 11:17] |
docker [2025/11/12 13:00] (aktuell) |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | Docker ist eine Open-Source-Plattform zur [[container|Containerisierung]] von Anwendungen. Es ermöglicht das Erstellen, Bereitstellen und Ausführen von Anwendungen in isolierten Containern, die alle notwendigen Abhängigkeiten enthalten und plattformunabhängig betrieben werden können. | ||
| + | Ursprünglich auf [[LXC]] basierend, nutzt Docker heute seine eigene Laufzeit (docker -> [[containerd]] -> runc) und baut auf Funktionen des Linux-Kernels wie Namespaces und Control Groups auf, um die Isolation der Container sicherzustellen. Diese Architektur sorgt für hohe Portabilität, | ||
| + | |||
| + | Siehe auch [[kubernetes|Kubernetes]]. | ||
| + | |||
| + | =====Hauptkomponenten===== | ||
| + | |||
| + | * Docker-Image: | ||
| + | * Docker-Container: | ||
| + | * Docker-Daemon: | ||
| + | |||
| + | =====Dockerfile===== | ||
| + | |||
| + | Ein Dockerfile ist eine Textdatei, die eine automatisierte Build-Anweisung für das Erstellen eines Docker-Images enthält. Dockerfiles werden verwendet, um Container-Images zu erstellen. | ||
| + | |||
| + | Ein Dockerfile besteht aus einer Reihe von Anweisungen, | ||
| + | |||
| + | Hier sind einige der gängigsten Anweisungen, | ||
| + | |||
| + | * FROM: Die FROM-Anweisung definiert das Basisimage, auf dem das neue Image basieren soll. Es kann sich um ein offizielles Docker-Image handeln, z. B. ein Betriebssystem wie Ubuntu oder Alpine, oder um ein benutzerdefiniertes Image, das von einem anderen Dockerfile abgeleitet wurde. | ||
| + | * RUN: Die RUN-Anweisung führt Befehle innerhalb des Containers aus und erzeugt einen neuen Layer mit den Änderungen. Dies können Installationsbefehle, | ||
| + | * COPY: Die COPY-Anweisung kopiert Dateien oder Verzeichnisse vom Host in den Container. Dies wird häufig verwendet, um Anwendungsquellcode, | ||
| + | * WORKDIR: Die WORKDIR-Anweisung legt das Arbeitsverzeichnis innerhalb des Containers fest, in dem alle nachfolgenden Befehle ausgeführt werden. Dadurch können relative Dateipfade in den folgenden Anweisungen verwendet werden. | ||
| + | * EXPOSE: Die EXPOSE-Anweisung gibt an, welche Ports der Container zur Kommunikation mit der Außenwelt öffnen soll. Diese Anweisung hat keine Auswirkung auf die tatsächliche Portöffnung, | ||
| + | * CMD: Die CMD-Anweisung gibt die Standardbefehle an, die beim Starten eines Containers ausgeführt werden sollen. Es kann nur eine CMD-Anweisung in einem Dockerfile vorhanden sein. Wenn beim Starten des Containers zusätzliche Befehle angegeben werden, überschreiben sie die in der CMD-Anweisung angegebenen Befehle. | ||
| + | * ENV: Die ENV-Anweisung in einem Dockerfile wird verwendet, um Umgebungsvariablen im Container zu definieren. Umgebungsvariablen sind Schlüssel-Wert-Paare, | ||
| + | * ENTRYPOINT: Die ENTRYPOINT-Anweisung in einem Dockerfile definiert den Standardbefehl oder das Skript, das beim Starten eines Containers ausgeführt wird. Der Befehl oder das Skript wird als ausführbare Datei innerhalb des Containers behandelt. | ||
| + | * VOLUME: Die VOLUME-Anweisung in einem Dockerfile wird verwendet, um ein oder mehrere Volumes im Container zu definieren. Ein Volume ist ein Speicherbereich, | ||
| + | |||
| + | < | ||
| + | # Ubuntu with SSH and root login | ||
| + | FROM ubuntu | ||
| + | |||
| + | RUN apt-get update && apt-get install -y openssh-server | ||
| + | RUN mkdir / | ||
| + | |||
| + | RUN useradd -ms /bin/bash newuser | ||
| + | RUN echo " | ||
| + | |||
| + | #RUN echo ' | ||
| + | |||
| + | CMD ["/ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | # Verwenden des Python-Basisimages | ||
| + | FROM python:3.9 | ||
| + | |||
| + | # Setzen des Arbeitsverzeichnisses innerhalb des Containers | ||
| + | WORKDIR /app | ||
| + | |||
| + | # Kopieren der Anforderungen (requirements.txt) in den Container | ||
| + | COPY requirements.txt . | ||
| + | |||
| + | # Installation der Abhängigkeiten | ||
| + | RUN pip install --no-cache-dir -r requirements.txt | ||
| + | |||
| + | # Kopieren des Anwendungsquellcodes in den Container | ||
| + | COPY . . | ||
| + | |||
| + | # Exponieren des Ports, auf dem die Anwendung lauscht | ||
| + | EXPOSE 8000 | ||
| + | |||
| + | # Festlegen des Standardbefehls beim Starten des Containers | ||
| + | CMD [" | ||
| + | </ | ||
| + | |||
| + | Den Container erstellen. | ||
| + | |||
| + | < | ||
| + | docker build -t < | ||
| + | docker run -dit -p 80:80 < | ||
| + | </ | ||
| + | =====Docker-Compose===== | ||
| + | |||
| + | Im Gegensatz zu einem einzelnen Dockerfile, das ein einzelnes Image definiert, ermöglicht Docker Compose die Definition und Konfiguration von Diensten, Netzwerken und Volumes für eine vollständige Anwendungsumgebung. Es verwendet eine einfache YAML-Datei, um die Konfiguration zu beschreiben. | ||
| + | |||
| + | < | ||
| + | version: ' | ||
| + | services: | ||
| + | webserver: | ||
| + | image: httpd: | ||
| + | networks: | ||
| + | - my-network | ||
| + | ports: | ||
| + | - 80:80 | ||
| + | volumes: | ||
| + | - ./ | ||
| + | depends_on: | ||
| + | - database | ||
| + | database: | ||
| + | image: mariadb: | ||
| + | networks: | ||
| + | - my-network | ||
| + | environment: | ||
| + | - MYSQL_ROOT_PASSWORD=secret | ||
| + | - MYSQL_DATABASE=mydatabase | ||
| + | - MYSQL_USER=myuser | ||
| + | - MYSQL_PASSWORD=mypassword | ||
| + | volumes: | ||
| + | - db-data:/ | ||
| + | volumes: | ||
| + | db-data: | ||
| + | networks: | ||
| + | my-network: | ||
| + | </ | ||
| + | |||
| + | ====Deployments==== | ||
| + | |||
| + | Um einen Load-Balanced Cluster mit mehreren Instanzen einer Anwendung zu erstellen, kannst du die Deploymentfunktion von Docker Compose verwenden. Somit laufen 3 Instanzen der Anwendung. Fällt eine aus, wird automatisch ein neuer Container gestartet. | ||
| + | |||
| + | < | ||
| + | version: ' | ||
| + | services: | ||
| + | app: | ||
| + | image: myapp: | ||
| + | ports: | ||
| + | - 80:80 | ||
| + | deploy: | ||
| + | mode: replicated | ||
| + | replicas: 3 | ||
| + | update_config: | ||
| + | parallelism: | ||
| + | delay: 10s | ||
| + | restart_policy: | ||
| + | condition: any | ||
| + | </ | ||
| + | |||
| + | Deployment starten/ | ||
| + | |||
| + | < | ||
| + | // Im Verzeichnis wo die docker-compose.yaml Datei liegt | ||
| + | sudo docker compose [-f < | ||
| + | |||
| + | sudo docker compose down < | ||
| + | </ | ||
| + | =====Volumes===== | ||
| + | |||
| + | Docker Volumes werden verwendet, um Daten zwischen Containern und dem Host-Betriebssystem auszutauschen und um sicherzustellen, | ||
| + | |||
| + | * Named Volumes: Named Volumes sind Volumes, die einen Namen haben und vom Docker-Daemon verwaltet werden. Sie sind einfach zu verwenden und können leicht zwischen Containern geteilt werden. | ||
| + | * Host-mounted Volumes: Host-mounted Volumes ermöglichen es, einen Pfad auf dem Host-Betriebssystem als Volume-Mountpunkt zu verwenden. Dies ermöglicht eine direkte Verbindung zwischen dem Host und dem Container, wodurch Daten schnell ausgetauscht werden können. Allerdings sind Host-mounted Volumes weniger portabel, da sie von der spezifischen Konfiguration des Hosts abhängig sind. | ||
| + | * Anonymous Volumes: Anonymous Volumes sind temporäre Volumes, die während der Laufzeit des Containers erstellt werden und keinen expliziten Namen haben. Sie werden automatisch von Docker erstellt und sind für einzelne Container reserviert. | ||
| + | |||
| + | Ein Volume erstellen kann man mit | ||
| + | |||
| + | < | ||
| + | docker volume create myvolume | ||
| + | </ | ||
| + | |||
| + | Mit dem Parameter --mount kann man ein Volume in einen Container mounten. Mit dem Parameter -v kann man einen Pfad am Host in einen Mountpoint am Container mounten. | ||
| + | |||
| + | < | ||
| + | docker run -dit --mount source=< | ||
| + | docker run -dit -v < | ||
| + | </ | ||
| + | |||
| + | =====LVM===== | ||
| + | |||
| + | Vor der Installation bzw Inbbetriebnahme von Docker das [[LVM]] anlegen. | ||
| + | |||
| + | < | ||
| + | sudo mount / | ||
| + | </ | ||
| + | |||
| + | In der fstab | ||
| + | |||
| + | < | ||
| + | / | ||
| + | </ | ||
| + | =====Netzwerke===== | ||
| + | |||
| + | Docker Networking unterstützt verschiedene Netzwerkmodelle, | ||
| + | |||
| + | ^Name^Beschreibung^ | ||
| + | |none|todo| | ||
| + | |[[https:// | ||
| + | |[[https:// | ||
| + | |[[https:// | ||
| + | |[[https:// | ||
| + | |[[https:// | ||
| + | |||
| + | Mit | ||
| + | |||
| + | < | ||
| + | docker network create -d < | ||
| + | docker network inspect < | ||
| + | docker network rm < | ||
| + | </ | ||
| + | |||
| + | kann man ein neues erstellen. Ein macvlan mit | ||
| + | |||
| + | <code bash> | ||
| + | network create -d macvlan --subnet=192.168.0.0/ | ||
| + | </ | ||
| + | |||
| + | Ein Container Interface an ein Netzwerk binden kann man mit dem Parameter --network. | ||
| + | |||
| + | < | ||
| + | docker run -dit --name test --network mynetwork ubuntu | ||
| + | |||
| + | docker run -dit --name test --network macvlan_network --ip=192.168.0.2 ubuntu | ||
| + | </ | ||
| + | |||
| + | Ein Netzwerk von einem Container entfernen oder ändern kann man mit | ||
| + | |||
| + | < | ||
| + | docker network disconnect < | ||
| + | docker network connect < | ||
| + | </ | ||
| + | |||
| + | =====Traefik===== | ||
| + | |||
| + | [[Traefik]] ist ein Reverse [[Proxy]] um [[Container]] über das Internet erreichbar zu machen. | ||
| + | =====Installation===== | ||
| + | |||
| + | Docker [[https:// | ||
| + | |||
| + | ====Installer Script==== | ||
| + | Die einfachste Weise ist das Installer Script von der Docker Website. | ||
| + | |||
| + | < | ||
| + | curl -fsSL https:// | ||
| + | sh get-docker.sh | ||
| + | usermod -aG docker < | ||
| + | </ | ||
| + | |||
| + | ====Ubuntu Repository==== | ||
| + | |||
| + | Es gibt zwei verschiedene Paketquellen (Repositories) für Docker unter Ubuntu. Im offiziellen Ubuntu Repository ist das Paket docker.io erhältlich. Das ist aber oft veraltet und hinkt stark hinterher. Ausserdem wird es nicht direkt von Docker Inc. gepflegt und enthält nur Basis-Docker, | ||
| + | |||
| + | < | ||
| + | sudo apt install docker.io | ||
| + | </ | ||
| + | |||
| + | ====Docker Repository==== | ||
| + | |||
| + | Dann gibt es noch das offizielle Docker Repository docker-ce (Community Edition). Dieses muss man manuell einbinden (GPG-Key, APT-Repo). Es wird allerdings von Docker inc. selbst gepflegt, ist immer die aktuellste Version und alle Plugins bekommt man auch. | ||
| + | |||
| + | < | ||
| + | # add pgp key for signed docker repository | ||
| + | sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common | ||
| + | curl -fsSL https:// | ||
| + | sudo apt-key fingerprint 0EBFCD88 | ||
| + | sudo add-apt-repository "deb [arch=amd64] https:// | ||
| + | |||
| + | # update again | ||
| + | sudo apt-get update | ||
| + | |||
| + | # install docker | ||
| + | sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin | ||
| + | </ | ||
| + | |||
| + | |||
| + | =====Docker Daemon===== | ||
| + | |||
| + | < | ||
| + | nano / | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | [ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | =====Registry===== | ||
| + | |||
| + | Run a local registry: Quick Version | ||
| + | |||
| + | < | ||
| + | docker run -d -p 5000:5000 --restart always --name registry registry:2 | ||
| + | </ | ||
| + | |||
| + | Now, use it from within Docker: | ||
| + | |||
| + | < | ||
| + | docker pull ubuntu | ||
| + | docker tag ubuntu localhost: | ||
| + | docker push localhost: | ||
| + | </ | ||
| + | See also [[https:// | ||
| + | =====Usage===== | ||
| + | |||
| + | < | ||
| + | docker pull < | ||
| + | docker images | ||
| + | docker rmi -f < | ||
| + | docker image prune | ||
| + | |||
| + | docker inspect < | ||
| + | docker container diff < | ||
| + | |||
| + | // see https:// | ||
| + | docker run -dit --name < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | // change a running container using a snapshot | ||
| + | docker commit < | ||
| + | docker run -dit < | ||
| + | |||
| + | // start with same settings as setup | ||
| + | docker start < | ||
| + | |||
| + | // befehl auf laufendem host ausführen | ||
| + | docker exec < | ||
| + | |||
| + | docker attach < | ||
| + | sudo docker exec -it < | ||
| + | # ctrl + p - ctrl q ==> detach (nur mit -ti)? | ||
| + | |||
| + | docker start < | ||
| + | docker stop < | ||
| + | docker restart < | ||
| + | |||
| + | docker rename < | ||
| + | |||
| + | docker container ls | ||
| + | docker ps -a | ||
| + | docker rm < | ||
| + | docker container prune // remove all " | ||
| + | |||
| + | // volumes | ||
| + | docker volume create --name testvol | ||
| + | docker volume inspect test-vol | ||
| + | docker volume rm test-vol | ||
| + | docker run -dit --mount source=test-vol, | ||
| + | docker run -dit -v test-vol:/ | ||
| + | |||
| + | // networking | ||
| + | docker network create -d bridge MyBridgedNetwork | ||
| + | docker network connect < | ||
| + | docker network inspect | ||
| + | |||
| + | docker network connect < | ||
| + | docker network disconnect < | ||
| + | </ | ||
| + | |||
| + | =====Docker Swarm Cluster===== | ||
| + | |||
| + | Als erstes erstellt man mit dem Befehl | ||
| + | |||
| + | < | ||
| + | docker swarm init --advertise-addr < | ||
| + | </ | ||
| + | |||
| + | ein Kontrollnode. Am Ende wird **ein Token** angezeigt, diesem gut merken! Möchte man weitere Nodes zu dem Cluster hinzufügen, | ||
| + | |||
| + | < | ||
| + | docker swarm join --token < | ||
| + | </ | ||
| + | |||
| + | aus. Mit dem Befehl | ||
| + | |||
| + | < | ||
| + | docker node ls | ||
| + | </ | ||
| + | |||
| + | werden alle Nodes eines Clusters angezeigt. | ||
| + | |||
| + | =====Syslog===== | ||
| + | |||
| + | Es gibt ein Input Module für [[rsyslog]]. [[https:// | ||
| + | =====Links===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * [[https:// | ||