Inizierò ammettendo che sono abbastanza nuovo in Docker e potrei affrontare questo problema da una serie sbagliata di ipotesi ... fammi sapere se è così. Ho visto molte discussioni su come Docker sia utile per la distribuzione, ma nessun esempio di come è stato effettivamente fatto.
Ecco come pensavo che avrebbe funzionato:
- creare il contenitore dati per contenere alcuni dati persistenti sulla macchina A
- creare il contenitore dell'applicazione che utilizza i volumi dal contenitore dati
- fare un po 'di lavoro, potenzialmente cambiando i dati nel contenitore di dati
- arrestare il contenitore dell'applicazione
- commit e tag del contenitore dati
- spingere il contenitore di dati in un repository (privato)
- estrarre ed eseguire l'immagine dal passaggio 6 sulla macchina B
- riprendi da dove eri rimasto sulla macchina B
Il passaggio chiave qui è il passaggio 5, che pensavo avrebbe salvato lo stato corrente (compresi i contenuti del file system). È quindi possibile trasferire tale stato in un repository ed estrarlo da qualche altra parte, dandoti un nuovo contenitore che è essenzialmente identico all'originale.
Ma non sembra funzionare in questo modo. Quello che trovo è che il passaggio 5 non fa ciò che penso che faccia o il passaggio 7 (estrarre ed eseguire l'immagine) "ripristina" il contenitore al suo stato iniziale.
Ho messo insieme un insieme di tre immagini e contenitori Docker per testarlo: un contenitore di dati, uno scrittore che scrive una stringa casuale in un file nel contenitore di dati ogni 30 secondi e un lettore che semplicemente echo
indica il valore nei dati file contenitore ed esce.
Contenitore dati
Creato con
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
scrittore
Creato con
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
Questo script scrive una stringa casuale e la data / ora /datafolder/data.txt
nel contenitore dati.
Lettore
Creato con
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 "-----"
Quando creo ed eseguo questi contenitori, funzionano perfettamente e funzionano come mi aspetto:
Stop & Start sulla macchina di sviluppo:
- creare il contenitore di dati
- gestisci lo scrittore
- avvia subito il lettore, vedi "nessun dato qui!" Messaggio
- aspetta un attimo
- eseguire il lettore, vedere la stringa casuale
- fermare lo scrittore
- riavvia lo scrittore
- eseguire il lettore, vedere la stessa stringa casuale
Ma impegnarsi e spingere non fa ciò che mi aspetto:
- creare il contenitore di dati
- gestisci lo scrittore
- avvia subito il lettore, vedi "nessun dato qui!" Messaggio
- aspetta un attimo
- eseguire il lettore, vedere la stringa casuale
- fermare lo scrittore
- commit e tag con il contenitore dati
docker commit datatest_data myrepository:5000/datatest-data:latest
- spingere nel repository
- eliminare tutti i contenitori e ricrearli
A questo punto, mi aspetterei di eseguire il lettore e vedere la stessa stringa casuale, poiché il contenitore di dati è stato eseguito il commit, trasferito nel repository e quindi ricreato dalla stessa immagine nel repository. Tuttavia, quello che vedo effettivamente è il "nessun dato qui!" Messaggio.
Qualcuno può spiegare dove sto sbagliando qui? Oppure, in alternativa, mi indichi un esempio di come viene eseguita la distribuzione con Docker?