Warum löscht Docker-Maschine beim Neustart Daten?

9

Ich verwende Docker Toolbox unter OSX.

Ich habe einen Datenvolumencontainer zum Speichern persistenter Daten erstellt: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Ich habe überprüft, ob diese Daten tatsächlich auf der boot2docker-VM (erstellt von der Docker-Maschine) und nicht auf dem Container gespeichert sind, damit sie bestehen bleiben. "Docker-Computer-Neustart" löscht jedoch diese benutzerdefinierten Daten auf der VM.

Ich kann keine Dokumentation darüber finden, was passiert. Ich habe einen Forumsbeitrag gefunden, in dem erwähnt wird, dass Daten in / var / lib / docker erhalten bleiben, aber ich konnte keine offiziellen Dokumente finden, die dies angeben, und es scheint auch seltsam, wenn man bedenkt, dass der obige Leitfaden für persistenten Speicher diesen Pfad nicht verwendet oder dies sogar erwähnt Ihre Daten werden gelöscht.

Wird dies erwartet und wenn ja, gibt es eine offizielle Dokumentation zum richtigen Pfad zum Speichern persistenter Daten?


Bearbeiten: Hinzufügen eines Beispiels für ein fehlgeschlagenes Szenario

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory
Gerry
quelle

Antworten:

8

Das sollte auf jeden Fall funktionieren:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Können Sie die Schritte zur Reproduktion Ihres Problems näher erläutern?

boot2docker verfügt über ein schreibgeschütztes Dateisystem (wird beim Neustart gelöscht) mit Ausnahme von:

  1. Container und ihre Daten (Volumes) - darüber lesen Sie /var/lib/docker
  2. Docker-Bilder
  3. Docker-Konfiguration (z. B. /var/lib/boot2docker/profilewo die Daemon-Flags angepasst werden können)
Nathanleclaire
quelle
Hallo, ich habe gerade eine Bearbeitung Ihrer Antwort vorgeschlagen. Wollten Sie das Busybox-Image in den Befehlen für den 2., 3. und 4. Lauf angeben? Ohne dies zu tun, versucht Docker, Bilder mit den Namen "sh" und "cat" herunterzuladen, von denen ich vermute, dass sie nicht Ihren Absichten entsprechen. Ich werde oben ein fehlerhaftes Beispiel hinzufügen.
Gerry
Danke für deine Hilfe. Sowohl du als auch @ mc0e haben bei diesem geholfen, also habe ich dir das Häkchen und ihm das Kopfgeld gegeben (sowie eine +1 für beide). Ich hoffe, Sie betrachten diese Messe.
Gerry
1
Ah ja, falsch geschrieben. Entschuldigung für den Tippfehler.
Nathanleclaire
Keine Entschuldigung nötig. Ich habe nur noch einmal nachgesehen, um sicherzugehen, dass ich nichts falsch verstanden habe. Prost für all deine Hilfe dabei.
Gerry
6

Ich verwende boot2docker nicht, aber wenn / data beim Neustart gelöscht wird, wird dort Ihr Volume gespeichert ( docker run -v /data:/var/lib/mysql), sodass es verloren geht.

Sie kombinieren außerdem zwei verschiedene Muster für die Behandlung der Volumenpersistenz. Um die Persistenz zu erhalten, können Container Volumes von einem bestimmten Speicherort auf dem Hostsystem bereitstellen (von dem angenommen wird, dass sie persistent sind), oder sie können einem Datencontainer zugeordnet und mit bereitgestellt werden --volumes-from. Es klingt so, als ob der Ansatz des Host-Dateisystems nicht für boot2docker geeignet ist, und Sie sollten (nur) das Datenvolumenmuster verwenden.

Vermutlich sollten Sie Ihren Datencontainer -v /var/lib/mysqleher mit als erstellen -v /data:/var/lib/mysql.

mc0e
quelle
Das Erstellen eines Volumes mit dem Flag -v und das anschließende Verwenden von Volumes aus diesem Container in anderen Containern mit --volumes-from ist genau das, was in der Dokumentation gezeigt wird: docs.docker.com/userguide/dockervolumes/… Ich würde das erwarten, wenn -v / location weiß, dass es relativ zu / var / lib / docker / volume sein sollte, dann sollte das Hinzufügen eines Doppelpunkts dies nicht ändern. Zumindest ist dies nicht intuitiv. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Es scheint auch, dass die mysql- docker
Gerry
Danke für deine Hilfe. Sowohl du als auch @nathanleclaire haben bei diesem geholfen, also habe ich dir das Kopfgeld gegeben (da es mehr wert ist) und ich habe Nathanleclaire das Häkchen gegeben (sowie eine +1 für beide). Ich hoffe du denkst das ist fair.
Gerry
@Gerry Es wird empfohlen, ein Volume zu erstellen und es dann über --volumes-from zu verwenden. Das Einhängen der kurzlebigen Daten in Ihren Container ist nicht möglich.
mc0e
Ja, das Problem ist, dass ich nicht wusste, dass die Daten kurzlebig waren, bis ich neu gestartet habe.
Gerry
0

Beachten Sie, dass ich Docker für Mac Beta verwende, das xhyve vm verwendet.

Der Inhalt von / var / lib / boot2docker bleibt zwischen den Neustarts des Computers erhalten. Wenn Sie also möchten, dass bestimmte Dateien auf Ihrem VM verfügbar sind, legen Sie sie in diesem Verzeichnis ab.

Wenn Sie möchten, dass auf sie an einem anderen Speicherort zugegriffen werden kann, um Docker-Container auszuführen, können Sie / var / lib / boot2docker / profile Folgendes hinzufügen:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Wenn Sie Systemdateien eine andere Konfiguration hinzufügen möchten, die zwischen VM-Neustarts bestehen bleibt, z. B. zusätzliche Werte in Ihrer Hosts-Datei, können Sie / var / lib / boot2docker / profile einen Befehl wie den folgenden hinzufügen:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Ich hoffe es hilft

baoluofu
quelle