Trotz des interaktiven Tutorials und der FAQ von Docker verliere ich meine Daten, wenn der Container beendet wird.
Ich habe Docker wie hier beschrieben installiert: http://docs.docker.io/en/latest/installation/ubuntulinux ohne Probleme unter Ubuntu 13.04.
Beim Beenden gehen jedoch alle Daten verloren.
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 mit dem gleichen Ergebnis getestet. Habe ich etwas vergessen
EDIT: WICHTIG FÜR NEUE DOCKER-BENUTZER
Als @ mohammed-Noureldin und andere sagten, eigentlich ist das nicht ein verlass Behälter . Jedes Mal wird nur ein neuer Container erstellt.
Docker
. Ich würde vorschlagen, den Titel und die ursprüngliche Frage beizubehalten, da Anfänger definitiv nach so etwas suchen werden. Aber warum fügst du nicht etwas hinzu, das deine Missverständnisse zum Zeitpunkt des Schreibens des Beitrags beschreibt? Es wird helfen, die Dinge klar zu machen. Das ist unsere Kultur hier bei SO ... nicht wahr? :-)Antworten:
Sie müssen sich verpflichten , die Änderungen an dem Container zu machen und führen Sie es dann. Versuche dies:
Rufen Sie dann die Container-ID mit diesem Befehl ab:
Änderungen am Container festschreiben:
Führen Sie dann den Container aus:
Das sollte funktionieren.
quelle
<none>
. Wie füge ich das Commit weiterhin an ein vorhandenes Image an?Wenn Sie
docker run
einen Container starten, wird tatsächlich ein neuer Container basierend auf dem von Ihnen angegebenen Image erstellt.Beachten Sie neben den anderen nützlichen Antworten hier, dass Sie einen vorhandenen Container nach dem Beenden neu starten können und Ihre Änderungen noch vorhanden sind.
quelle
docker ps
zeigt an, dass nur Docker-Container ausgeführt werden.docker ps -a
zeigt Ihnen auch diejenigen, die beendet wurden - und die Sie weiterlaufen können. Ein Commit ist nur nach jedem Lauf erforderlich, wenn Sie dort einen Snapshot für die zukünftige Verwendung erstellen möchten. Andernfalls bleibt der Container selbst erhalten, damit Sie ihn weiterhin verwenden können.jenkins
Server-Docker herunterlade und ihn auf meinem CI-Host ausführe und einige meiner Jobs ausführt, schreibt der Jenkins-Server einige Protokolle auf die Festplatte. Wenn nun mein Server (der mein Docker gehostet hat) neu gestartet wird und ich meinen Jenkins-Docker erneut starte, würde dies bedeuten, dass ich alle Protokolldateien verloren habe? Wenn dem so ist, wie kann ichjenkins
Docker beispielsweise verwenden, um meine Jenkins-Installation auf CI zu vereinfachen?docker cp $(docker ps -alq):/path/to/file .
docker run -it --name my_debian debian
und danachdocker start my_debian && docker attach my_debian
)Es gibt folgende Möglichkeiten, Containerdaten beizubehalten:
Docker-Volumes
Docker-Commit
a) Erstellen Sie einen Container aus dem Ubuntu-Image und führen Sie ein Bash-Terminal aus.
b) Installieren Sie die Locke im Terminal
c) Verlassen Sie das Containerterminal
d) Notieren Sie sich Ihre Container-ID, indem Sie den folgenden Befehl ausführen:
e) Speichern Sie den Container als neues Bild
f) Vergewissern Sie sich, dass Sie Ihr neues Bild mit installierter Locke sehen können.
quelle
exit
vorherdocker commit
? Vielen Dank.docker run
Befehl führen Sie bash im Container aus und bleiben dort aufgrund der Optionen-i
und-t
(interaktiv mit TTY). Docker wird jedoch auf Ihrem Computer außerhalb des Containers ausgeführt. Nachdem Sie die erforderlichen Änderungen am Container von innen vorgenommen haben, müssen Sie die Shellexit
des Containers (oder Strg + D) verwenden, um zur Shell Ihres Systems zurückzukehren . Beachten Sie auch das#
und$
in der Antwort, die die verschiedenen Shells angeben, in die die Befehle geschrieben werden.docker stop
gefolgt vondocker start
.Zusätzlich zur Antwort von Unferth wird empfohlen, eine Docker-Datei zu erstellen .
Erstellen Sie in einem leeren Verzeichnis eine Datei mit dem Namen "Dockerfile" mit dem folgenden Inhalt.
Erstellen Sie ein Bild mit der Docker-Datei . Verwenden wir ein Tag, damit wir uns nicht die hexadezimale Bildnummer merken müssen.
Und dann das Bild läuft in einem Behälter.
quelle
Ich habe eine viel einfachere Antwort auf Ihre Frage. Führen Sie die folgenden zwei Befehle aus
Der obige Befehl ps -a gibt eine Liste aller Container zurück. Nehmen Sie den Namen des Containers, der auf den Bildnamen verweist - 'ubuntu'. Docker generiert automatisch Namen für die Container, z. B.
'lightlyxuyzx'
wenn Sie die Option --name nicht verwenden.Die Optionen -t und -d sind wichtig. Der erstellte Container wird getrennt und kann wie unten angegeben mit der Option -t erneut verbunden werden.
Mit der Option --name können Sie Ihren Container in meinem Fall 'mycontainername' benennen.
Mit diesem Befehl können Sie sich mit der Bash-Shell beim Container anmelden. Ab diesem Zeitpunkt werden alle Änderungen, die Sie am Container vornehmen, automatisch vom Docker gespeichert. Zum Beispiel -
apt-get install curl
innerhalb des Containers Sie können den Container ohne Probleme verlassen. Docker speichert die Änderungen automatisch.Bei der nächsten Verwendung müssen Sie diese beiden Befehle nur jedes Mal ausführen, wenn Sie mit diesem Container arbeiten möchten.
Dieser Befehl unten startet den gestoppten Container:
Ein weiteres Beispiel mit Ports und einem gemeinsam genutzten Speicherplatz:
In meinem Fall: 7efe2989e877 - ist die Image-ID eines vorherigen Containers, den ich mit erhalten habe
quelle
--name
Option und vor dendocker run --name mycontainername -t -d ubuntu /bin/bash
Möglicherweise möchten Sie Docker-Volumes anzeigen, 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
quelle
Mein Vorschlag ist, Docker mit Docker Compose zu verwalten. Ist eine einfache Möglichkeit, alle Docker-Container für Ihr Projekt zu verwalten. Sie können die Versionen zuordnen und verschiedene Container verknüpfen, um zusammenzuarbeiten.
Die Dokumente sind sehr einfach zu verstehen, besser als die Dokumente von Docker.
Docker-Compose Docs
Beste
quelle
Es gibt wirklich gute Antworten auf die gestellte Frage. Möglicherweise ist keine weitere Antwort erforderlich, dennoch möchte ich meine persönliche Meinung zu diesem Thema in möglichst einfachen Worten abgeben.
Hier sind einige Punkte zu Containern und Bildern, die uns zu einer Schlussfolgerung verhelfen:
Fazit :
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 [
docker ps --all
zum Abrufen der ID] verwendet wird .Alle Vorgänge wie das Erstellen eines neuen Verzeichnisses, das Erstellen von Dateien, das Installieren von Tools usw. können während der Ausführung im Container ausgeführt werden. Sobald der Container gestoppt ist, werden alle Änderungen beibehalten. Das Stoppen und Neustarten von Containern ist wie ein Neustart eines Computersystems.
Ein bereits erstellter Container ist immer für einen Neustart verfügbar. Wenn wir jedoch einen
docker run
Befehl ausgeben , wird ein neuer Container aus einem Image erstellt und ähnelt daher einem neuen Computersystem. Die im alten Container vorgenommenen Änderungen sind - wie wir jetzt verstehen können - in diesem neuen Container nicht verfügbar.Ein letzter Hinweis :
Ich denke, es ist jetzt offensichtlich, warum die Daten verloren zu sein scheinen, aber sie sind immer da. Aber in einem anderen [alten] Container. Beachten Sie also den Unterschied in
docker start
&docker run
command und lassen Sie sich nie verwirren.quelle
Das ähnliche Problem (und Dockerfile allein konnte es auf keinen Fall beheben) brachte mich auf diese Seite.
Stufe 0: In der Hoffnung, dass Dockerfile das Problem beheben kann: Bis --dns und --dns-search in der Dockerfile-Unterstützung angezeigt werden, gibt es keine Möglichkeit, intranetbasierte Ressourcen in zu integrieren.
Stufe 1: Nachdem Sie ein Image mit Dockerfile erstellt haben (übrigens ist es ein schwerwiegender Fehler , dass sich Dockerfile im aktuellen Ordner befindet), müssen Sie ein Image haben, um das Intranet-basierte bereitzustellen , indem Sie das Docker-Run-Skript ausführen. 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"
Stufe 2: Anwenden eines Docker-Ausführungsskripts im Dämonmodus , der lokale DNS-Datensätze bereitstellt, damit lokale Inhalte heruntergeladen und bereitgestellt werden können.
Wichtiger Punkt: Das Ausführungsskript sollte mit etwas enden
/usr/bin/sudo -u ${USERNAME} bash --norc
, das den Container auch nach Abschluss der Installationsskripte am Laufen hält.Nein , es ist nicht möglich, den Container für die gesamte Automatisierung im interaktiven Modus auszuführen, da er innerhalb der internen Eingabeaufforderung verbleibt, bis STRG-p STRG-q gedrückt wird.
Nein , wenn die interaktive Bash am Ende des Installationsskripts nicht ausgeführt wird, wird der Container sofort nach Abschluss der Skriptausführung beendet, wodurch alle Installationsergebnisse verloren gehen.
Stufe 3: Der Container wird noch im Hintergrund ausgeführt, es ist jedoch unklar, ob der Container den Installationsvorgang beendet hat oder nicht. Verwenden Sie den folgenden Block, um festzustellen, ob
while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done
die Ausführung abgeschlossen ist: Das Skript wird erst nach Abschluss der Installation fortgesetzt. und dies ist der richtige Zeitpunkt, um Folgendes aufzurufen: Festschreiben , wobei die aktuelle Container-ID sowie der Name des Zielabbilds angegeben werden (möglicherweise identisch mit der Build / Run- Prozedur, jedoch mit dem Tag für lokale Installationszwecke versehen. Beispiel :docker commit containerID pack/bsp:toolchained
. Siehe diesen Link unter wie man die richtige containerID bekommtStufe 4: Der Container wurde mit den lokalen Installationen aktualisiert und in ein neu zugewiesenes Image übertragen (das mit dem Zweck-Tag hinzugefügt wurde). Es ist jetzt sicher, den Containerlauf zu stoppen. Beispiel:
docker stop packbsp-cont
Stufe 5: Starten Sie den Container mit lokalen Installationen jederzeit mit dem zuvor gespeicherten Image. Beispiel:
docker run -d -t pack/bsp:toolchained
quelle
eine brillante Antwort hier Wie man einen Docker fortsetzt, der vom Benutzer kgs verlassen wird
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.
quelle
Keine der Antworten spricht den Punkt dieser Designauswahl an. Ich denke, Docker funktioniert auf diese Weise, um diese beiden Fehler zu vermeiden:
quelle