it-swarm.com.de

Ich verliere meine Daten, wenn der Container beendet wird

Trotz Dockers Interactive-Tutorial und faq verliere ich meine Daten, wenn der Container beendet wird.

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

Es verliert jedoch alle Daten, wenn es beendet wird.

[email protected]:~$ 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 


[email protected]:~$ Sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
[email protected]:~$ 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) ... 
[email protected]:~$ Sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
[email protected]:~$ Sudo docker run ubuntu touch /home/test
[email protected]:~$ Sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

Ich habe es auch mit interaktiven Sitzungen mit dem gleichen Ergebnis getestet. Habe ich etwas vergessen

BEARBEITEN: WICHTIG FÜR NEUE DOCKER-BENUTZER

Wie @ mohammed-noureldin und andere sagten, ist dies NICHT ein container, der beendet. Jedes Mal erstellt es einfach einen neuen Container.

319
iman

Sie müssen commit die Änderungen, die Sie am Container vornehmen, ausführen und dann ausführen. Versuche dies:

Sudo docker pull ubuntu

Sudo docker run ubuntu apt-get install -y ping

Dann rufen Sie die Container-ID mit folgendem Befehl ab:

Sudo docker ps -l

Übernehmen Sie Änderungen am Container:

Sudo docker commit <container_id> iman/ping 

Führen Sie dann den Container aus:

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

Das sollte funktionieren.

346
Unferth

Wenn Sie docker run zum Starten eines Containers verwenden, erstellt tatsächlich einen neuen Container basierend auf dem von Ihnen angegebenen Bild.

Beachten Sie neben den anderen nützlichen Antworten hier, dass Sie einen vorhandenen Container nach dem Beenden neu starten können und Ihre Änderungen immer noch vorhanden sind.

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
324
ZeissS

Es gibt folgende Möglichkeiten, Containerdaten zu speichern:

  1. Docker-Volumes

  2. Docker-Commit

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

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

    b) Installieren Sie die Curl im Terminal

       # apt-get update
       # apt-get install curl
    

    c) Verlassen Sie das Containerterminal

       # exit
    

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

       $ docker ps -a
    

    e) speichere den Container als neues Bild

       $ docker commit <container_id> new_image_name:tag_name(optional)
    

    f) Vergewissern Sie sich, dass 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
    
99

Zusätzlich zu Unferth's Antwort wird empfohlen, eine Dockerfile zu erstellen.

In einem leeren Verzeichnis erstellen Sie eine Datei mit dem Namen "Dockerfile" mit dem folgenden Inhalt.

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

Erstellen Sie ein Bild mithilfe der Docker-Datei. Verwenden wir ein Tag, damit wir uns nicht an die hexadezimale Bildnummer erinnern müssen.

$ docker build -t iman/ping .

Und dann Bild ausführen in einem Container.

$ docker run iman/ping stackoverflow.com
54
salathe

Möglicherweise möchten Sie Docker-Volumes überprüfen, wenn Sie die Daten in Ihrem Container beibehalten möchten. Besuchen Sie https://docs.docker.com/engine/tutorials/dockervolumes/ . Die Docker-Dokumentation ist ein sehr guter Anfang

8

Mein Vorschlag ist, Docker mit Docker-Compose zu verwalten. Es ist eine einfache Methode, alle Container des Dockers für Ihr Projekt zu verwalten. Sie können die Versionen zuordnen und verschiedene Container miteinander verknüpfen.

Die Dokumente sind sehr einfach zu verstehen und besser als die Dokumente des Dockers.

Docker-Compose-Dokumente

Beste

2
Cam T

Ich habe eine viel einfachere Antwort auf Ihre Frage. Führen Sie die folgenden zwei Befehle aus

Sudo docker run ubuntu
Sudo docker ps -a

der obige Befehl ps -a gibt eine Liste aller Container zurück. Nimm den Namen des Containers, der auf den Image-Namen verweist - "ubuntu". Docker-Auto generiert Namen für die Container, zum Beispiel - 'ubuntu-containername'

Sudo docker start ubuntu-containername

Sudo docker exec -ti ubuntu-containername bash

Mit diesem Befehl wird der angehaltene Container gestartet. Mit dem nächsten Befehl können Sie sich mit der Shell-Shell beim Container anmelden. Ab diesem Zeitpunkt werden alle Änderungen, die Sie im Container vornehmen, automatisch vom Docker gespeichert. Zum Beispiel - apt-get install curl innerhalb des ContainersSie können den Container ohne Probleme beenden. Andernfalls speichert das Andockfenster die Änderungen.

Bei der nächsten Verwendung müssen Sie diese beiden Befehle jedes Mal ausführen, wenn Sie mit diesem Container arbeiten möchten.

Sudo docker start ubuntu-containername
Sudo docker exec -ti ubuntu-containername bash
1
Magnus Melwin

Keine der Antworten spricht den Punkt dieser Entwurfswahl an. Ich denke, Docker funktioniert so, um diese 2 Fehler zu vermeiden:

  • Wiederholter Neustart
  • Teilfehler
0
Minh Nghĩa

eine brillante Antwort hier Wie man einen Docker fortsetzt, der verlassen wird von Benutzer kgs

docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)

docker exec -it <container-id> /bin/bash

Diese zweite Zeile ist entscheidend. Exec wird also anstelle von run verwendet und nicht für ein Image, sondern für eine Container-ID. Und Sie tun es, nachdem der Container gestartet wurde.

0
barlop

das ähnliche Problem (und Dockerfile allein konnte das Problem nicht beheben) brachte mich auf diese Seite.

stage 0: für alle, die hoffen, dass Dockerfile das Problem beheben könnte: bis --dns und --dns-search in der Dockerfile-Unterstützung erscheinen - es gibt keine Möglichkeit, intranetbasierte Ressourcen zu integrieren.

stage 1: nach dem Erstellen eines Images mit Dockerfile (übrigens ist es ein schwerwiegender Fehler, den sich Dockerfile im Ordner current befinden muss), das über ein Image verfügt, das auf Intranets basiert, indem ein Docker-Run-Skript ausgeführt wird . Beispiel: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ Sudo -u ${USERNAME} bash --norc"

stage 2: Anwenden des Docker-Run-Skripts im daemon-Modus, das lokale DNS-Datensätze bereitstellt, um die Möglichkeit zu haben, lokales Material herunterzuladen und bereitzustellen. 

wichtiger Punkt: Das Laufskript sollte mit etwas wie /usr/bin/Sudo -u ${USERNAME} bash --norc enden, damit der Container auch nach Abschluss der Installationsskripts weiter ausgeführt wird. 

no, es ist nicht möglich, den Container für die gesamte Automatisierungsaufgabe im interaktiven Modus auszuführen, da er in der internen Eingabeaufforderung verbleibt, bis CTRL-p CTRL-q gedrückt wird. 

no: Wenn am Ende des Installationsskripts keine interagierende Bash ausgeführt wird, wird der Container unmittelbar nach Abschluss der Skriptausführung beendet und alle Installationsergebnisse werden verloren.

Stufe 3: Container wird noch im Hintergrund ausgeführt, es ist jedoch unklar, ob Container die Installationsprozedur beendet hat oder noch nicht. Der folgende Block wird verwendet, um die Ausführung der Ausführungsprozedur zu bestimmen: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done Das Skript wird erst nach Abschluss der Installation fortgesetzt. Dies ist der richtige Zeitpunkt, um aufzurufen: commit, wobei die aktuelle Container-ID sowie der Name des Zielimages angegeben werden (dies kann derselbe sein wie in der Prozedur build/run, aber mit dem lokalen Installationszweck-Tag versehen Beispiel: docker commit containerID pack/bsp:toolchained. Sehen Sie sich diesen Link an, um zu erfahren, wie Sie die richtige containerID erhalten.

stage 4: Der Container wurde mit den lokalen Installationen aktualisiert sowie in ein neu zugewiesenes Image übertragen (das mit dem Zweck tags hinzugefügt wurde). Es ist jetzt sicher, den Containerlauf zu stoppen. Beispiel: docker stop packbsp-cont

stage5: Sobald der Container mit lokalen Installationen ausgeführt werden muss, starten Sie ihn mit dem zuvor gespeicherten Image Beispiel: docker run -d -t pack/bsp:toolchained

0
Oleg Kokorin