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.
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 wirdunless-stopped
—> wenn der Container manuell gestoppt wurde erfolgt kein Neustart, auch nicht beim Neustart des docker Dienstes (anders ist es beialways
)
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