Bei der Verwendung von Docker beginnen wir mit einem Basis-Image. Wir booten es, erstellen Änderungen und diese Änderungen werden in Schichten gespeichert, die ein weiteres Image bilden.
So habe ich schließlich ein Image für meine PostgreSQL-Instanz und ein Image für meine Webanwendung, deren Änderungen weiterhin gespeichert werden.
Was ist ein Container?
Eine Instanz eines Bildes wird als Container bezeichnet. Sie haben ein Abbild, das, wie Sie beschreiben, aus einer Reihe von Schichten besteht. Wenn Sie dieses Abbild starten, haben Sie einen laufenden Container dieses Abbilds. Sie können viele laufende Container desselben Images haben.
Sie können alle Ihre Images mit docker images
sehen, während Sie Ihre laufenden Container mit docker ps
sehen können (und Sie können alle Container mit docker ps -a
sehen).
Eine laufende Instanz eines Images ist also ein Container.
Aus meinem Artikel über Automatisierte Docker-Bereitstellungen:
In Dockerland gibt es Images und es gibt Container. Die beiden sind eng miteinander verwandt, aber dennoch unterschiedlich. Für mich hat das Erfassen dieser Dichotomie Docker immens verdeutlicht.
Ein Image ist eine inerte, unveränderliche Datei, die im Wesentlichen einen Schnappschuss eines Containers darstellt. Images werden mit dem Befehl build erstellt und erzeugen einen Container, wenn sie mit run gestartet werden. Images werden in einer Docker-Registry wie registry.hub.docker.com gespeichert. Da sie recht groß werden können, sind Images so konzipiert, dass sie aus mehreren Schichten anderer Images bestehen, so dass bei der Übertragung von Images über das Netzwerk nur eine minimale Datenmenge übertragen werden muss.
Lokale Images können durch Ausführen von docker images
aufgelistet werden:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Einige Dinge zu beachten:
-t
-Flagge des docker build
-Befehls oder vom docker tag
-ing eines bestehenden Images. Es steht Ihnen frei, Images mit einer Nomenklatur zu taggen, die für Sie sinnvoll ist, aber Sie sollten wissen, dass Docker das Tag als Registrierungsort in einem docker push
oder docker pull
verwenden wird.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Für ubuntu
oben, wird REGISTRYHOST als registry.hub.docker.com
abgeleitet. Wenn Sie also vorhaben, Ihr Image mit dem Namen my-application
in einer Registry unter docker.example.com
zu speichern, sollten Sie dieses Image mit dem Tag docker.example.com/my-application
versehen.latest
Tag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.<none>
TAG und REPOSITORY. Es ist leicht, sie zu vergessen.Weitere Informationen über Images finden Sie in der Docker-Dokumentation und im Glossar.
Um eine Programmiermetapher zu verwenden: Wenn ein Image eine Klasse ist, dann ist ein Container eine Instanz einer Klasse - ein Laufzeitobjekt. Container sind hoffentlich der Grund, warum Sie Docker verwenden: Sie sind leichtgewichtige und portable Kapselungen einer Umgebung, in der Anwendungen ausgeführt werden können.
Mit docker ps
können Sie lokal laufende Container anzeigen:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Hier führe ich eine gedockte Version der Docker-Registry aus, so dass ich einen privaten Ort zum Speichern meiner Images habe. Wiederum sind einige Dinge zu beachten:
docker ps
gibt nur laufende Container aus. Sie können alle Container (laufend oder gestoppt) mit docker ps -a
anzeigen.--name
Flag zu identifizieren.Eine meiner ersten Frustrationen mit Docker war die scheinbar ständige Anhäufung von unmarkierten Images und gestoppten Containern. Bei einer Handvoll Gelegenheiten führte diese Anhäufung zu überlasteten Festplatten, die meinen Laptop verlangsamten oder meine automatische Build-Pipeline zum Stillstand brachten. Wir sprechen von "Containern überall"!
Wir können alle ungetaggten Images entfernen, indem wir docker rmi
mit der neuen dangling=true
-Abfrage kombinieren:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker ist nicht in der Lage, Bilder zu entfernen, die sich hinter vorhandenen Containern befinden. Daher müssen Sie gestoppte Container möglicherweise zuerst mit docker rm
entfernen:
docker rm `docker ps --no-trunc -aq`
Dies sind bekannte Probleme mit Docker und werden möglicherweise in zukünftigen Versionen behoben. Mit einem klaren Verständnis von Images und Containern lassen sich diese Situationen jedoch mit ein paar Praktiken vermeiden:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Obwohl es am einfachsten ist, sich einen Container als ein laufendes Image vorzustellen, ist dies nicht ganz richtig.
Ein Image ist eigentlich eine Vorlage, die in einen Container verwandelt werden kann. Um ein Image in einen Container zu verwandeln, nimmt die Docker-Engine das Image, fügt ein Dateisystem mit Lese- und Schreibzugriff hinzu und initialisiert verschiedene Einstellungen wie Netzwerkports, Containername, ID und Ressourcenbeschränkungen. Ein laufender Container hat einen aktuell ausgeführten Prozess, aber ein Container kann auch gestoppt werden (oder beendet in der Docker-Terminologie). Ein beendeter Container ist nicht dasselbe wie ein Image, da er neu gestartet werden kann und seine Einstellungen sowie alle Änderungen am Dateisystem beibehält.