2015-02-18 8 views
22

Dies ist eine sehr grundlegende Frage, aber ich habe ein bisschen zu kämpfen und möchte sicherstellen, dass ich richtig verstehe.Behalten Docker-Container Dateiänderungen bei?

Nachdem ein Container aus einem Image gestartet wurde und einige Änderungen an Dateien vorgenommen wurden (z. B. einige Daten in der Datenbank einer WebApp, die auf dem Container ausgeführt wird), ist es sinnvoll, mit demselben Datum zwischen Containern zu arbeiten anhalten und neu starten?

Ist mein Verständnis korrekt, dass, sobald der Container gestoppt/beendet ist (d. H. Nach einer interaktiven Sitzung beenden), dieser Container zusammen mit allen Dateiänderungen verschwunden ist? Also, wenn ich einige Dateiänderungen behalten möchte, muss ich den Zustand des Containers in ein neues Bild/eine neue Version des Bildes festschreiben?

Danke, Julian

Antwort

37

Ist mein Verständnis richtig, dass, sobald der Behälter/Fertig gestoppt (d.h .: Ausfahrt nach einer interaktiven Sitzung), dann, dass Behälter zusammen mit allen Dateiänderungen weg ist?

Nein, ein Behälter bestehen bleibt, nachdem es beendet wird, wenn Sie es mit dem --rm Argument docker run gestartet. Bedenken Sie:

$ docker run -it busybox sh 
/# date > example_file 
/# exit 

Da wir exit unsere Schale ed, der Behälter nicht mehr ausgeführt wird:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 

Aber wenn wir die -a Option hatten, können wir es sehen:

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS     NAMES 
79aee3e2774e  busybox:latest  "sh"    About a minute ago Exited (0) 54 seconds ago       loving_fermat  

Und wir können es neu starten und erneut daran anschließen:

$ docker start 79aee3e2774e 
$ docker attach 79aee3e2774e 
<i press RETURN> 
/# 

Und die Datei, die wir zuvor erstellt haben ist immer noch da:

/ # cat example_file 
Wed Feb 18 01:51:38 UTC 2015 
/# 

Sie können die docker commit Befehl, um den Inhalt des Behälters in ein neues Bild zu speichern, die Sie dann neue Container starten können, oder teilen mit jemand anderem, etc. Beachten Sie jedoch, dass wenn Sie sich regelmäßig mit docker commit finden Sie wahrscheinlich selbst einen schlechten Dienst tun. Im Allgemeinen ist es übersichtlicher, Container als schreibgeschützt zu betrachten und neue Bilder mithilfe einer Dockerdatei und docker build zu generieren.

dieses Modell, Daten gehalten wird typischerweise außerhalb des Behälters, entweder durch Host-Datenträger Halterungen oder einen Nur-Daten-Container verwendet.

+0

* facepalm * Ich benutze --rm (!!!) - zu viel Google-Paste-Fehler. Ich wusste, dass es eine dumme Frage war. –

+1

In jedem Fall, vielen Dank für die gründliche Erklärung. Das ganze Modell macht mir jetzt viel mehr Sinn. Für meinen Fall verwende ich so viele Daten wie möglich außerhalb des Containers und mountete sie über Host-Volume-Mounts. Nur gelegentlich muss ich den Container ändern, um etwas zu installieren. Mit dieser Klarstellung kann ich nun einfach den Container lassen und ihn nur einmal auf ein neues Image übertragen, wenn es mit anderen Devs geteilt werden soll. Danke nochmal, tolle Antwort! –

+0

BTW, ich liebte den ironischen Tippfehler am Anfang: "... ein Container besteht weiter, nachdem er existiert ...". Klingt wie ein hartnäckiger Behälter. –

9

können Sie sehen fertige Behälter mit docker ps -a

können Sie einen fertigen Behälter speichern, mit dem Dateisystem verändert, in ein Bild mit docker commit container_name new_image_name

Sie können auch mit Datendateien aus dem fertigen Behälter extrahieren: docker cp containerID:/path/to/find/files /path/to/put/copy

Beachten Sie, dass Sie auch "vorausplanen" und vermeiden können, Daten, die Sie dauerhaft in einem temporären Container benötigen, zu fangen, indem Sie den Container ein Verzeichnis vom Host bereitstellen, z

docker run -v /dir/on/host:/dir/on/container -it ubuntu:14.04