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
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
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
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