Docker Tutorial [Teil 10 - Best Practices]

Datum

Container automatisch neu starten

Wenn man einen docker Container regulär z.B. per docker container run -d --name mein_nginx nginx startet, dann startet der Container, sollte er aus irgendeinem Grund gestoppt werden, nicht von selbst neu.

Das Verhalten, ob und wann ein docker Container wieder neu gestartet wird, regelt man mit der --restart Option.

Es gibt dafür folgende Parameter:
  • no —> der Container wird nie automatisch neu gestartet (Standardwert)
  • on-failure —> der Container wird im Fehlerfall neu gestartet (der Exit-Code darf nicht 0 sein)
  • always —> der Container wird immer neu gestartet sobald er durch irgendwas gestoppt wird
  • unless-stopped —> wenn der Container manuell gestoppt wurde erfolgt kein Neustart, auch nicht beim Neustart des docker Dienstes (anders ist es bei always)

Beispiel: docker container run -d --restart always --name mein_nginx nginx

Container Ressourcen prüfen

Um zu prüfen, welche Prozesse im Container gerade laufen kann man docker top <CONTAINER ID/Containername> anwenden:

$ docker top mein_nginx
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                8306                8289                1                   05:26               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 8344                8306                0                   05:26               ?                   00:00:00            nginx: worker process

Eine fortlaufende Anzeige der aktuellen Auslastung eines Containers erhält man mit docker stats <CONTAINER ID/Containername>

$ docker stats mein_nginx
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
f413316fa52c        mein_nginx          0.00%               1.363MiB / 3.699GiB   0.04%               446B / 0B           6.91MB / 0B         2

attach vs. exec

Um besser vergleichen zu können erstellen wir uns einen Container, welcher nur einen bash-Prozess ausführt.
docker run -d -it --name attach_exec_test centos bash

attach

Wie der Name schon vermuten lässt, „hängt“ man sich dabei quasi an den laufenden Prozess ran.

docker attach attach_exec_test
[root@d782f0cd6315 /]#

Ein top zeigt auch nur den einen laufenden Prozess an:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                   
    1 root      20   0   11820   1696   1424 S   0.0  0.0   0:00.04 bash     

Sobald man diese Shell aber per exit verlässt beendet sich auch der Container, da der einzige laufende Prozess. in welchen man hinein gesprungen ist, dadurch beendet wurde.

exec

Wenn man per docker exec -it attach_exec_test bash in den Container springt, so landet man nicht im bereits vorher laufenden bash Prozess sondern es wurde eine neue bash gestartet:

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
    1 root      20   0   11820   1696   1424 S   0.0  0.0   0:00.04 bash  
   33 root      20   0   11820   1892   1516 S   0.0  0.0   0:00.03 bash

„latest“ Tag

Wenn man die eigenen Images immer ordnungsgemäß mit einem entsprechenden Versionsstring taggt kann es passieren, dass man irgendwann nicht mehr erkennt welches von den vielen Versionen die neuste ist.

Darum sollte man nach dem Bau eines Images, dieses als latest taggen.
Dies geschieht per docker image tag <IMAGE:Tag> <IMAGE:Tag>

Beispiel:

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
mein_super_docker_image   0.1                 aea1daaee14d        16 seconds ago      24.6MB

docker image tag mein_super_docker_image:0.1 mein_super_docker_image:latest

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
mein_super_docker_image   0.1                 aea1daaee14d        51 seconds ago      24.6MB
mein_super_docker_image   latest              aea1daaee14d        51 seconds ago      24.6MB

docker Events

Dokumentation: docker events

docker Events bietet die Möglichkeit, mit Hilfe verschiedener Optionen, sich die Ereignisse bzgl. docker anzeigen zu lassen.

Beispiel: Auflistung der docker Events der letzten Stunde

$  docker system events --since '1h'                                                                                                                                                                             
2019-06-20T05:34:04.522154373Z image pull centos:latest (name=centos, org.label-schema.build-date=20190305, org.label-schema.license=GPLv2, org.label-schema.name=CentOS Base Image, org.label-schema.schema-version=1.0, org.label-schema.ven
dor=CentOS)                                                                                                                                                                                                                                   
2019-06-20T05:34:04.722741179Z container create 85b965866f7fd3054802b37c0e8d0e562b2f81222a06ca4f4461b2e7645e53d1 (image=sha256:9f38484d220fa527b1fb19747638497179500a1bed8bf0498eb788229229e6e1, name=vigorous_heisenberg, org.label-schema.bu
ild-date=20190305, org.label-schema.license=GPLv2, org.label-schema.name=CentOS Base Image, org.label-schema.schema-version=1.0, org.label-schema.vendor=CentOS) 
...

Oder um zu schauen welche Container innerhalb der letzten Stunde gestartet wurden:

$ docker system events --filter type=container --filter event=start --since '1h'
2019-06-20T05:36:51.186954713Z container start 0c544fb1fc49dd679d5becd17f568868bffb8bec76f3adfc26a3512752224c16 (image=centos, name=practical_elion, org.label-schema.build-date=20190305, org.label-schema.license=GPLv2, org.label-schema.name=CentOS Base Image, org.label-schema.schema-version=1.0, org.label-schema.vendor=CentOS)
2019-06-20T05:38:21.675681593Z container start 4e1cc5fd0a826b46a1522f42609173e10d41cde203f7089afc6ac004825ef659 (image=centos, name=compassionate_heisenberg, org.label-schema.build-date=20190305, org.label-schema.license=GPLv2, org.label-schema.name=CentOS Base Image, org.label-schema.schema-version=1.0, org.label-schema.vendor=CentOS)
...

Begrenzen der Container Ressourcen

Damit ein falsch laufender Prozess nicht auch das Host-System lahm legt sollte man die dem Container zugeteilten Ressourcen begrenzen.

Eine Übersicht über die möglichen Optionen und Parameter finden sich in der Dokumentation: Limit a container’s resources

Autor
Kategorien container, docker

PRTG Map