Befehl | Beschreibung | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
docker | Der Grundaufruf von Docker. Dieser Eintrag dient nur dem listen von Optionen die direkt nach docker kommmen, nach diesen kommen dann die eigentlichen Befehle und deren Optionen. Bsp: docker -H=somehost.de:2375 run -d nginx Würde auf einem entfernten Host somehost:2375 docker run mit der Option -d und Image nginx ausführen
|
||||||||||||||||||||||||||||||||||||||||||||
docker run -d <Image-Name>:<Tag> <Command> | Startet ein Image (falls nicht vorhanden wird es heruntergeladen) und ermöglicht initiale Konfiguration.
|
||||||||||||||||||||||||||||||||||||||||||||
docker start <Container-ID/Name> | Startet einen Container | ||||||||||||||||||||||||||||||||||||||||||||
docker stop <Container-ID/Name> | Stoppt einen Container | ||||||||||||||||||||||||||||||||||||||||||||
docker rm <Container-ID/Name> | Löscht einen Container. Dieser muss ggf. gestoppt sein |
||||||||||||||||||||||||||||||||||||||||||||
docker ps | Listet Container. Per Default werden nur die laufenden (nicht gestoppten) gelistet.
|
||||||||||||||||||||||||||||||||||||||||||||
docker inspect <Container-ID/Name> | Gibt weitere Details zu einem Container aus. U.a. welche interne IP er nutzt |
||||||||||||||||||||||||||||||||||||||||||||
docker exec <Container-ID/Name> <Befehl> | Führt einen Befehl auf einem laufenden Container aus. Die Ausgabe wird auf dem Terminal ausgeben.
Beispiel:
docker exec 5efg cat /etc/*release*Würde cat auf /etc/*release* im Container machen und die Release-Daten zurückgeben
docker exec -ti 5efg cat bashWürde eine bash auf dem Container starten und die Eingaben und Ausgaben an meine lokale Terminal-Sitzung weiterleiten. Man kann dann auf dem Container arbeiten als wäre man lokal auf dessen Terminal |
||||||||||||||||||||||||||||||||||||||||||||
docker logs <Container-ID/-Name> | Zeigt die Logs des Containers (was die Andwendung im Container nach stdout schreibt) | ||||||||||||||||||||||||||||||||||||||||||||
docker pull <Image-Name>:<Image-Tag> | Kurzversion von docker image pull | ||||||||||||||||||||||||||||||||||||||||||||
docker rmi <Image-Name>:<Image-Tag> | Kurzversion von docker image rm | ||||||||||||||||||||||||||||||||||||||||||||
docker image | Kommando um mit Images zu arbeiten. Siehe nachfolgende Einträge | ||||||||||||||||||||||||||||||||||||||||||||
docker image rm <Image-Name>:<Image-Tag> | Löscht das angegebene Image. Das Image darf nicht in Verwendung sein. Soll ein Image mit einem Tag was nicht „latest“ ist gelöscht werden muss das Tag angeben werden |
||||||||||||||||||||||||||||||||||||||||||||
docker image pull <Image-Name>:<Tag> | Lädt ein Image herunter. Startet aber im Gegensatz zu „docker run“ keinen Container mit diesem Image. Wenn das Tag „latest“ genutzt werden soll braucht es nicht explizit angegeben zu werden |
||||||||||||||||||||||||||||||||||||||||||||
docker build [–file <Dockerfile>] -t <Image-Name>:<tag> | Baut ein neues Image anhand eines Dockerfiles. –file <Dockerfile> ist nur notwendig wenn das Dockerfile nicht den Namen „Dockerfile“ hat. <tag> ist optional - wenn nicht angegeben wird es „latest“ |
||||||||||||||||||||||||||||||||||||||||||||
docker push <Imagename> | Veröffentlicht ein Image in einer Registry (per Default in Docker-Hub). Für Images die kein offizielles Produktimage ist muss man PersönlicherName/Image-Name oder Firmenname/Image-Name benutzen beim benennen des Images. Der Name vor dem \ muss der Account-Name sein. |
||||||||||||||||||||||||||||||||||||||||||||
docker login | Bevor man irgendetwas mit der Registry machen kann (zum Beispiel docker push) muss man sich in der Regel einloggen | ||||||||||||||||||||||||||||||||||||||||||||
docker history <Imagename> | Zeigt die Layer und Veränderungen an einem Image an | ||||||||||||||||||||||||||||||||||||||||||||
docker compose | Verwaltet mehrere Container anhand eines Compose-Files.
|
||||||||||||||||||||||||||||||||||||||||||||
docker volume | Verwaltung von volumes. Volumes sind bleibender (persistent) Speicher die in den Container in ein Verzeichnis gemountet werden können (siehe docker run -v-Option). Container sind modifizierbar (Änderungen bleiben also erhalten), aber sobald der Container gelöscht wird sind die Änderungen weg → was z.B. bei Datenbanken ggf. unerwünscht ist.
|
||||||||||||||||||||||||||||||||||||||||||||
docker network | Verwaltet die Netzwerke
|
FROM ubuntu:22.04 RUN apt-get update & apt install python3 python3-pip COPY ./somescript.py /opt/somescript.py CMD /opt/somescript.py
Instruction | Bedeutung |
---|---|
FROM <Image-Name>:<Tag> | Gibt an auf welchem Image das Image basieren soll. Muss vorhanden sein. Das Tag ist optional, wenn nicht angegeben wird „latest“ genommen |
RUN <Command> | Führt einen Befehl innerhalb des Images (was über FROM geladen wurde) aus. Die Reihenfolge der Befehle wird beachtet. Es können nur Befehle ausgeführt werden die zum jeweiligen Zeitpunkt auch Teil des Images sind (es spielt keine Rolle ob der Befehl auf dem Host existiert, er muss im Image vorhanden sein). |
COPY | Kopiert eine lokale Datei in den Container. Es wird vom Host in den Container kopiert |
ENV <Variable>=Wert | Setzt eine Umgebungsvariable im Container auf einen bestimmten Wert. „ENV EDITOR=vim“ würde die EDITOR-Umgebungsvariable auf vim setzen |
EXPOSE <Portnummer> | Ein bestimmter Port wird „freigegeben“. Dieser Port ist dann über die interne IP des Containers erreichbar (es muss natürlich eine Anwendung im Container auf diesem Port lauschen) |
CMD <Befehl> | Der Befehl wird ausgeführt wenn der Container gestartet wird.
CMD Befehl Parameter1 Parameter2oder als Liste: CMD ["Befehl", "Parameter1", "Parameter2"]Aber nicht so: CMD ["Befehl Parameter1"]In der Listen-Form müssen Befehle und jeder als eigener Eintrag aufgeführt werden. |
ENTRYPOINT <Befehl> | Im Gegensatz zu CMD werden Parameter die nach dem Containernamen angegeben werden angehängt. Ein vorhandener CMD-Eintrag stellt die Default-Parameter zur Verfügung falls keine angegeben werden. Beispiel: CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] ENTRYPOINT [mysql]Obige Konfiguration würde mysql (Entrypoint) ausführen im Container und wenn keine Parameter bei docker run angegeben werden die Parameter in CMD an mysql übergeben. docker run -d --name dbinstance mysql --character-set-server=latin1hingegen würde nur –character-set-server=latin1 an den mysql-Aufruf übergeben. Hinweis: Es muss die JSON-Syntax → also [„Parameter1=Value1“, „Parameter2=Value2“] benutzt werden |
Näheres findet man hier: https://docs.docker.com/engine/network/
version: 3 services: webserver: image: "nginx:13.2" ports: - "8080:80" myapp: build: ./myapp
Key | Eltern-Element | Typ | Beschreibung |
---|---|---|---|
- | Dictionary | Imaginäre-Root-Element | |
include | root | list | Bindet anderes Compose-File ein und führt sie gemeinsam mit diesem aus. Liste von Strings (jede repräsentiert den Pfad zu einer Compose-Datei |
version | root | int | Gibt die Version an - Beschreibung siehe in Stichpunkten oben. Ab Version 2 verpflichtend |
servicses | root | Dictionary | Enthält die Services aka. die Container die gestartet werden sollen. Einträge sind die Namen der Container |
<Name des Service> | services | Dictionary | Definiert die Eigenschaften des Service/Containers Entspricht docker --name <Name des Service> |
image | <Name des Service> | string | Image welches für den Container genutzt werden soll. Es muss als string angegeben werden. Wird ein Tag genutzt oder bestimmte Zeichen (wie zum Beispiel ein Tag angegeben und durch : getrennt) muss es in „“ gesetzt werden. Entpspricht docker <Image-Name> |
ports | <Name des Service | List | Host-Port-Mappings. Listeneinträge sind strings und müssen in „“ gesetzt werden → wegen des „:“ und weil es Ziffern sind <Port auf Host>:<Port im Container> Entspricht docker -p |
build | <Name des Services> | String | Kann statt Image angegeben werden und baut das Image beim ausführen von docker compose up. Verzeichnis in dem sich das zu bauende Dockerfile befindet |
depends_on | <Name des Service | List | Gibt an das der Container erst gestartet werden soll wenn ein oder mehrere andere Container gestartet wurden. Die Liste gibt an auf welche Container gewartet werden soll. Zum Beispiel muss zuerst der DB Container vor dem Application-Container gestartet werden (weil die Anwendung sich zur Datenbank verbinden muss). Dann wird beim Application-Eintrag ein depends_on-Eintrag mit „db“ angelegt. |
networks | root | Dictionary | Enthält die Namen der Netzwerke. |
<Netzwerk-name> | networks | Dictionary | Netzwerk-Einträge. Kann ein leeres Dictionary sein <Netzwerkname>: dann sind keine weiteren Eigenschaften für das Netzwerk definiert und Default-Eigenschaften werden genutzt |
<Netzwerk-Name> | <Name des Service> | List | Liste von Netzwerken (definiert in network-key unterhalb von root) denen der Container angehört. Innerhalb dieser ist der Container über seinen Namen ansprechbar/erreichbar (Namensauflösung) |
Namespaces (Kernel-Feature) werden genutzt um Prozesse und Netzwerke zu trennen.
Der Host sieht dabei die Prozesse die im Container laufen als ganz normale Prozesse, mit normaler ID.
Der Container sieht eine eigene PID 1 und seine eigenen Prozesse mit ansteigenden PIDs - die von den PIDs abweichen die die gleichen Prozesse auf dem Hostsystem haben.
Über cgroups (Kernel-Feature) kann die Nutzung von CPU und RAM eingeschränkt werden.
Effektiv wird die cgroup auf die Prozesse im Containers angewendet.
Man kann Verzeichnisse, Volumes (letztendlich Verzeichnisse unter /var/lib/docker/volumes) und tmpfs (Volumes im Arbeitsspeicher die nur existieren solange der Container läuft) in den Container mounten.
Das ist sinnvoll wenn:
Ggf. kann man auch den Storage-Treiber für den Container ändern um mehr Schreibperformance innerhalb des Containers rauszuholen, besser ist aber Volumes/Mounts zu nutzen.
Datei/Verzeichnis | Bedeutung |
---|---|
/var/lib/docker | Alle Dateien die Docker dynamisch erzeugt |
/var/lib/docker/image | Images |
/var/lib/docker/containers | Jeder Container hat hier ein Verzeichnis. U.a. Config, Logs usw. liegen hier |
/var/lib/docker/volumes | Volumes die per docker volume create erstellt werden befinden sich hier |
Von einer anderen Registrie laden:
docker login docker run <Registrie-Name>/<Verzeichnis>/<Image>:<Tag>
docker tag <Imagename> <Host:Port>/<Pfad>/<Imagename>:<Tag> docker login docker push <NewImagename>
Problem | Beschreibung |
---|---|
docker.errors.NullResource: Resource ID was not provided | Eine Umgebungsvariable wurde nicht gesetzt (in der Regel werden Warnungen ausgegeben). In der Regel hat irgend ein Image in docker-compose.yaml eine Variable im Namen die nicht aufgelöst werden kann |
docker stop <Container ID> stoppt Container nicht | docker rm -f containername |