Volume Docker vs Bind Mount: Mempertahankan Data Kontainer dengan Benar
Hapus wadah dan datanya akan ikut serta, kecuali Anda menyimpannya di tempat yang lebih aman. Pelajari perbedaan antara volume, bind mount, dan tmpfs, kapan menggunakan masing-masing volume, dan cara mencadangkan hal yang penting.
- Lapisan wadah yang dapat ditulis akan dihapus bersama dengan wadah tersebut, sehingga data penting perlu dipasang.
- Volume bernama dikelola oleh Docker, dan merupakan pilihan umum untuk database dan data produksi.
- Bind mounts memetakan folder host, sehingga ideal untuk kode langsung selama pengembangan.
docker compose down -vmenghapus volume, jadi gunakan dengan hati-hati, dan simpan cadangan yang teruji.
Anda memulai database dalam sebuah wadah, menambahkan beberapa data, menghapus wadah dan memulai yang baru. Datanya hilang. Hampir semua orang mempelajari pelajaran ini dengan cara yang sulit. Volume Docker dan pengikatan pengikat ada untuk menjaga data tetap hidup melebihi masa pakai satu container.
Panduan ini menjelaskan cara kerja masing-masing dan cara memilih. Perintah dan file di sini adalah contoh standar, berdasarkan perilaku Docker yang terdokumentasi, dan kami tidak menjalankannya untuk artikel ini, jadi cobalah terlebih dahulu pada data yang dapat dibuang. Detailnya dapat berbeda antara versi Docker dan Docker Desktop. Jika Anda baru mengenal container, mulailah dengan Tutorial Docker untuk pemula kami.
Mengapa data kontainer hilang
Gambar Docker terbuat dari lapisan hanya-baca. Saat sebuah container dimulai, Docker menambahkan lapisan tipis yang dapat ditulisi di atasnya, dan perubahan apa pun akan terjadi di sana. Lapisan tersebut bertahan jika dihentikan dan dimulai ulang, namun akan dihapus saat penampung dihapus.
docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# ... create tables and add data ...
docker rm -f db
docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# The data you added is not there
Ini memang disengaja, karena memungkinkan Anda mengganti wadah dengan bebas. Artinya, apa pun yang perlu Anda simpan harus berada di luar wadahnya. Ada tiga cara untuk melakukannya:
| Ketik | Disimpan di | Bertahan dari penghapusan kontainer? |
|---|---|---|
| Volume bernama | Area yang dikelola oleh Docker | Ya |
| Mengikat gunung | Jalur host yang Anda pilih | Ya |
| pemasangan tmpfs | Memori tuan rumah | Tidak |
Volume Docker vs pengikatan pengikatan berdampingan
| Aspek | Volume bernama | Mengikat gunung |
|---|---|---|
| Dikelola oleh | buruh pelabuhan | kamu |
| Lokasi | Tempat penyimpanan Docker | Jalur apa pun di host |
| Tergantung pada folder host? | Tidak | Ya |
| Mengedit dari tuan rumah | Canggung secara desain | Gampang, perubahan langsung muncul |
| Target kosong yang sudah diisi sebelumnya dari gambar? | Ya | Tidak, jalur host menyembunyikannya |
| Perintah Docker CLI | Ya, docker volume |
Tidak |
| Driver untuk penyimpanan jarak jauh | Ya | Tidak |
| Terbaik untuk | Database, data produksi | Kode sumber dalam pengembangan |
Volume bernama
Volume adalah penyimpanan yang dibuat dan dikelola oleh Docker. Anda menyebutnya dengan namanya, dan Anda tidak perlu peduli di mana ia tinggal secara fisik.
docker volume create pgdata
docker run -d --name db \
-e POSTGRES_PASSWORD=devonly \
-v pgdata:/var/lib/postgresql/data \
postgres:17
Sekarang file database berada di pgdata. Hapus penampung dan mulai yang baru dengan volume yang sama, dan data Anda akan tetap ada. Di Linux, volume biasanya berada di bawah /var/lib/docker/volumes/, tetapi Anda tidak boleh mengedit file tersebut secara langsung. Di Docker Desktop, mereka tinggal di dalam mesin virtual, bukan di folder normal.
Jalur di dalam penampung bergantung pada gambar, jadi periksa dokumentasi gambar. Memasang ke jalur yang salah adalah kesalahan klasik: semuanya tampak berfungsi, namun data masih ditulis ke lapisan penampung. Versi utama gambar yang lebih baru juga dapat mengubah jalur ini, jadi bacalah catatan rilis sebelum memutakhirkan.
Docker akan membuat volume bernama secara otomatis jika tidak ada. Volume anonim, yang dibuat tanpa nama, juga berfungsi, namun mendapat ID acak yang panjang dan mudah hilang jejaknya. Selalu beri nama volume Anda.
Mengikat tunggangan
Bind mount memetakan jalur host tertentu langsung ke dalam container. Kedua belah pihak langsung melihat file yang sama. Ini membuatnya sempurna untuk pengembangan, karena pengeditan di editor Anda akan berlaku di container yang sedang berjalan tanpa perlu membangun kembali:
docker run -d --name web \
-p 8080:80 \
-v "$(pwd)/site:/usr/share/nginx/html:ro" \
nginx:1.27
Edit file di site/, segarkan browser dan Anda akan melihat perubahannya. :ro menjadikan mount hanya-baca di dalam container, yang merupakan kebiasaan baik ketika container tidak perlu menulis di sana.
Bind mount hadir dengan beberapa trade-off:
- Mereka mengikat Anda ke host. Jalurnya harus ada di setiap mesin, sehingga penyiapannya kurang portabel.
- Mereka menyembunyikan konten gambar. Jika Anda memasang di atas
/app, gambar apa pun yang ada di sana menjadi tidak terlihat. Contoh umum adalahnode_moduleshilang. - Mereka mengekspos host. Sebuah container dengan mount yang dapat ditulisi dapat mengubah atau menghapus file host sebenarnya. Jangan pernah memasang jalur sensitif seperti
/atau soket Docker kecuali Anda sepenuhnya memahami risikonya. - Kinerja dapat bervariasi. Di Docker Desktop untuk macOS dan Windows, berbagi file melewati batas virtualisasi, dan bisa lebih lambat dibandingkan di Linux.
tmpfs dipasang
Mount tmpfs ada di memori host, dan tidak pernah ditulis ke lapisan container. Itu hilang ketika kontainer berhenti, sehingga sesuai dengan file sementara, cache, dan data sensitif yang berumur pendek:
docker run -d --tmpfs /app/cache:size=64m myapp:1.0
tmpfs tersedia di host Linux. Ini juga dapat mempercepat database di lingkungan pengujian sekali pakai, di mana Anda tidak peduli dengan penyimpanan datanya.
-v atau –mount?
Kedua bendera berfungsi. --mount lebih panjang, tetapi lebih eksplisit, dan banyak orang lebih menyukainya dalam skrip:
# Short form
docker run -v pgdata:/var/lib/postgresql/data postgres:17
# Explicit form
docker run --mount type=volume,source=pgdata,target=/var/lib/postgresql/data postgres:17
# Bind mount, read-only
docker run --mount type=bind,source="$(pwd)"/site,target=/usr/share/nginx/html,readonly nginx:1.27
Ada satu perbedaan yang berarti. Dengan -v, jalur host yang hilang akan dibuat untuk Anda sebagai folder kosong, yang dapat menyembunyikan kesalahan ketik. Dengan --mount dan tipe pengikatan, Docker malah melaporkan kesalahan. Selain itu, dengan -v, sisi kiri menentukan jenisnya: nama berarti volume, dan jalur berarti pengikatan. Jadi -v data:/x dan -v ./data:/x melakukan hal yang sangat berbeda.
Volume di Docker Compose
Sebagian besar proyek nyata mendeklarasikan penyimpanan dalam file Compose. Yang ini menggunakan kedua jenis, masing-masing untuk pekerjaan yang tepat:
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- ./src:/app/src # bind mount: live code
depends_on:
- db
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: devonly
volumes:
- pgdata:/var/lib/postgresql/data # named volume: data
volumes:
pgdata:
Volume yang diberi nama harus dideklarasikan di bagian tingkat atas volumes. Compose mengawali nama sebenarnya dengan nama proyek. Lihat tutorial Docker Compose kami untuk panduan lengkapnya.
Kiat: docker compose down menyimpan volume bernama, namun docker compose down -v menghapusnya, bersama dengan data Anda. Berhati-hatilah dengan skrip dan riwayat shell yang menyertakan -v.
Perintah volume yang berguna
| Perintah | Apa fungsinya |
|---|---|
volume buruh pelabuhan ls |
Daftar volume |
volume buruh pelabuhan membuat nama |
Menciptakan volume |
nama pemeriksaan volume buruh pelabuhan |
Menampilkan detail, termasuk lokasinya |
nama rm volume buruh pelabuhan |
Menghapus volume dan datanya |
pemangkasan volume buruh pelabuhan |
Menghapus volume yang tidak digunakan |
sistem buruh pelabuhan df -v |
Menunjukkan penggunaan disk, termasuk volume |
Periksa apa yang prune akan hapus sebelum Anda mengonfirmasinya, karena hal ini tidak dapat dibatalkan. Volume yang saat ini tidak digunakan oleh penampung mungkin masih menyimpan data penting.
Cadangkan dan pulihkan volume
Volume dapat dicadangkan dengan menjalankan container berumur pendek yang memasang volume dan folder host:
# Back up
docker run --rm \
-v pgdata:/data:ro \
-v "$(pwd)":/backup \
alpine tar czf /backup/pgdata.tar.gz -C /data .
# Restore into a new volume
docker volume create pgdata_restored
docker run --rm \
-v pgdata_restored:/data \
-v "$(pwd)":/backup \
alpine tar xzf /backup/pgdata.tar.gz -C /data
Untuk database langsung, menyalin file seperti ini dapat menangkap keadaan yang tidak konsisten. Hentikan penampung terlebih dahulu, atau lebih baik lagi, gunakan alat database sendiri, seperti pg_dump untuk PostgreSQL. Dan cadangan yang belum pernah Anda pulihkan sebenarnya hanyalah sebuah harapan, jadi ujilah pemulihan tersebut.
Izin berkas
“Izin ditolak” adalah masalah paling umum pada mount. File menyimpan ID pengguna dan grup numeriknya di Linux, jadi jika kontainer berjalan sebagai pengguna 1000 dan folder host milik pengguna lain, penulisan akan gagal. Beberapa cara untuk memperbaikinya:
- Jalankan penampung dengan pengguna yang cocok:
docker run --user "$(id -u):$(id -g)" ... - Siapkan kepemilikan yang benar pada gambar Anda, seperti yang dijelaskan dalam praktik terbaik Dockerfile kami.
- Pilih volume bernama untuk data, karena volume baru mengambil alih kepemilikan folder gambar saat pertama kali digunakan.
- Pada sistem yang menggunakan SELinux, pengikatan pengikatan mungkin memerlukan label
:zatau:Z.
Hindari godaan chmod 777, seperti yang dijelaskan dalam panduan kami untuk perintah Linux.
Mana yang harus Anda gunakan?
| Situasi | Gunakan |
|---|---|
| Data basis data | Volume bernama |
| Kode sumber pengeditan langsung | Mengikat gunung |
| File konfigurasi dari repositori Anda | Pemasangan pengikatan hanya-baca |
| Berbagi data antar kontainer | Volume bernama |
| Cache sementara atau file awal | tmpfs |
| Basis data pengujian sekali pakai | tmpfs, atau tanpa mount |
| Kode aplikasi dalam produksi | Bangun itu ke dalam gambar |
Baris terakhir itu penting. Dalam produksi, kode termasuk dalam gambar, sehingga apa yang Anda uji adalah apa yang Anda jalankan. Dalam cluster, penyimpanan data kembali berfungsi secara berbeda, melalui volume persisten, yang tercakup dalam dokumentasi Kubernetes yang lebih luas. Panduan Docker vs Kubernetes kami menjelaskan hubungan keduanya.
Kesalahan umum
- Memasang ke jalur yang salah. Data masih berada di lapisan penampung, dan kemudian menghilang.
- Menjalankan
down -vdengan santai. Ini akan menghapus volume bernama Anda. - Menggunakan jalur relatif dengan
-v. Formulir seperti-v data:/xmembuat volume, bukan pemetaan folder. - Menempatkan rahasia dalam pengikatan yang dapat ditulis. Memasangnya hanya-baca, atau gunakan fitur rahasia.
- Menunjuk dua kontainer database pada satu volume. Hal ini dapat merusak data.
- Tidak memiliki cadangan. Volume bukanlah cadangan. Itu tinggal di disk yang sama.
Penutup
Aturan praktisnya singkat: memberi nama volume untuk data, mengikat mount untuk kode yang Anda edit, dan tmpfs untuk hal-hal yang tidak akan bertahan lama. Cobalah di database sekali pakai. Buat volume bernama, tambahkan baris, hapus wadah, mulai yang baru, dan konfirmasikan bahwa baris Anda bertahan. Kemudian praktikkan pencadangan dan pemulihan sebelum Anda membutuhkannya.
Pertanyaan yang sering diajukan
Apa perbedaan antara volume Docker dan pengikatan pengikatan?
Sebuah volume dikelola oleh Docker dan disimpan di areanya sendiri. Bind mount memetakan jalur host tertentu yang Anda kendalikan, langsung ke dalam container.
Apakah menghentikan sebuah container akan menghapus datanya?
Tidak. Data pada lapisan yang dapat ditulis akan bertahan jika dihentikan dan dimulai ulang. Itu hilang ketika wadah dikeluarkan, kecuali jika disimpan dalam volume atau pengikatan.
Apakah volume Docker tetap ada setelah buruh pelabuhan menulis?
Ya, volume bernama tetap ada setelah buruh pelabuhan menulis. Menambahkan tanda -v akan menghapusnya, bersama dengan data apa pun yang dikandungnya.
Di mana volume Docker disimpan?
Di Linux, biasanya di bawah /var/lib/docker/volumes. Di Docker Desktop, mereka tinggal di dalam mesin virtual. Gunakan pemeriksaan volume buruh pelabuhan untuk melihat lokasi.
Bisakah beberapa kontainer berbagi volume?
Ya, beberapa kontainer dapat memuat satu volume. Aplikasi harus menangani akses bersamaan dengan aman, dan database umumnya tidak boleh berbagi file data dengan cara ini.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →