Docker Tutorial [Teil 3 - Container]

Datum

Wie bereits im Teil 2 dieser Reihe erklärt, basieren docker Container auf Images.

Welche Befehle docker in Bezug auf Container kennt sieht man beim Ausführen von docker container --help

$ docker container --help 

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  inspect     Display detailed information on one or more containers
  kill        Kill one or more running containers
  logs        Fetch the logs of a container
  ls          List containers
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  prune       Remove all stopped containers
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  run         Run a command in a new container
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker container COMMAND --help' for more information on a command.
Einen Container starten

Um einen Container von einem beliebigen Image zu starten verwendet man den Befehl docker container run <author/imagename:tag>

Sollte sich das entsprechende Image noch nicht lokal vorhanden sein, wird es beim Aufruf des Befehls automatisch heruntergeladen.

Beispiel:

$ docker container run busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
ff5eadacfa0b: Pull complete 
Digest: sha256:c888d69b73b5b444c2b0bd70da28c3da102b0aeb327f3a297626e2558def327f
Status: Downloaded newer image for busybox:latest

Hier wird nun das aktuellste Image von busybox aus docker Hub heruntergeladen und daraus ein Container erstellt.

Dieser findet sich aber nicht in der Liste der aktiven Container:

$ docker container ls 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Man muss sich schon alle Container anzeigen lassen um den busybox Container zu sehen:

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
5312778aed9d        busybox             "sh"                3 minutes ago       Exited (0) 3 minutes ago                       modest_ellis

Warum ist das so?
Wie man sieht hat der Container den STATUS „Exited“ und das liegt daran, dass beim starten des Containers nur einmal die Shell aufgerufen wird (COMMAND „sh“) und sich dann beendet.

docker bietet auch die Möglichkeit einen Container sofort zu löschen wenn sich dieser beendet hat.
Dafür verwendet man die Option --rm (aus der Hilfe: --rm Automatically remove the container when it exits)

Alternativ zu docker container ls -a kann man auch docker ps -a verwenden.

alle beendeten Container entfernen

Um die inaktiven Container zu löschen verwendet man prune (aus der Hilfe: prune Remove all stopped containers).

$ docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
db17b7249ff365ff4d9805fc6a0e7450c42dffa8e5c30ccef164c954cc0be5a9
b559348b43fc92358d44e9ec2c71ed20c155be1b37fa3d49a80b6a213cc41812

Die Sicherheitsabfrage kann man mit einem zusätzlichen -f (für force) umgehen.

detach

Nun nehmen wir nochmal das NginX-Image als Beispiel, da der entsprechende Container nach dem starten dauerhaft läuft und sich nicht wieder sofort beenden sollte.

Startet man einen NginX-Container mit dem Befehl docker container run nginx, so findet man sich innerhalb des laufenden Containers wieder und kann nicht wirklich etwas tun und wenn man per Strg+c wieder im regulären Terminal landet wurde der Container beendet.

Um einen Container im Hintergrund zu starten verwendet man die Option -d (aus der Hilfe: -d, --detach Run container in background and print container ID)

Beispiel:

$ docker container run -d nginx
5bc69f40acb47052f6d92c3fede4ec63d1301fb62eff00f5d0149f8a8d27d623
$ docker container ls 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5bc69f40acb4        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        80/tcp              brave_brattain

Um in den Container zu gelangen (attach) verwendet man den Befehl docker attach <container-ID/containername>

Shell im Container
Da beim starten des busybox-Containers direkt eine Shell aufgerufen wird, wollen wir da gleich „reinspringen“. Hierzu verwenden wir die Optionen:
  • -i, --interactive Keep STDIN open even if not attached
  • -t, --tty Allocate a pseudo-TTY
$ docker container run -it busybox
/ # uname -a
Linux 8b93ef5c5633 3.10.0-957.12.1.el7.x86_64 #1 SMP Mon Apr 29 14:59:59 UTC 2019 x86_64 GNU/Linux
/ #

Sofern bei einem laufenden Container in die Shell „reinspringen“ möchte, kann man den docker exec Befehl verwenden.

In dem folgenden Beispiel starte ich die bash im laufenden Container nginx:

$ docker exec -it nginx bash
root@815be30761b6:/#

Auch nachdem ich diese Shell wieder verlassen haben, läuft der Container weiter.

Container steuern

Container auflisten: docker ps
Container starten: docker start <container-ID/containername>
Container stoppen: docker stop <container-ID/containername>
Container neu starten: docker restart <container-ID/containername>
Container löschen: docker rm <container-ID/containername>
Prozesse in einem Container pausieren: docker pause <container-ID/containername>
pausierten Container starten: docker unpause <container-ID/containername>
die Logs eines Containers anzeigen lassen: docker logs <container-ID/containername>

einen Namen für einen Container setzen

Normalerweise vergibt docker, sofern nicht anders angegeben, bei der Erstellung der Container einen zufälligen Namen wie z.B.: pedantic_brahmagupta oder inspiring_driscoll.
Mit Hilfe der Option --name kann man einen eigenen Namen angeben:
docker container run --name meine_busybox busybox

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
94b66963b58e        busybox             "sh"                3 seconds ago       Exited (0) 2 seconds ago                       meine_busybox
Prozesse in einem Container anzeigen lassen

Der Befehl docker top <container-ID/containername> gibt die im Container laufenden Prozesse aus:

$ docker top 815be30761b6
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11885               11868               0                   06:32               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 11924               11885               0                   06:32               ?                   00:00:00            nginx: worker process
vom Container verwendete Ressourcen anzeigen lassen

Mit dem Befehl docker stats <container-ID/containername> lassen sich die im Augenblick verwendeten Ressourcen anzeigen, welche sich im Sekundentakt aktualisieren.

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
b0bb571c2c89        hungry_euler        0.02%               0B / 0B             0.00%               0B / 0B             0B / 0B             0
Einzelheiten anzeigen lassen

Ähnlich wie bei Images lassen sich alle einzelnen Parameter eines Containers per docker inspect <container-ID/containername> (als json Output) anzeigen.

Um beispielsweise die IP-Adresse eines Containers herauszufinden kann grep verwenden:

$ docker inspect 7d82797195cb | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
aus einem Container ein Image erzeugen

Mit dem Befehl docker commit <CONTAINER ID/Containername> <Imagename> kann aus dem Container (<CONTAINER ID/Containername> direkt das Image (<Imagename>) erzeugt werden.
Der große Nachteil daran ist, dass dies nicht reproduzierbar ist.

Autor
Kategorien container, docker

PRTG Map