Saya akan mulai dengan mengakui saya cukup baru untuk Docker dan saya mungkin mendekati masalah ini dari kumpulan asumsi yang salah ... beri tahu saya jika itu masalahnya. Saya telah melihat banyak diskusi tentang bagaimana Docker berguna untuk penyebaran tetapi tidak ada contoh bagaimana itu sebenarnya dilakukan.
Inilah cara saya pikir itu akan berhasil:
- buat wadah data untuk menampung beberapa data persisten pada mesin A
- buat wadah aplikasi yang menggunakan volume dari wadah data
- melakukan beberapa pekerjaan, berpotensi mengubah data dalam wadah data
- hentikan wadah aplikasi
- komit & beri tag pada wadah data
- dorong wadah data ke repositori (pribadi)
- tarik & jalankan gambar dari langkah 6 pada mesin B
- ambil di mana Anda tinggalkan di mesin B
Langkah kuncinya di sini adalah langkah 5, yang saya pikir akan menyelamatkan keadaan saat ini (termasuk isi dari sistem file). Anda kemudian bisa mendorong negara itu ke repositori & menariknya dari tempat lain, memberi Anda wadah baru yang pada dasarnya identik dengan aslinya.
Tapi sepertinya tidak berfungsi seperti itu. Apa yang saya temukan adalah bahwa baik langkah 5 tidak melakukan apa yang saya pikirkan atau langkah 7 (menarik & menjalankan gambar) "me-reset" wadah ke keadaan awal itu.
Saya telah mengumpulkan satu set tiga gambar Docker dan wadah untuk menguji ini: sebuah wadah data, seorang penulis yang menulis string acak ke dalam file dalam wadah data setiap 30 detik, dan seorang pembaca yang hanya echo
dengan nilai es dalam data file kontainer dan keluar.
Wadah data
Dibuat dengan
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
Penulis
Dibuat dengan
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
Script ini menulis string acak dan tanggal / waktu /datafolder/data.txt
dalam wadah data.
Pembaca
Dibuat dengan
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 "-----"
Ketika saya membangun & menjalankan kontainer ini, mereka berjalan dengan baik dan bekerja seperti yang saya harapkan:
Stop & Mulai pada mesin pengembangan:
- buat wadah data
- jalankan penulis
- segera jalankan pembaca, lihat "tidak ada data di sini!" pesan
- Tunggu sebentar
- jalankan pembaca, lihat string acak
- hentikan penulis
- mulai ulang penulis
- jalankan pembaca, lihat string acak yang sama
Tetapi melakukan & mendorong tidak melakukan apa yang saya harapkan:
- buat wadah data
- jalankan penulis
- segera jalankan pembaca, lihat "tidak ada data di sini!" pesan
- Tunggu sebentar
- jalankan pembaca, lihat string acak
- hentikan penulis
- komit & beri tag pada wadah data dengan
docker commit datatest_data myrepository:5000/datatest-data:latest
- dorong ke repositori
- hapus semua wadah & buat ulang
Pada titik ini, saya berharap menjalankan pembaca & melihat string acak yang sama, karena wadah data telah dikomit, didorong ke repositori, dan kemudian dibuat kembali dari gambar yang sama di repositori. Namun, yang sebenarnya saya lihat adalah "tidak ada data di sini!" pesan.
Adakah yang bisa menjelaskan kesalahan saya di sini? Atau, sebagai alternatif, tunjukkan saya pada contoh bagaimana penerapan dilakukan dengan Docker?
/bin/true
biner (atau lainnya)docker rm -v
perintah terhadap wadah terakhir yang juga menghapus volume)Anda juga bisa menggunakan wadah data buruh pelabuhan untuk menyebarkan kode
Saya tidak tahu apakah ini latihan yang baik, tetapi saya melakukannya seperti itu:
Anda sekarang dapat mendorong gambar Anda dan menggunakan volume-dari, dll ...
sumber
COPY
atauADD
dan membuat volume menggunakanVOLUME
di Dockerfile.