Sabtu, 31 Juli 2021

Docker Volume dan Presistent Data

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 mysqlserver
docker rm mysqlserver
ls /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-fpm
 
RUN apt-get update -y && apt-get install -y libmcrypt-dev libonig-dev openssl zip unzip git
RUN docker-php-ext-install pdo pdo_mysql mbstring
 
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 
WORKDIR /app
 
COPY . /app
 
RUN composer install
 
CMD ["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

Multi Domain Setting

Multi Domain Setting Untuk memudahkan management file di server, perlu dibuatkan folder khusus untuk menyimpan file-file yang diperlukan dal...