Bagaimana cara menerapkan wadah docker dan wadah data terkait, termasuk konten?

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:

  1. buat wadah data untuk menyimpan beberapa data persisten pada mesin A
  2. buat wadah aplikasi yang menggunakan volume dari wadah data
  3. lakukan beberapa pekerjaan, berpotensi mengubah data dalam wadah data
  4. hentikan wadah aplikasi
  5. komit & amp; tag wadah data
  6. dorong wadah data ke repositori (pribadi)
  7. Tarik & amp; Jalankan gambar dari Langkah 6 pada mesin B
  8. 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 echoes 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:

  1. membuat wadah data
  2. jalankan penulis
  3. jalankan pembaca segera, lihat " tidak ada data di sini!"pesan
  4. tunggu sebentar
  5. jalankan pembaca, Lihat string acak
  6. hentikan penulis
  7. mulai ulang penulis
  8. jalankan pembaca, Lihat string acak yang sama

Tapi melakukan & amp; mendorong tidak melakukan apa yang saya harapkan:

  1. membuat wadah data
  2. jalankan penulis
  3. jalankan pembaca segera, lihat " tidak ada data di sini!"pesan
  4. tunggu sebentar
  5. jalankan pembaca, Lihat string acak
  6. hentikan penulis
  7. komit & amp; tag wadah data dengan docker commit datatest_data myrepository:5000/datatest-data:latest
  8. dorong ke repositori
  9. 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?

Anda mendapat asumsi yang salah tentang cara kerja volume di docker. Saya akan mencoba menjelaskan bagaimana volume berhubungan dengan wadah buruh pelabuhan dan gambar buruh pelabuhan dan semoga perbedaan antara volume data dan kontainer volume data akan menjadi jelas.

Pertama mari kita ingat beberapa definisi

Docker images

Gambar Docker pada dasarnya adalah sistem file gabungan + metadata. Anda dapat memeriksa isi dari docker image Union filesystem dengan docker export perintah, dan Anda dapat memeriksa metadata gambar docker dengan docker inspect perintah.

Volume Data

dari Panduan pengguna Docker:

Volume data adalah direktori yang ditunjuk secara khusus dalam satu atau lebih kontainer yang melewati sistem file Union untuk menyediakan beberapa fitur berguna untuk data persisten atau bersama.

Penting untuk dicatat di sini bahwa volume tertentu (sebagai direktori atau file yang berisi data) hanya dapat digunakan kembali jika ada setidaknya satu wadah docker yang menggunakannya. Gambar Docker tidak memiliki volume, mereka hanya memiliki metadata yang akhirnya memberi tahu di mana volume akan dipasang pada sistem file union. Volume Data bukan bagian dari sistem file docker containers union, jadi di mana mereka? di bawah /var/lib/docker/volumes pada Host docker (sementara kontainer disimpan di bawah /var/lib/docker/containers).

Kontainer volume Data

Jenis wadah khusus itu tidak ada yang istimewa. Mereka hanya menghentikan wadah menggunakan volume data dengan tujuan tunggal dan unik memiliki setidaknya satu wadah menggunakan volume data tersebut. Ingat, segera setelah wadah terakhir (berjalan atau berhenti) menggunakan volume data yang diberikan dihapus, volume itu akan menjadi tidak terjangkau melalui docker run --volumes-from opsi.

Bekerja dengan wadah volume data

Cara membuat wadah volume data

Gambar yang digunakan untuk membuat wadah volume data tidak penting karena wadah seperti itu dapat tetap berhenti dan masih memenuhi tujuannya. Jadi untuk membuat sebuah wadah data bernama datatest_data untuk volume dalam /datafolder Anda hanya perlu menjalankan:

docker run --name datatest_data --volume /datafolder busybox true

Di sini base adalah nama gambar (yang nyaman kecil) dan true adalah perintah yang kami berikan hanya untuk menghindari melihat daemon buruh pelabuhan mengeluh tentang perintah yang hilang. Pokoknya setelah Anda memiliki wadah berhenti bernama datatest_data dengan tujuan tunggal yang memungkinkan Anda untuk mencapai volume yang dengan --volumes-from opsi dari docker run perintah.

Cara membaca dari wadah volume data

Saya tahu dua cara membaca volume data: yang pertama adalah melalui wadah. Jika Anda tidak dapat memiliki shell ke dalam wadah yang ada untuk mengakses volume data tersebut, Anda dapat menjalankan wadah baru dengan --volumes-from pilihan untuk tujuan tunggal membaca data tersebut.

Misalnya:

docker run --rm --volumes-from datatest_data busybox cat /datafolder/data.txt

Cara lain adalah dengan menyalin volume dari /var/lib/docker/volumes folder. Anda dapat menemukan nama volume di folder itu dengan memeriksa metadata salah satu wadah menggunakan volume. Lihat jawaban ini untuk rincian.

Bekerja dengan volume (sejak Docker 1.9.0)

Cara membuat volume (sejak Docker 1.9.0)

Docker 1.9.0 memperkenalkan perintah baru docker volume yang memungkinkan untuk membuat volume :

docker volume create --name hello

Cara membaca dari volume (sejak Docker 1.9.0)

Katakanlah Anda membuat volume bernama hello dengan docker volume create --name hello, Anda dapat memasangnya dalam wadah dengan -v opsi :

docker run -v hello:/data busybox ls /data

Tentang melakukan & amp; mendorong kontainer

Sekarang harus jelas bahwa karena volume data bukan bagian dari wadah (sistem file union), melakukan wadah untuk menghasilkan gambar buruh pelabuhan baru tidak akan menyimpan data apa pun yang akan ada dalam volume data.

Membuat backup volume data

Panduan pengguna docker memiliki artikel bagus tentang membuat backup volume data.


Baik artikel reagarding volume: http://container42.com/2014/11/03/docker-indepth-volumes/

Anda juga dapat menggunakan wadah data buruh pelabuhan untuk menyebarkan kode

Saya tidak tahu apakah itu praktik yang baik, tetapi saya melakukannya seperti itu :

FROM ubuntu:trusty# make the data folder#RUN mkdir /data-image# in my case, I have a # ADD dest.tar /data-image/## but to follow your example :# write something to the data fileRUN echo "no data here!" > /data-image/data.txt# expose the data folder #VOLUME /datafolderENTRYPOINT cp -r /data-image/* /datafolder/

Anda sekarang dapat mendorong gambar Anda dan menggunakan volume-dari , dll...