467 Stimmen

Ich verliere meine Daten, wenn der Container beendet wird.

Trotz des interaktiven Tutorials von Docker Interactive tutorial und faq verliere ich meine Daten, wenn der Container beendet wird.

Ich habe Docker installiert, wie hier beschrieben: http://docs.docker.io/en/latest/installation/ubuntulinux ohne Probleme auf Ubuntu 13.04.

Aber es verliert alle Daten beim Beenden.

iman@test:~$ sudo docker version
Client version: 0.6.4 
Go version (client): go1.1.2 
Git commit (client): 2f74b1c 
Server version: 0.6.4 
Git commit (server): 2f74b1c 
Go version (server): go1.1.2 
Last stable version: 0.6.4 

iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists... 
Building dependency tree... 
The following NEW packages will be installed: 
  iputils-ping 
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. 
Need to get 56.1 kB of archives. 
After this operation, 143 kB of additional disk space will be used. 
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB] 
debconf: delaying package configuration, since apt-utils is not installed 
Fetched 56.1 kB in 0s (195 kB/s) 
Selecting previously unselected package iputils-ping. 
(Reading database ... 7545 files and directories currently installed.) 
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... 
Setting up iputils-ping (3:20101006-1ubuntu1) ... 
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

Ich habe es auch mit interaktiven Sitzungen getestet, mit demselben Ergebnis. Habe ich etwas vergessen?

BEARBEITEN: WICHTIG FÜR NEUE DOCKER-BENUTZER

Wie @mohammed-noureldin und andere sagten, handelt es sich tatsächlich NICHT um einen Container-Austritt. Jedes Mal wird einfach ein neuer Container erstellt.

453voto

Unferth Punkte 4638

Sie müssen die Änderungen, die Sie am Container vornehmen, bestätigen und ihn dann ausführen. Versuchen Sie dies:

sudo docker pull ubuntu

sudo docker run ubuntu apt-get install -y ping

Holen Sie sich dann die Container-ID mit diesem Befehl:

sudo docker ps -l

Bestätigen Sie die Änderungen am Container:

sudo docker commit  iman/ping 

Führen Sie dann den Container aus:

sudo docker run iman/ping ping www.google.com

Dies sollte funktionieren.

431voto

ZeissS Punkte 11239

Wenn Sie docker run verwenden, um einen Container zu starten, erstellt es tatsächlich einen neuen Container basierend auf dem von Ihnen angegebenen Image.

Neben den anderen hier nützlichen Antworten beachten Sie, dass Sie einen vorhandenen Container neu starten können, nachdem er beendet wurde und Ihre Änderungen immer noch vorhanden sind.

docker start f357e2faab77 # Starten Sie ihn im Hintergrund neu
docker attach f357e2faab77 # Terminal wieder anschließen & stdin

154voto

kalyani chaudhari Punkte 6817

Es gibt folgende Möglichkeiten, Containerdaten dauerhaft zu speichern:

  1. Docker-Volumes

  2. Docker-Commit

    a) Erstellen Sie einen Container aus dem Ubuntu-Image und führen Sie ein Bash-Terminal aus.

       $ docker run -i -t ubuntu:14.04 /bin/bash

    b) Installieren Sie innerhalb des Terminals curl

       # apt-get update
       # apt-get install curl

    c) Beenden Sie das Container-Terminal

       # exit

    d) Notieren Sie sich die Container-ID, indem Sie den folgenden Befehl ausführen:

       $ docker ps -a

    e) Speichern Sie den Container als neues Image

       $ docker commit  new_image_name:tag_name(optional)

    f) Überprüfen Sie, ob Sie Ihr neues Image mit installiertem curl sehen können.

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl

62voto

salathe Punkte 49834

Zusätzlich zu Unferths Antwort wird empfohlen, ein Dockerfile zu erstellen.

In einem leeren Verzeichnis erstelle eine Datei namens "Dockerfile" mit folgendem Inhalt.

FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]

Erstelle ein Image mithilfe des Dockerfiles. Verwenden wir einen Tag, sodass wir uns nicht an die hexadezimale Bildnummer erinnern müssen.

$ docker build -t iman/ping .

Und dann führe das Image in einem Container aus.

$ docker run iman/ping stackoverflow.com

20voto

bluelights Punkte 1106

Es gibt wirklich großartige Antworten oben auf die gestellte Frage. Es könnte kein Bedarf für eine weitere Antwort bestehen, aber trotzdem möchte ich meine persönliche Meinung zu dem Thema in möglichst einfachen Worten abgeben.

Hier sind einige Punkte zu Containern & Images, die uns zu einem Schluss führen werden:

  • Ein Docker-Image kann sein:
    1. aus einem gegebenen Container erstellt werden
    2. gelöscht werden
    3. verwendet werden, um beliebig viele Container zu erstellen
  • Ein Docker-Container kann sein:
    1. aus einem Image erstellt werden
    2. gestartet werden
    3. gestoppt werden
    4. neugestartet werden
    5. gelöscht werden
    6. verwendet werden, um beliebig viele Images zu erstellen
  • Ein Docker-Befehl führt dies aus:
    1. Lädt ein Image herunter oder verwendet ein zwischengespeichertes Image
    2. Erstellt daraus einen neuen Container
    3. Startet den Container
  • Wenn ein Dockerfile verwendet wird, um ein Image zu erstellen:
    1. Es ist bereits bekannt, dass das Image letztendlich verwendet wird, um einen Docker-Container auszuführen.
    2. Nach dem Ausführen des Docker-Build-Befehls erstellt Docker im Hintergrund einen laufenden Container mit einem Basissystem und folgt den im Dockerfile festgelegten Schritten, um diesen Container entsprechend den Anforderungen der Entwickler zu konfigurieren.
    3. Nachdem der Container mit den Spezifikationen des Dockerfiles konfiguriert ist, wird er als Image committet.
    4. Das Image ist bereit für den Einsatz!

Schlussfolgerung:

Wie wir sehen können, ist ein Docker-Container unabhängig von einem Docker-Image.

Ein Container kann neu gestartet werden, sofern die eindeutige ID dieses Containers vorhanden ist [verwenden Sie docker ps --all, um die ID zu erhalten].

Jede Operation wie das Erstellen eines neuen Verzeichnisses, das Erstellen von Dateien, das Installieren von Tools usw. kann innerhalb des Containers durchgeführt werden, wenn dieser läuft. Sobald der Container gestoppt ist, behält er alle Änderungen bei. Das Stoppen und Neustarten des Containers ist wie das Neustarten eines Computersystems.

Ein bereits erstellter Container ist immer verfügbar für ein Neustarten, aber wenn wir den docker run-Befehl ausführen, wird ein neuer Container aus einem Image erstellt und daher ist es wie ein neues Computersystem. Die Änderungen, die im alten Container vorgenommen wurden - wie wir jetzt verstehen können - sind in diesem neuen Container nicht verfügbar.

Eine abschließende Anmerkung:

Ich denke, jetzt ist offensichtlich, warum die Daten verloren zu sein scheinen, obwohl sie immer noch vorhanden sind.. aber in einem anderen [alten] Container. Beachten Sie also den Unterschied zwischen dem docker start- und docker run-Befehl und kommen Sie nie durcheinander.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X