Welche Optionen und Befehle docker grundsätzlich kennt, erfährt man mit dem Befehl docker --help
docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
...
Management Commands:
builder Manage builds
config Manage Docker configs
...
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
...
Images
docker Container werden mit Hilfe von Images gebaut.
Dabei handelt es sich um eine Kombination aus Dateisystem und Parametern.
Beides kann angepasst und verändert werden, aber dazu später mehr…
docker Hub
Auf docker Hub finden sich Images für so ziemlich jeden Verwendungszweck von Containern.
Das herunterladen (pullen) eines Images
Direkt nach der Installation befinden sich noch keine Images auf dem System:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Ein gerne verwendetes Beispiel ist das Verwenden eines Webservers in einem Container. Ich verwende hierbei das neuste Image von Nginx, welches von Docker Hub heruntergeladen wird.
Dies geschieht mit dem Befehl docker image pull author/imagename:tag
docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
fc7181108d40: Pull complete
c4277fc40ec2: Pull complete
780053e98559: Pull complete
Digest: sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
Status: Downloaded newer image for nginx:latest
Dieses neue Image findet sich nun auch in der entsprechenden Übersicht:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 719cd2e3ed04 17 hours ago 109MB
Mit diesem Image können wir nun Container erstellen, selbst wenn das System offline ist.
Wenn man sich die Einzelheiten eines Images anzeigen lassen möchte, verwendet man den Befehl: docker image inspect <IMAGE ID>
$ docker image inspect 719cd2e3ed04
[
{
"Id": "sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a"
],
"Parent": "",
...
Um zu schauen welcher Befehle beim starten ausgeführt werden, kann man mit grep
arbeiten:
$ docker image inspect 719cd2e3ed04 | grep -i cmd
"Cmd": [
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
Images suchen
Wenn man schauen möchte was es an Images auf docker Hub für einen bestimmten Dienst/Zweck gibt, kann man docker search <Suchbegriff>
verwenden.
Beispiel:
$ docker search caddy
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
abiosoft/caddy Caddy is a lightweight, general-purpose web … 221 [OK]
joshix/caddy Caddy web server image based on `scratch` 22 [OK]
lucaslorentz/caddy-docker-proxy Caddy as a reverse proxy for Docker 10
stefanprodan/caddy Caddy server unofficial version built from s… 2
...
Image aktualisieren
Möchte man sein lokales Image aktualisieren, so pullt man das entsprechende Image einfach noch einmal.
Ein Befehl um alle lokalten Images zu aktualisieren sieht dann wie folgt aus: docker images | grep -v REPOSITORY | awk '{print $1}' | xargs -L1 docker pull
$ docker images | grep -v REPOSITORY | awk '{print $1}' | xargs -L1 docker pull
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
Status: Image is up to date for nginx:latest
Ein Image verändern
Wenn man ein Image nach seinen Wünschen anpassen möchte, so pullt man sich zuerst ein entsprechendes Image, welches die Basis für das neue Image wird.
Ich verwende die neuste Version des CentOS-Images:
$ docker image pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 9f38484d220f 2 months ago 202MB
Um das Image zu verändern starten wir einen Container namens centos_change, welcher auf dem entsprechenden Image basiert und starten eine (bash)Shell:
$ docker run -it --name="centos_change" centos:latest /bin/bash
[root@bebb8ad59c2f /]#
und legen dort testweise eine neue Datei an:
$ [root@bebb8ad59c2f /]# echo "das ist ein test" > testfile
Nachdem man sich per exit
wieder ausgeloggt hat, pusht man, ähnlich wie bei git, seine Änderungen als neues Image in die lokale docker Registry:
$ docker commit -m="Das ist ein Test-Image" centos_change neues_centos_image
sha256:fde113589ca750c7adbdb1d5663cf04deb0e214af339ffe6e1f191ef6fbf7f21
Aus der Hilfe: -m, --message string Commit message
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
neues_centos_image latest fde113589ca7 7 seconds ago 202MB
centos latest 9f38484d220f 2 months ago 202MB
Nun lässt sich aus dem neuen Image natürlich wieder ein Container erstellen, welcher nun automatisch die eben gemachten Veränderungen mitbringt:
$ docker run -it --name="centos_change2" neues_centos_image /bin/bash
[root@d26865c2e2f1 /]# cat testfile
das ist ein test
docker history
Mit dem Befehl docker history <Image-ID/Imagename>
lassen sich die am Image gemachten Veränderungen anzeigen:
$ docker history neues_centos_image
IMAGE CREATED CREATED BY SIZE COMMENT
fde113589ca7 12 hours ago /bin/bash 89B Das ist ein Test-Image
9f38484d220f 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
Image löschen
Mithilfe des Befehls docker image rm <IMAGE ID>
lassen sich Images auch wieder entfernen.
Hierbei gilt es zu beachten, daass wenn man Images hat, welche auf ein bestimmtes Basis-Image bauen, dieses Basis-Image nicht gelöscht werden kann:
$ docker image rm -f 055936d39205
Error response from daemon: conflict: unable to delete 055936d39205 (cannot be forced) - image has dependent child images
Image als .tar Archiv speichern
Um dies zu realisieren gibt es 3 Möglichkeiten:docker image save <IMAGE> > <Dateiname>.tar
docker image save <IMAGE> -o <Dateiname>.tar
docker image save <IMAGE> --output <Dateiname>.tar
Beispiel:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testimage 0.1 6f2c2146aa0d About an hour ago 202MB
Das testimage
packen wir nun per docker image save testimage -o testtar.tar
in ein tar-Archiv.
-rw-------. 1 root root 200M 19. Jun 11:15 testtar.tar
Nun kann man auch einen Blick hinein werfen und sieht die einzelnen „Zwischenimages“ aus welchen das Image besteht:
$ tar -tvf testtar.tar
-rw-r--r-- 0/0 2343 2019-06-19 10:05 6f2c2146aa0ddb0ecbdcd6b792649e16cadb745143e39f86614873290d0ad318.json
drwxr-xr-x 0/0 0 2019-06-19 10:05 c6a4d63e3bb038c8851509abef62a99a2fcb126ebbffcab9773a841d2f820c2a/
-rw-r--r-- 0/0 3 2019-06-19 10:05 c6a4d63e3bb038c8851509abef62a99a2fcb126ebbffcab9773a841d2f820c2a/VERSION
-rw-r--r-- 0/0 1601 2019-06-19 10:05 c6a4d63e3bb038c8851509abef62a99a2fcb126ebbffcab9773a841d2f820c2a/json
-rw-r--r-- 0/0 209486336 2019-06-19 10:05 c6a4d63e3bb038c8851509abef62a99a2fcb126ebbffcab9773a841d2f820c2a/layer.tar
-rw-r--r-- 0/0 221 1970-01-01 00:00 manifest.json
-rw-r--r-- 0/0 165 1970-01-01 00:00 repositories
Image aus .tar Archiv laden
Ähnlich wie beim speichern als tar-Archiv, gibt es auch hier wieder 3 Möglichkeiten sich aus einem tar-Archiv ein Image zu laden:
docker image load < <Dateiname>.tar
docker image load -i <Dateiname>.tar
docker image load --input <Dateiname>.tar
Beispiel:
$ docker image load -i testtar.tar
Loaded image: testimage:0.1