Docker Tutorial [Teil 2 - Images]

Datum

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

Autor
Kategorien container, docker

PRTG Map