Cara Manage Data di Docker

Cara Manage Data di Docker

Secara default, semua file yang dibuat di dalam container disimpan pada layer yang dapat ditulis (writable layer). Dengan kondisi seperti itu, data akan ikut terhapus jika container juga terhapus dan mungkin saja sulit untuk mengeluarkan data dari container jika proses lain sedang membutuhkannya.

Writable layer berada di host machine tempat container berjalan. Kita tidak dapat dengan mudah memindahkan data ke tempat lain.

Menulis ke dalam writable layer memerlukan storage driver untuk mengelola filesystem. Storage driver menyediakan filesystem gabungan, menggunakan kernel Linux. Abstraksi ekstra ini mengurangi kinerja dibandingkan dengan menggunakan data volume, yang menulis langsung ke host filesystem.

Docker memiliki dua opsi untuk menyimpan file di host machine yang dapat diterapkan pada container, sehingga file tetap tersedia bahkan ketika container telah terhapus.

Cara Pertama: Bind Mount

Bind mount dapat disimpan di mana saja di host system. Data tersebut bahkan memungkinkan berupa system files atau direktori penting. Proses non-Docker pada Docker host atau Docker container dapat memodifikasi data tersebut kapan saja.

Fungsionalitas dari bind mount terbatas bila dibandingkan dengan volume. Saat menggunakan bind mount, direktori pada host machine dipasang (mount) ke dalam container. Direktori direferensikan oleh full path pada host machine. Direktori tidak perlu ada terlebih dahulu di Docker host, direktorinya dibuat sesuai permintaan jika belum ada.

Kinerjanya sangat baik, tetapi bind mount bergantung pada filesystem yang memiliki struktur direktori khusus. Docker CLI tidak dapat mengelola bind mount.

Bind mount memungkinkan akses ke file sensitif. Salah satu efek samping dari penggunaan bind mount, dapat mengubah file yang berada di host filesystem melalui proses yang berjalan di dalam container. Container dapat membuat, memodifikasi, atau menghapus file atau direktori sistem. Kemampuan ini dapat memiliki implikasi keamanan, termasuk memengaruhi proses non-Docker pada host system.

Kasus pemakaian Bind Mount

  • Berbagi file konfigurasi dari host machine ke container. Beginilah cara Docker memberikan resolusi DNS ke container secara default, mounting /etc/resolv.conf dari host machine ke setiap container.
  • Berbagi source code atau build artifacts antara development environment di Docker host dan container. Misalnya, mount Maven target/ ke dalam sebuah container, dan setiap kali build Maven project di Docker host, container tersebut mendapatkan akses ke artifacts untuk rebuilt.
  • Ketika struktur file atau direktori dari Docker host dijamin konsisten dengan bind mount yang dibutuhkan oleh container.

Cara Menggunakan Bind Mount
Membuat container dengan bind mount direktori webhtml ke /usr/share/nginx/html di container dengan opsi -v. Lokasi direktori (path) harus ditulis secara lengkap, jika tidak opsi -v akan dianggap sebagai volume. Jika direktori belum ada, akan dibuatkan oleh Docker.

Lokasi direktori dapat menggunakan pwd (print working directory).

Bind mount direktori dengan ijin hanya dapat dibaca (read-only) oleh container.

Bind mount dengan opsi –mount.

Cara Kedua: Volume

Volume disimpan di host filesystem yang dikelola oleh Docker (/var/lib/docker/volumes). Proses non-Docker tidak boleh memodifikasi bagian filesystem ini. Volume adalah cara terbaik untuk menyimpan data di Docker.

Volume dibuat dan dikelola oleh Docker. Kita dapat membuat volume dengan menggunakan perintah docker volume create, atau Docker dapat membuat volume selama pembuatan container atau service.

Saat membuat volume, akan tersimpan di dalam direktori yang berada di Docker host. Saat mount volume ke dalam container, direktori inilah yang di-mount ke dalam container. Cara kerjanya mirip dengan bind mount, kecuali volume dikelola oleh Docker dan diisolasi dari fungsionalitas inti host machine.

Volume dapat di-mount ke beberapa container secara bersamaan. Ketika tidak ada container yang menggunakan volume, volume masih tersedia untuk Docker dan tidak dihapus secara otomatis. Kita dapat menghapus volume yang tidak digunakan dengan perintah docker volume prune.

Volume mendukung penggunaan volume driver, memungkinkan untuk menyimpan data di remote host atau cloud provider.

Kasus pemakaian Volume

  • Berbagi data di antara beberapa container yang sedang berjalan. Jika belum dibuat, volume akan dibuat saat pertama kali di-mount ke dalam container. Ketika container itu berhenti atau dipindahkan, volumenya masih ada. Beberapa container dapat mount volume secara bersamaan, baik read-write atau read-only.
  • Ketika kita ingin menyimpan data container di remote host atau cloud provider, bukan secara lokal.
  • Ketika perlu mencadangkan (backup), memulihkan (restore), atau memigrasikan (migrate) data dari satu Docker host ke Docker host lain, volume adalah pilihan yang lebih baik. Kita dapat menghentikan container yang memakai volume, lalu mencadangkan direktori volume (misal /var/lib/docker/volumes/volume-name).
  • Saat aplikasi membutuhkan I/O berkinerja tinggai di Docker desktop. Volume disimpan di Linux VM (virtual machine) daripada di host, yang berarti bahwa baca dan tulis memiliki latensi yang jauh lebih rendah dan throughput yang lebih tinggi.
  • Ketika aplikasi memerlukan perilaku native filesystem di Docker desktop. Misalnya, database engine memerlukan kontrol yang tepat atas disk flushing untuk menjamin ketahanan transaksi. Volume disimpan di Linux VM dan dapat menjamin hal tersebut, sedangkan bind mount di-remote ke macOS atau Windows, di mana filesystem berperilaku sedikit berbeda.

Cara Menggunakan Volume
Membuat container dengan mount volume vol-web ke /usr/share/nginx/html di container dengan opsi -v. Jika volume belum ada, akan dibuatkan oleh Docker. Lokasi direktori volume berada di /var/lib/docker/volumes/vol-web, datanya tersimpan di _data.

Mount volume dengan ijin hanya dapat dibaca (read-only) oleh container.

Mount volume dengan opsi –mount

Mengatur Volume
Perintah docker untuk mengatur volume.

Membuat volume.

Menampilkan volume.

Menampilkan informasi detail volume.

Menghapus volume.

Menghapus semua volume yang tidak terpakai

Selamat mencoba 🙂

Leave a Reply