Bagaimana cara saya menggunakan wadah buruh pelabuhan dan wadah data terkait, termasuk konten?

18

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:

  1. buat wadah data untuk menampung beberapa data persisten pada mesin A
  2. buat wadah aplikasi yang menggunakan volume dari wadah data
  3. melakukan beberapa pekerjaan, berpotensi mengubah data dalam wadah data
  4. hentikan wadah aplikasi
  5. komit & beri tag pada wadah data
  6. dorong wadah data ke repositori (pribadi)
  7. tarik & jalankan gambar dari langkah 6 pada mesin B
  8. 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 echodengan 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.txtdalam 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:

  1. buat wadah data
  2. jalankan penulis
  3. segera jalankan pembaca, 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

Tetapi melakukan & mendorong tidak melakukan apa yang saya harapkan:

  1. buat wadah data
  2. jalankan penulis
  3. segera jalankan pembaca, lihat "tidak ada data di sini!" pesan
  4. Tunggu sebentar
  5. jalankan pembaca, lihat string acak
  6. hentikan penulis
  7. komit & beri tag pada 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 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?

Kryten
sumber

Jawaban:

22

Anda salah berasumsi tentang bagaimana volume bekerja di buruh pelabuhan. Saya akan mencoba menjelaskan bagaimana volume terkait dengan wadah buruh pelabuhan dan gambar buruh pelabuhan dan mudah-mudahan perbedaan antara volume data dan wadah volume data akan menjadi jelas.

Pertama mari kita ingat beberapa definisi

Gambar Docker

Gambar Docker pada dasarnya adalah sistem file gabungan + metadata. Anda dapat memeriksa konten filesystem files union union dengan docker exportperintah, dan Anda dapat memeriksa metadata gambar docker dengan docker inspectperintah.

Volume data

dari panduan pengguna Docker :

Volume data adalah direktori yang dirancang khusus dalam satu atau lebih kontainer yang memintas Sistem File Union untuk menyediakan beberapa fitur yang berguna untuk data yang persisten atau bersama.

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

Wadah volume data

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

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 dihentikan dan tetap memenuhi tujuannya. Jadi untuk membuat wadah data bernama datatest_datauntuk volume di /datafolderAnda hanya perlu menjalankan:

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

Ini baseadalah nama gambar (yang kecil) dan truemerupakan perintah yang kami berikan hanya untuk menghindari melihat daemon buruh pelabuhan mengeluh tentang perintah yang hilang. Pokoknya setelah Anda memiliki wadah yang berhenti dinamai datatest_datadengan tujuan tunggal yang memungkinkan Anda untuk mencapai volume itu dengan --volumes-fromopsi docker runperintah.

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 wadah yang ada untuk mengakses volume data itu, Anda bisa menjalankan wadah baru dengan --volumes-fromopsi untuk tujuan tunggal membaca data itu.

Contohnya:

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

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

Bekerja dengan volume (sejak Docker 1.9.0)

Cara membuat volume (sejak Docker 1.9.0)

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

docker volume create --name hello

Cara membaca dari volume (sejak Docker 1.9.0)

Katakanlah Anda membuat volume hellodengan nama docker volume create --name hello, Anda bisa memasangnya dalam wadah dengan -vopsi:

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

Tentang melakukan & mendorong wadah

Seharusnya sekarang menjadi jelas bahwa karena volume data bukan bagian dari wadah (sistem file gabungan), melakukan wadah untuk menghasilkan gambar buruh pelabuhan baru tidak akan bertahan pada data apa pun yang akan ada dalam volume data.

Membuat cadangan volume data

Panduan pengguna buruh pelabuhan memiliki artikel yang bagus tentang membuat cadangan volume data .


Artikel bagus volume reagarding: http://container42.com/2014/11/03/docker-indepth-volumes/

Thomasleveil
sumber
Tampaknya "Gambar yang digunakan untuk membuat wadah volume data tidak penting" tidak cukup benar. Coba saja dengan gambar "awal" yang akan memberi Anda "exec:" true ": file yang dapat dieksekusi tidak ditemukan"
tcurdt
Terlepas dari kesalahan ini, wadah Anda akan dibuat memenuhi perannya sebagai pemegang volume
Thomasleveil
1
Hm - mungkin layak membuka masalah untuk itu.
tcurdt
tidak, perilaku itu diharapkan karena gambar awal adalah gambar kosong yang tidak dapat memiliki /bin/truebiner (atau lainnya)
Thomasleveil
1
Hanya satu hal. Anda mengatakan bahwa "begitu wadah terakhir (berjalan atau berhenti) menggunakan volume data yang diberikan dihapus, buruh pelabuhan akan menghancurkan volume data itu dari / var / lib / docker / volume.", Tapi itu tidak benar-benar benar: lihat saja: docs.docker.com/userguide/dockervolumes (Volume data tetap ada bahkan jika wadah itu sendiri dihapus. Anda harus menentukan docker rm -vperintah terhadap wadah terakhir yang juga menghapus volume)
juanra
1

Anda juga bisa menggunakan wadah data buruh pelabuhan untuk menyebarkan kode

Saya tidak tahu apakah ini latihan 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 file
RUN echo "no data here!" > /data-image/data.txt

# expose the data folder 
#
VOLUME /datafolder

ENTRYPOINT cp -r /data-image/* /datafolder/

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

jmny
sumber
Inilah yang saya cari, tetapi jawaban yang diterima secara eksplisit menyebutkan ini tidak dapat dilakukan. Akan mencobanya sekarang.
andho
1
Pada pandangan kedua, jawaban yang diterima mengatakan volume (atau data di dalamnya) tidak akan dikomit, tetapi Anda dapat menambahkan data ke dalam wadah menggunakan COPYatau ADDdan membuat volume menggunakan VOLUMEdi Dockerfile.
andho