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.