Docker Volume dan Presistent Data
Karena kontainer Docker seharusnya kecil, proses tunggal dan contoh mudah diganti, tidak terlalu jelas bagaimana data persisten cocok dengan gambar itu. Bayangkan Anda memiliki container MySQL yang Anda putuskan untuk diupgrade. Apa yang akan Anda lakukan dengan file database-nya? Dalam dunia kontainer, “upgrade” berarti “nuke yang lama, mulai yang baru” dan data Anda akan berubah menjadi abu radioaktif dengan sistem file container lainnya.
Namun, seiring dengan masalah tersebut Docker juga menyediakan solusi: Volume Docker.
Apa itu Volume Docker ?
Secara umum, volume Docker hanyalah direktori host yang dipasang ke sistem file penampung. Karena tidak lagi milik FS wadah, tidak masalah untuk menghapus satu wadah, membuat yang lain dan memasang volume data yang ada ke dalamnya. Ada beberapa pendekatan tentang cara menggunakan volume Docker dan hari ini kita akan melihat tiga di antaranya.
Pemasangan Direktori Sederhana
Pendekatan paling sederhana adalah memasang direktori host sewenang-wenang ke FS penampung. Bayangkan Anda menjalankan wadah mysql dan ingin menyimpan file datanya selama peningkatan, atau hanya melakukan pencadangan sesekali. Kita dapat memetakan direktori host ke direktori data penampung, jadi apa pun yang dituliskan oleh mysql misalnya /var/lib/mysql akan berakhir dalam keamanan relatif dari host FS:
1 2 3 4 5 | docker run -d \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v /home/docker/mysql-data:/var/lib/mysql \ --name mysqlserver \ mysql |
Saat kami menghancurkan mysqlserver, datanya akan bertahan.
1 2 3 4 5 6 | docker stop mysqlserverdocker rm mysqlserverls /home/docker/mysql-data#auto.cnf client-cert.pem ib_logfile0 mysql/ public_key.pem sys/#ca-key.pem client-key.pem ib_logfile1 performance_schema/ server-cert.pem#ca.pem ib_buffer_pool ibdata1 private_key.pem server-key.pem |
Sekarang kita dapat memulai wadah mysql baru, pasang direktori data yang sama ke dalamnya dan lanjutkan seolah-olah tidak ada yang terjadi.
Dudukan hanya baca
Jika penampung tidak seharusnya memperbarui data dalam direktori yang dipasang, itu dapat dibuat hanya-baca hanya dengan menambahkan :ro sufiks. Jelas, tidak masuk akal untuk melakukannya untuk pemasangan basis data, tetapi untuk server web itu cukup logis:
1 2 3 | docker run -v /home/docker/www:/usr/share/nginx/html:ro ... |
Mendaftarkan Tunggangan yang ada
angan coba-coba mengingat apa yang sebenarnya dipasang ke wadah apa – otak kita tidak bekerja seperti itu. Sebaliknya, docker inspect %container% tidak hanya akan memberi tahu pengaturan jaringan, host dan kontainer, tetapi juga volume dan pemasangan apa yang digunakannya saat ini:
1 2 3 4 5 6 7 8 9 10 11 | docker inspect mysqlserver# ...# "Mounts": [# {# "Source": "/home/docker/mysql-data",# "Destination": "/var/lib/mysql",# "RW": true,# ...# }# ],# ... |
Volume data Docker
Mari kita coba hal lain: jalankan contoh mysql pertama sekali lagi, tetapi kali ini lewati -v argumen (volume). Kemudian, jika kita inspect melakukannya, akan sulit untuk tidak memperhatikan bahwa masih ada volume yang menyertainya!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | docker run -d \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ --name mysqlserver \ mysql docker inspect mysqlserver#...# "Mounts": [# {# "Name": "aac828f46e6ff00fedaf45bc21e89523bd57663d3d58bf0e3c73e8cb4092d768",# "Source": "/mnt/sda1/var/lib/docker/volumes/aac828f46e6ff00fedaf45bc21e89523bd57663d3d58bf0e3c73e8cb4092d768/_data",# "Destination": "/var/lib/mysql",# ...# }# ],#... |
Ya, kali ini namanya aneh, dan mount source pathnya lebih panjang, tapi masih mengarah ke /var/lib/mysql folder data. Bagaimana mungkin?
Jawabannya ada di bagian bawah gambar mysql Dockerfile :
1 2 3 | ...VOLUME /var/lib/mysql... |
VOLUME /var/lib/mysql membuat volume baru yang terpasang /var/lib/mysql. Ini berperilaku sedikit seperti mount direktori biasa, tetapi sebenarnya tidak persis sama. Setiap kali Docker melihat deklarasi volume, itu akan menghasilkan nama 64 byte yang unik untuknya, membuat direktori mount baru (volume) di host FS – /var/lib/docker/volumes/%name%, dan ketika container mulai pertama kali, tidak seperti mount direktori host biasa, itu akan salin wadah apa pun yang ada di /var/lib/mysql volume, dan setelah itu akan menggunakan konten dari volume, bukan FS wadah. Itu memiliki implikasi penting: ketika saya membuat wadah dari gambar mysql yang lebih baru yang juga memiliki konten yang lebih baru /var/lib/mysql, jika volumenya sudah ada, konten baru itu akan diabaikan.
Nah sekarang kita akan mencoba menjalankan laravel-app dengan men set-storage folder pada aplikasi laravel yang berjalan didam docker container ke foder yang ada di host machine
Membuar project laravel
Untuk membuat project laravel ketikan command dibawah ini pada terminal
1 | composer create-project --prefer-dist laravel/laravel laravel-app |
setelah selesai, buat dockerfile pada root direktori
Membuat file Dockerfile
Buat file dengan nama Dockerfile kemudian tuliskan code dibawah ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | FROM php:7.4.16-fpmRUN apt-get update -y && apt-get install -y libmcrypt-dev libonig-dev openssl zip unzip gitRUN docker-php-ext-install pdo pdo_mysql mbstringRUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composerWORKDIR /appCOPY . /appRUN composer installCMD ["php", "-S", "0.0.0.0:8000", "-t", "public"]EXPOSE 8000 |
setelah selesai build image dengan mengetikan command
1 | docker image build -t laravel-app . |
Kemudian jalankan container image dengan mengetikan comand
1 | docker container run -d -name laravel -p 8000:8000 -v /home/gantira/Gan/laravel-app:/app laravel-app |
Note: untk penulisan volume (-v) polanya adalah: host-file-system:container-file-system
kemdian buka browser dan jalankan http://localhost:8000/ jika berhasil maka akan seperti gambar dibawah ini:

Tidak ada komentar:
Posting Komentar