Apa tujuan VOLUME di Dockerfile

106

Saya mencoba untuk lebih memahami pemahaman saya tentang volume Docker, dan saya mengalami kesulitan untuk mencari tahu perbedaan / kasus penggunaan:

  • The docker volume createperintah
  • Itu docker run -v /path:/host_path
  • The VOLUMEentri dalam Dockerfileberkas

Saya secara khusus tidak mengerti apa yang terjadi jika Anda menggabungkan VOLUMEentri dengan -vbendera.

radium226
sumber

Jawaban:

70

Volume adalah data persisten yang disimpan di /var/lib/docker/volumes/...

  • Anda bisa mendeklarasikannya di Dockerfile, yang berarti setiap kali container dimulai dari image, volumenya dibuat ( kosong ), bahkan jika Anda tidak memiliki -vopsi apa pun .

  • Anda dapat mendeklarasikannya saat runtime docker run -v [host-dir:]container-dir.
    menggabungkan dua ( VOLUME+ docker run -v) berarti Anda dapat memasang konten folder host ke volume Anda yang dipertahankan oleh kontainer di/var/lib/docker/volumes/...

  • volume buruh pelabuhan membuat membuat volume tanpa harus mendefinisikan Dockerfile dan membangun image dan menjalankan sebuah container. Ini digunakan untuk memungkinkan kontainer lain dengan cepat memasang volume tersebut.

Jika Anda telah mempertahankan beberapa konten dalam sebuah volume, tetapi sejak itu menghapus kontainer (yang secara default tidak menghapus volume yang terkait, kecuali Anda menggunakan docker rm -v), Anda dapat memasang kembali volume tersebut ke kontainer baru (mendeklarasikan volume yang sama).

Lihat " Docker - Bagaimana cara mengakses volume yang tidak terpasang ke wadah? ".
Dengan pembuatan volume buruh pelabuhan, ini mudah untuk memasang kembali volume bernama ke wadah.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
VonC
sumber
2
Katakanlah Anda menggunakan Dockerfiledengan VOLUMEdan -v /path:/host_path/bendera. Konten VOLUMEakan diganti dengan konten /host_path/?
radium226
Terima kasih kepada Anda @VonC, saya rasa saya mengerti :) Dan jika Anda melakukan docker volume create --name my_volumediikuti oleh a docker run --volume-from my_volume, bagaimana Anda tahu di mana mountpoint itu?
radium226
@ radium226 tidak ada titik pemasangan (artinya tidak ada yang dipasang dari host, di samping kosong / var / lib / buruh pelabuhan / volume asli). Jalur volume dalam metadata my_volume: stackoverflow.com/a/31997267/6309
VonC
Saya mengerti bahwa tidak ada mountpoint di sisi host. Tapi di dalam wadah yang sedang berjalan docker run ..., bagaimana saya bisa menulis ke dalam file yang disimpan pada my_volumevolume? Saya tidak tahu ... jalannya? dari volume di dalam container saya yang sedang berjalan karena saya tidak menentukan apa-apa? Saya harap saya cukup jelas, karena saya pasti tidak yakin dengan vokal saya: - /
radium226
1
@ radium226 the docker volume create --name anamemembuat volume bernama : Anda menetapkan jalur kontainer pada runtime:: docker run -v aname:/apathkontainer itu sekarang memiliki volume yang terpasang padanya, dipasang ke folder / apath-nya. Saya telah menulis ulang jawabannya untuk memperjelasnya.
VonC
11

VOLUMEinstruksi menjadi menarik ketika Anda menggabungkannya dengan volumes-fromparameter runtime.

Diberikan Dockerfile berikut:

FROM busybox
VOLUME /myvolume

Bangun gambar dengan:

docker build -t my-bb .

Dan putar wadah dengan:

docker run --rm -it --name my-first-bb my-bb

Hal pertama yang harus diperhatikan adalah Anda akan memiliki folder bernama gambar ini myvolume. Tapi ini tidak terlalu menarik karena ketika kita keluar dari wadah, volumenya juga akan ikut hilang.

Buat file kosong di folder ini, jadi jalankan perintah berikut di container:

cd myvolume
touch hello.txt

Sekarang putar wadah baru, tetapi berbagi volume yang sama dengan my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Anda akan melihat yang my-second-bbberisi file hello.txtdi myvolumefolder.

Setelah Anda keluar dari kedua wadah, volume Anda juga akan dihapus.

Koray Tugay
sumber
Volume akan dihapus karena ini adalah volume anonim DAN Anda memulai penampung dengan --rmopsi. Saya pikir mungkin berhasil menyebutkannya. Jika Anda tidak memulai penampung dengan --rm, Anda masih dapat menghapus penampung dan volume anonimnya dengan docker rm -v my-container.
AymDev