Mengapa mesin docker menghapus data saat restart?

9

Saya menggunakan Docker Toolbox di OSX.

Saya telah membuat wadah volume data untuk menyimpan data persisten: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Saya memeriksa bahwa data ini memang disimpan di boot2docker VM (dibuat oleh docker-machine) dan bukan pada wadah, sehingga akan tetap ada. Namun "docker-machine restart" menghapus data khusus ini pada vm.

Saya tidak dapat menemukan dokumentasi tentang apa yang terjadi. Saya menemukan satu posting forum yang menyebutkan bahwa data di / var / lib / docker akan disimpan, tetapi saya tidak dapat menemukan dokumen resmi yang menyatakan itu dan juga aneh karena panduan penyimpanan yang persisten di atas tidak menggunakan jalur ini atau bahkan menyebutkan bahwa data Anda akan dihapus.

Apakah ini diharapkan dan jika demikian, apakah ada dokumentasi resmi di jalur yang benar untuk menyimpan data persisten?


Sunting: Menambahkan contoh senario yang gagal

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory
Gerry
sumber

Jawaban:

8

Ini pasti bekerja:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Bisakah Anda menguraikan lebih lanjut tentang langkah-langkah untuk mereproduksi masalah Anda?

boot2docker memiliki sistem file read-only (akan terhapus saat reboot) dengan pengecualian:

  1. Kontainer dan data mereka (volume) - ini adalah apa yang Anda baca /var/lib/docker
  2. Gambar Docker
  3. Konfigurasi Docker (mis. Tempat /var/lib/boot2docker/profileflag daemon dapat di-tweak)
nathanleclaire
sumber
Hai, saya baru saja menyarankan edit untuk tanggapan Anda. Apakah Anda bermaksud menentukan gambar busybox di perintah jalankan ke-3 dan ke-4? Tanpa melakukan itu buruh pelabuhan mencoba mengunduh gambar yang disebut "sh" dan "cat" yang saya duga bukan yang Anda maksudkan. Saya akan menambahkan contoh gagal di atas.
Gerry
Terima kasih untuk bantuannya. Baik Anda dan @ mc0e membantu dengan yang ini, jadi saya telah memberi Anda tanda centang dan memberinya hadiah (serta +1 untuk keduanya). Saya harap Anda menganggap ini adil.
Gerry
1
Ah ya, salah ketik. Maaf atas kesalahan ketiknya.
nathanleclaire
Tidak perlu permintaan maaf. Aku hanya mengecek untuk memastikan aku tidak salah paham. Sorakan untuk semua bantuan Anda dengan ini.
Gerry
6

Saya tidak menggunakan boot2docker, tetapi jika / data terhapus saat reboot, disitulah volume Anda disimpan ( docker run -v /data:/var/lib/mysql), jadi itu akan hilang.

Apa yang Anda lakukan juga menggabungkan dua pola berbeda untuk menangani persistensi volume. Untuk mendapatkan kegigihan, kontainer dapat memasang volume dari lokasi yang ditentukan pada sistem host (yang dianggap persisten), atau kontainer tersebut dapat dikaitkan dengan wadah data, dan dipasang bersama --volumes-from. Kedengarannya seperti pendekatan sistem file host tidak sesuai untuk boot2docker, dan Anda harus menggunakan pola volume data (hanya).

Agaknya Anda harus membuat wadah data Anda dengan -v /var/lib/mysql, bukannya -v /data:/var/lib/mysql.

mc0e
sumber
Membuat volume menggunakan flag -v dan kemudian menggunakan volume dari wadah itu di wadah lain menggunakan --volumes-from persis seperti yang ditunjukkan oleh dokumentasi: docs.docker.com/userguide/dockervolumes/... Saya berharap jika -v / Lokasi tahu bahwa itu harus relatif ke / var / lib / docker / volume lalu menambahkan titik dua seharusnya tidak mengubah itu. Paling tidak ini tidak intuitif. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Sepertinya juga dokumen mysql-docker harus diperbarui: hub.docker.com/_/mysql/#caveats
Gerry
Terima kasih untuk bantuannya. Baik Anda dan @nathanleclaire membantu dengan ini, jadi saya telah memberi Anda hadiah (karena nilainya lebih) dan saya memberi centang pada nathanleclaire (serta +1 untuk keduanya). Saya harap Anda berpikir ini adil.
Gerry
@Gerry Tentu saja membuat volume dan kemudian menggunakannya melalui --volumes-from disarankan. Mounting yang fana / data pada wadah Anda tidak.
mc0e
Ya masalahnya adalah saya tidak tahu / data itu fana sampai saya restart.
Gerry
0

Perhatikan bahwa saya menggunakan buruh pelabuhan untuk mac beta yang menggunakan xhyve vm.

Isi / var / lib / boot2docker akan tetap ada di antara restart mesin. Jadi jika Anda ingin file-file tertentu tersedia di vm Anda, taruh di direktori ini.

Jika Anda ingin mereka dapat diakses di lokasi yang berbeda untuk menjalankan wadah buruh pelabuhan maka Anda dapat menambahkan yang berikut ke / var / lib / boot2docker / profil:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Jika Anda ingin menambahkan konfigurasi lain ke file sistem yang akan bertahan di antara vm restart seperti nilai tambahan dalam file host Anda, maka Anda dapat menambahkan perintah seperti di bawah ini ke / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Semoga ini bisa membantu

baoluofu
sumber