Jika kontainer diisolasi, bagaimana mereka bisa berkomunikasi dengan mesin host, mungkin untuk menyimpan data? Karena saat kita membuat penampung dari sebuah gambar, semua data yang dihasilkan akan hilang saat penampung dihapus.
Jadi kita perlu cara untuk memiliki penyimpanan permanen.
Kita dapat melakukannya menggunakan Bind Mounts dan Volume .
Tidak banyak perbedaan antara keduanya, kecuali Bind Mounts dapat menunjuk ke folder mana pun di komputer host, dan tidak dikelola oleh Docker secara langsung.
Mari kita mulai dengan mereka. Salah satu contoh klasik adalah log. Misalkan aplikasi Anda membuat file log, di dalam wadah, di /usr/src/app/logs
. Anda dapat memetakannya ke folder di mesin host, menggunakan -v
(sama seperti --volume
) tandai saat Anda menjalankan wadah dengan docker run
, seperti ini:-v ~/logs:/usr/src/app/logs
Ini akan memetakan folder tersebut ke subfolder log di direktori home pengguna.
Simpul:
-m
atau--mount
flag bekerja dengan cara yang sangat mirip
Ini adalah bendera yang digunakan dengan examplenode
gambar yang kita buat sebelumnya:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
Jadi sekarang kita dapat menjalankan aplikasi Node kita, dan log apa pun akan disimpan di komputer host, bukan di dalam wadah Docker.
Perhatikan bahwa
examplenode
aplikasi tidak menghasilkan log masuk/usr/src/app/logs
, itu hanya sebuah contoh dan Anda harus mengatur pencatatan itu terlebih dahulu.
Detail tentang volume akan dicantumkan saat Anda menjalankan docker inspect
pada nama penampung, di bawah “Mounts”:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Dapatkah Anda melihat "Type": "bind"
? Itu artinya kita telah membuat bind mount .
Sekarang, mari kita bicara tentang Volume .
Perbedaan antara Bind Mounts dan Volumes adalah bahwa dengan membuat volume, Docker akan menyimpan data dalam folder yang dikelolanya, yang berarti ia akan mengurus izin dan kepemilikan file, dan itu akan memberi Anda alat untuk mengelola volume tersebut. Meskipun pengikatan mount didasarkan pada jalur sistem file, dan Docker tidak dapat menyediakan alat di sekitarnya.
Misalnya, Docker memungkinkan Anda menghapus semua volume yang tidak digunakan dengan menjalankan docker volume prune
atau docker system prune --volumes
.
Untuk membuat volume, pertama-tama kita harus menjalankan docker volume create
:
docker volume create logs
Sekarang Anda dapat menggunakan docker volume ls
dan docker volume inspect
untuk mendapatkan lebih banyak data tentang volume sistem:
Sekarang jalankan docker run
dengan opsi -v logs:/usr/src/app/logs
(beri tahu nama volume alih-alih folder)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
Sekarang jalankan docker inspect
pada gambar akan menunjukkan volume terpasang:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
Lihat? Sekarang log akan disimpan di /var/lib/docker/volumes/logs/_data
folder.
Volume akan menjadi penting ketika tiba waktunya untuk men-deploy container di layanan cloud, misalnya.
Anda dapat menghapus volume yang menjalankan docker volume rm <name>
.