Ich beginne damit, dass ich zugeben muss, dass ich für Docker ziemlich neu bin, und mich diesem Problem möglicherweise aus den falschen Annahmen nähere. Lassen Sie mich wissen, ob dies der Fall ist. Ich habe viele Diskussionen darüber gesehen, wie Docker für die Bereitstellung nützlich ist, aber keine Beispiele dafür, wie dies tatsächlich getan wird.
Hier ist die Art, wie ich dachte, dass es funktionieren würde:
- Erstellen Sie den Datencontainer, der einige beständige Daten auf Computer A enthält
- Erstellen Sie den Anwendungscontainer, der Volumes aus dem Datencontainer verwendet
- Führen Sie einige Arbeiten aus und ändern Sie möglicherweise die Daten im Datencontainer
- Stoppen Sie den Anwendungscontainer
- Commit & Tag des Datencontainers
- Verschieben Sie den Datencontainer in ein (privates) Repository
- Ziehen Sie das Bild aus Schritt 6 auf Maschine B und führen Sie es aus
- heben Sie auf, wo Sie auf Maschine B aufgehört haben
Der Schlüsselschritt hier ist Schritt 5, von dem ich dachte, dass er den aktuellen Status (einschließlich des Inhalts des Dateisystems) speichert. Sie können diesen Status dann in ein Repository verschieben und von einem anderen Ort abrufen, sodass Sie einen neuen Container erhalten, der im Wesentlichen mit dem Original identisch ist.
Aber es scheint nicht so zu funktionieren. Was ich finde, ist, dass entweder Schritt 5 nicht das tut, was ich denke, oder Schritt 7 (Ziehen und Ausführen des Bildes) den Container auf seinen Ausgangszustand "zurücksetzt".
Ich habe drei Docker-Images und -Container zusammengestellt, um dies zu testen: einen Datencontainer, einen Writer, der alle 30 Sekunden eine zufällige Zeichenfolge in eine Datei im Datencontainer schreibt, und einen Reader, der einfach echo
den Wert in den Daten ermittelt Container-Datei und beendet.
Datencontainer
Hergestellt mit
docker run \
--name datatest_data \
-v /datafolder \
myrepository:5000/datatest-data:latest
Dockerfile:
FROM ubuntu:trusty
# make the data folder
#
RUN mkdir /datafolder
# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt
# expose the data folder
#
VOLUME /datafolder
Schriftsteller
Hergestellt mit
docker run \
--rm \
--name datatest_write \
--volumes-from datatest_data \
myrepository:5000/datatest-write:latest
Dockerfile:
FROM ubuntu:trusty
# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
do
sleep 30s
NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
echo "$NEW_STRING" >> /datafolder/data.txt
date >> /datafolder/data.txt
echo "wrote '$NEW_STRING' to file"
done
Dieses Skript schreibt eine zufällige Zeichenfolge und das Datum / die Uhrzeit /datafolder/data.txt
in den Datencontainer.
Leser
Hergestellt mit
docker run \
--rm \
--name datatest_read \
--volumes-from datatest_data \
myrepository:5000/datatest-read:latest
Dockerfile:
FROM ubuntu:trusty
# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
Wenn ich diese Container erstelle und ausführe, laufen sie einwandfrei und funktionieren so, wie ich es erwartet habe:
Stop & Start auf der Entwicklungsmaschine:
- Erstellen Sie den Datencontainer
- Führen Sie den Schriftsteller
- Den Reader sofort starten, siehe "Keine Daten hier!" Botschaft
- Warte eine Weile
- Führe den Reader aus, siehe die zufällige Zeichenfolge
- Stoppen Sie den Schriftsteller
- Starten Sie den Writer neu
- Führen Sie den Reader aus, und sehen Sie die gleiche zufällige Zeichenfolge
Aber Commitment & Pushing tun nicht das, was ich erwarte:
- Erstellen Sie den Datencontainer
- Führen Sie den Schriftsteller
- Den Reader sofort starten, siehe "Keine Daten hier!" Botschaft
- Warte eine Weile
- Führe den Reader aus, siehe die zufällige Zeichenfolge
- Stoppen Sie den Schriftsteller
- Commit & Tag des Datencontainers mit
docker commit datatest_data myrepository:5000/datatest-data:latest
- Push in das Repository
- Lösche alle Container und erstelle sie neu
An diesem Punkt würde ich erwarten, dass der Reader ausgeführt und dieselbe zufällige Zeichenfolge angezeigt wird, da der Datencontainer festgeschrieben, in das Repository verschoben und dann aus demselben Image im Repository neu erstellt wurde. Was ich jedoch tatsächlich sehe, ist das "keine Daten hier!" Botschaft.
Kann jemand erklären, wo ich hier falsch liege? Oder zeigen Sie mir alternativ ein Beispiel für die Bereitstellung mit Docker.
/bin/true
ohnehin keine Binärdatei (oder keine andere) enthalten kanndocker rm -v
Befehl für den letzten Container angeben, um auch ein Volume zu löschen.)Sie können auch einen Docker-Datencontainer zum Bereitstellen von Code verwenden
Ich weiß nicht, ob es eine gute Übung ist, aber ich mache es so:
Sie können jetzt Ihr Bild pushen und Volumes von usw. verwenden.
quelle
COPY
oder in den Container einfügenADD
und das Volume mitVOLUME
in der Docker-Datei erstellen.