Saya akan mulai dengan mengakui bahwa saya cukup baru di Docker dan saya mungkin mendekati masalah ini dari kumpulan asumsi yang salah... beritahu aku jika itu masalahnya. Saya telah melihat banyak diskusi tentang bagaimana Docker berguna untuk penerapan tetapi tidak ada contoh bagaimana hal itu benar-benar dilakukan.
Berikut adalah cara saya berpikir ini akan berhasil:
- buat wadah data untuk menyimpan beberapa data persisten pada mesin A
- buat wadah aplikasi yang menggunakan volume dari wadah data
- lakukan beberapa pekerjaan, berpotensi mengubah data dalam wadah data
- hentikan wadah aplikasi
- komit & amp; tag wadah data
- dorong wadah data ke repositori (pribadi)
- Tarik & amp; Jalankan gambar dari Langkah 6 pada mesin B
- mengambil mana Anda tinggalkan pada mesin B
Langkah kunci di sini adalah langkah 5, yang saya pikir akan menyimpan status saat ini (termasuk konten sistem file). Anda kemudian dapat mendorong status itu ke repositori & menariknya dari tempat lain, memberi Anda wadah baru yang pada dasarnya identik dengan aslinya.
Tapi sepertinya tidak bekerja seperti itu. Apa yang saya temukan adalah bahwa langkah 5 tidak melakukan apa yang saya pikirkan atau langkah 7 (menarik & menjalankan gambar) "Mengatur ulang" wadah ke keadaan awalnya.
Saya telah mengumpulkan satu set tiga gambar dan wadah buruh pelabuhan untuk menguji ini: wadah data, penulis yang menulis string acak ke dalam file dalam wadah data setiap 30 detik, dan pembaca yang hanya echo
es nilai dalam file kontainer data dan keluar.
Kontainer 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.shRUN chmod 755 /usr/local/sbin/*.shCMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bashwhile :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 untuk /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 scriptsADD run.sh /run.shRUN chmod 0777 /run.shCMD ["/run.sh"]
run.sh:
#!/bin/bashecho "reading..."echo "-----"cat /datafolder/data.txtecho "-----"
Ketika saya membangun & amp; menjalankan wadah ini, mereka berjalan dengan baik dan bekerja seperti yang saya harapkan:
Berhenti & amp; Mulai pada mesin pengembangan:
- membuat wadah data
- jalankan penulis
- jalankan pembaca segera, 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
Tapi melakukan & amp; mendorong tidak melakukan apa yang saya harapkan:
- membuat wadah data
- jalankan penulis
- jalankan pembaca segera, lihat " tidak ada data di sini!"pesan
- tunggu sebentar
- jalankan pembaca, Lihat string acak
- hentikan penulis
- komit & amp; tag 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 untuk menjalankan Pembaca & melihat string acak yang sama, karena wadah data telah dikomit, didorong ke repositori, dan kemudian dibuat ulang dari gambar yang sama di repositori. Namun, yang sebenarnya saya lihat adalah " tidak ada data di sini!"pesan.
Dapatkah seseorang menjelaskan di mana saya akan salah di sini? Atau, sebagai alternatif, arahkan saya ke contoh bagaimana penerapan dilakukan dengan Docker?