Presistent Data & Docker Volume

  

Presistent Data & Docker Volume

Arsitektur Container

Secara arsitektur container didesain menjadi immutable dan ephemeral, artinya kita tidak perlu melakukan update pada container, kita hanya perlu untuk men stop dan remove kemudian mengganti dengan image yang baru

A.      Immutable – Kita tidak bisa mengubah setelah container dijalankan

B.      Config Changes – Jika diharuskan untuk mengubah config atau update image, kita harus melakukan redeploy dengan container yang baru

C.      Benefit – Reability dan Consistency serta membuat perubahan dapat di reproduce

Bagaimana Docker Menyimpan Data

Secara default semua file atau data yang di create di dalam container akan tersimpan dalam sebuah layer yang disebut Writeable Container Layer.

1.       Data tidak bertahan, ketika container sudah tidak ada atau tidak berjalan

2.       Sulit untuk dibagikan, susah untuk mengakses data dari luar container ketika ada prosess lain yang membutuhkannya

3.       Sangat bergantung pada host machine dimana container di jalankan dan tidak mudah untuk memindahkan data ke tempat lain

Bagaimana dengan Unique Data (input dan upload data) yang dibuat melalui aplikasi berbasis docker, ada beberapa karateristik dari data di docker.

A.      Separation of Concerns, Idealnya, container jangan mengandung data unik yang tercampur kedalam binary application

B.      Accessible Unique Data, Data unuk haru tetap bisa diakses walaupun container di recycle (rebuild dan rerun)

C.      Updated Application, Misalkan kita melakukan update aplikasi, maka kita harus memberhentikan terlebih dahulu container, rebuild, dan rerun. Ketika mererun, maka unuk data sebelumnya harus bisa diakses kembali

D.      Persistent by Default, Unique data secara default tersimpan secara persisten sampai container di remove. Menstop dan melakukan restart host tidak akan menghilangkan unique data

 

Solusi Docker untuk Presistent Data

Docker memberikan beberapa solusi untuk menangani persistent data, diantaranya :

1.       Unique Data, harus disimpan di host machine, sehingga data akan selalu tersimpan dan accessible walaupun container suda di stop dan di remove

2.       Docker memberikan dua cara untuk menupan data secara persistent di host machine, yakni Volume dan Bind Mount

3.       Jika kita menjalankan docker di Linux Based OS kita juga bisa menggunakan tmpfs mount, Jika Anda menjalankan Docker di Windows, Anda juga dapat menggunakan yang namanya pipe

4.       Volumes – disimpan pada host filesystem yang dimanage secara langsung oleh docker (/var/lib/docker/volumes/ pada Linux) non docker proses tidak bisa memodifikasi volume ini

5.       Bind Mounts – bisa disimpan dibagian manapun pada host filesystem. Non Docker process pada Docker Host atau Docker Container bisa memodifikasi bagian ini kapanpun diperlukan

6.       Tmpfs mounts – disimpan pada memory host system dan tidak pernah disimpan ada host filesystem

 


A.      Volume

Dibuat dan dikelola oleh Docker. Anda dapat membuat volume secara eksplisit menggunakan docker volume create perintah, atau Docker dapat membuat volume selama pembuatan kontainer atau layanan. Saat Anda membuat volume, volume tersebut disimpan dalam direktori di host Docker. Saat Anda memasang volume ke dalam penampung, direktori inilah yang dipasang ke dalam penampung. Ini mirip dengan cara kerja bind mount, kecuali bahwa volume dikelola oleh Docker dan diisolasi dari fungsionalitas inti mesin host. Volume tertentu dapat dipasang ke beberapa kontainer secara bersamaan. Saat tidak ada container yang berjalan yang menggunakan volume, volume tersebut masih tersedia untuk Docker dan tidak dihapus secara otomatis. Anda dapat menghapus volume yang tidak digunakan menggunakan docker volume prune. Saat Anda memasang volume, itu mungkin bernama atau anonim . Volume anonim tidak diberi nama eksplisit saat pertama kali dipasang ke dalam container, jadi Docker memberi mereka nama acak yang dijamin unik dalam host Docker tertentu. Selain nama, volume bernama dan anonim berperilaku dengan cara yang sama.Volume juga mendukung penggunaan driver volume, yang memungkinkan Anda menyimpan data di host jarak jauh atau penyedia cloud, di antara kemungkinan lainnya.

 

Contoh penggunaan Volume pada Image MYSQL

Untuk menggunakan volume kita akan menggunakan latest tag : MYSQL DOCKERFILE


Inspect Docker Image, jalankan pada terminal dengan menggunakan perntah

 docker image inspect mysql

lihat pada bagian ContainerConfigVolumes


Run MySQL image sebagai container

docker container run –d --name mysqldb –e MYSQL_ALLOW_EMPTY_PASSWORD=True mysql

                Lalu inspect container mysqldb

                docker container inspect mysqldb

       Pada pagian mounts akan muncul tampilan seperti gambar dibawah



Volumennya tetap ada walaupun container mysqldb sudah di remove


Volumes – Custome Name

Lalu kita akan run MySQL image dengan menambahkan opsi –v yang berguna untuk menentukan volume yang akan digunakan

 

docker container run –d –-name mysqldb –e MYSQL_ALLOW_EMPTY_PASSWORD=True –v mysqldb:/var/lib/mysql mysql



 B.      Bind mounts

Tersedia sejak awal Docker. Bind mount memiliki fungsionalitas terbatas dibandingkan volume. Saat Anda menggunakan bind mount, file atau direktori di mesin host dipasang ke dalam container. File atau direktori direferensikan oleh jalur lengkapnya di mesin host. File atau direktori tidak harus sudah ada di host Docker. Itu dibuat sesuai permintaan jika belum ada. Bind mount sangat berkinerja, tetapi mereka bergantung pada sistem file mesin host yang memiliki struktur direktori tertentu yang tersedia. Jika Anda mengembangkan aplikasi Docker baru, pertimbangkan untuk menggunakan volume bernama sebagai gantinya. Anda tidak dapat menggunakan perintah Docker CLI untuk langsung mengelola bind mount.

 

Contoh penggunaan Bind Mount

 

Disini kita akan menjalankan 2 container nginx dengan umage yang sama yaitu nginx-web-app

Run nginx tanpa menggunakan bind mounting

docker container run -d --name nginx -p 8080:80 nginx-web-app

Run nginx menggunakan bind mounting

 docker container run -d --name nginx2 -p 80:80 -v /mnt/e/docker/nginx-web-app:/usr/share/nginx/html nginx-web-app

 

Ini merupakan container nginx

 


Lalu ini merupakan container nginx2

  


Masuk ke shell container nginx2 menggunakan perintah

 

docker container exec -it nginx2 bash

 

Lalu buat file dengan menggunakan perintah touch about-us.html

 


Lalu rubah file tersebut dan isi dengan page yang diinginkan

 

Dan kembali buka pada browser maka hasilnya seperti ini

 




Next Post Previous Post
No Comment
Add Comment
comment url