Docker Storage & Volumes | Bind Mounts, Named Volumes & Persistence | Sinhala Guide

Docker Storage & Volumes | Bind Mounts, Named Volumes & Persistence | Sinhala Guide

ආයුබෝවන්, Tech යාළුවනේ! Docker Storage & Volumes Sinhala Guide එකට සාදරයෙන් පිලිගන්නවා!

අද කාලේ software development වලදී Docker නැතුව ඉන්න අමාරුයි, නේද? Containers නිසා අපිට applications deploy කරන එක, manage කරන එක ලේසි වුණා. ඒත් මෙතන පොඩි "ඒත්" එකක් තියෙනවා. Docker containers කියන්නේ stateless. ඒ කියන්නේ container එකක් නවත්තලා ආයෙත් start කළාම, ඒක ඇතුළේ තිබ්බ data ටික සාමාන්‍යයෙන් නැතිවෙලා යනවා. database එකක්, user uploads, config files වගේ දේවල් වලට මේක ලොකු ප්‍රශ්නයක්!

ඉතින්, අපි කොහොමද මේ data ටික ආරක්ෂා කරගන්නේ, container එක නැවත්තුවත්, delete කළත් ආයෙත් පාවිච්චි කරන්න පුළුවන් විදිහට? අන්න ඒකට තමයි Docker Storage Mechanisms එහෙමත් නැත්නම් Volumes කියලා කියන්නේ. අද මේ guide එකෙන් අපි Docker වල data persist කරන විවිධ ක්‍රම ගැන විස්තරාත්මකව බලමු. Bind Mounts, Named Volumes, tmpfs mount වගේ දේවල් මොනවද, ඒවා කොයි වෙලාවට පාවිච්චි කරන්න ඕනෙද කියලා අපි සරලව කතා කරමු. අන්තිමට data backup කරගන්න හැටි ගැනත් ටිකක් බලමු. එහෙනම්, අපි පටන් ගමු!

1. Docker Storage වල මූලික සිද්ධාන්තය - Data Persistence වැදගත් වෙන්නේ ඇයි?

ඔබ Docker container එකක් run කළාම, ඒක ඇතුළේ වෙනස් වෙන හැම data එකක්ම container එකේ writable layer එකේ තමයි තාවකාලිකව save වෙන්නේ. මේ layer එක container එකත් එක්කම තමයි තියෙන්නේ. ඉතින්, container එක delete කළොත්, මේ layer එකත් එක්කම ඒ data ටිකත් නැතිවෙලා යනවා. database එකක් run කරනවා නම්, web server එකකට user uploads එනවා නම්, logs generate වෙනවා නම්, මේ data ටික නැතිවෙලා යන එක අපිට කොහෙත්ම ඕනේ නැහැ නේද? අන්න ඒ නිසා තමයි අපි data persistence කියන concept එකට යන්නේ.

Data persistence කියන්නේ, container එකේ lifespan එකට එහා ගියපු විදිහකට data save කරගැනීමේ හැකියාව. Docker මේ සඳහා ප්‍රධාන ක්‍රම දෙකක් අපිට දෙනවා:

  • Volumes: මේවා Docker විසින්ම manage කරනවා. Host machine එකේ file system එකේ කොහෙද data තියෙන්නේ කියලා අපිට හිතන්න අවශ්‍ය වෙන්නේ නැහැ. මේක තමයි production environments වලදී data persistence වලට recommend කරන ක්‍රමය.
  • Bind Mounts: මේවා Host machine එකේ file system එකේ specific path එකක් container එක ඇතුළට mount කරනවා. Host එකෙන් direct access තියෙන නිසා development වලට හරි, config files share කරන්න හරි මේවා ගොඩක් ප්‍රයෝජනවත්.

මේවාට අමතරව තවත් options ටිකක් තියෙනවා, ඒවත් අපි බලමු.

2. Bind Mounts - සරල සහ වේගවත් විසඳුම

Bind Mounts කියන්නේ Docker storage solutions අතරින් ගොඩක් සරල සහ පහසුවෙන් තේරුම් ගන්න පුළුවන් එකක්. මෙතනදී වෙන්නේ, අපේ Host machine එකේ තියෙන directory එකක් (හෝ file එකක්) අරගෙන, ඒක Docker container එක ඇතුළේ තියෙන directory එකකට (හෝ file එකකට) කෙලින්ම map කරන එක.

Bind Mounts ක්‍රියා කරන හැටි:

සරලවම කිව්වොත්, Host එකේ C Drive එකේ තියෙන folder එකක්, container එකේ /app/data කියන folder එක ඇතුළට map කරනවා වගේ. ඉතින් container එක ඇතුළේ /app/data කියන folder එකට යන හැම data එකක්ම ඇත්තටම save වෙන්නේ Host එකේ C Drive එකේ folder එක ඇතුළේ.

Bind Mounts වල වාසි (Pros):

  • පහසුයි (Easy to use): Host machine එකේ තියෙන path එකයි, container එකේ path එකයි දුන්නාම වැඩේ ඉවරයි.
  • Host එකෙන් direct access: Host එකෙන් direct access කරන්න පුළුවන් නිසා, development වලදී code files share කරලා realtime changes බලන්න මේක ගොඩක් හොඳයි.
  • Performance: Host machine එකේ Native file system speed එකම ලැබෙනවා.

Bind Mounts වල අවාසි (Cons):

  • Host OS එකට බැඳී තිබීම (Host OS dependency): Host machine එකේ path එකක් direct use කරන නිසා, container එක වෙන Host එකක run කරනවා නම් ඒ path එක නැත්නම් ප්‍රශ්නයක් වෙනවා. මේක portability එකට බලපානවා.
  • Security අවදානම් (Security risks): Host එකේ sensitive files වලට container එකට access දෙන්න පුළුවන් නම්, security අවදානමක් ඇතිවෙන්න පුළුවන්.

Bind Mount එකක් භාවිතා කරන හැටි:

අපි හිතමු අපිට web server එකක් තියෙනවා, ඒකේ HTML files ටික Host එකේ තියෙන folder එකකින් load කරන්න ඕනේ කියලා. මෙන්න මෙහෙම කරන්න පුළුවන්:

docker run -d \
  --name my-web-server \
  -p 80:80 \
  -v /path/to/your/html:/usr/local/apache2/htdocs/ \
  httpd:2.4

මෙතනදී:

  • -v /path/to/your/html:/usr/local/apache2/htdocs/ කියන එකෙන් කියවෙන්නේ, Host එකේ /path/to/your/html කියන directory එක container එක ඇතුළේ /usr/local/apache2/htdocs/ කියන directory එකට map කරනවා කියලා.

Practical Tip: සාමාන්‍යයෙන් development වලදී, අපි ඉන්න current directory එක container එකට map කරන්න ඕනේ නම්, $(pwd) (Linux/macOS) නැත්නම් %cd% (Windows CMD) පාවිච්චි කරන්න පුළුවන්:

# Linux/macOS
docker run -it -v $(pwd):/app my-node-app

# Windows CMD
docker run -it -v %cd%:/app my-node-app

3. Named Volumes - Docker ගේ Smart Choice (Production Ready)

Named Volumes කියන්නේ Docker ecosystem එකේ data persistence වලට තියෙන recommend කරන ක්‍රමය. Bind Mounts වගේ Host machine එකේ specific path එකක් direct use කරනවා වෙනුවට, Docker විසින්ම Host machine එකේ file system එකේ තැනක් manage කරනවා. අපිට ඒ තැන කොහෙද තියෙන්නේ කියලා දැනගන්න අවශ්‍ය වෙන්නේ නැහැ, Docker ඒක බලාගන්නවා.

Named Volumes ක්‍රියා කරන හැටි:

අපි volume එකකට නමක් දෙනවා (උදා: my-db-data). ඊට පස්සේ container එකක් run කරනකොට මේ volume එක container එකේ directory එකකට mount කරනවා. Docker මේ volume එකේ actual data ටික තියෙන තැන Host machine එකේ /var/lib/docker/volumes/ කියන path එක ඇතුළේ manage කරනවා.

Named Volumes වල වාසි (Pros):

  • Docker විසින් කළමනාකරණය කිරීම (Docker-managed): Host OS එකේ තියෙන folder structure එක ගැන හිතන්න අවශ්‍ය වෙන්නේ නැහැ.
  • Portability: Host machine එකේ file system එකට බැඳීමක් නැති නිසා, volume එක create කරලා, container එක වෙන ඕනෑම Docker Host එකක run කරන්න පුළුවන්. Docker Engine එක විසින් Volume එක manage කරනවා.
  • Backup වලට පහසුයි (Easier backups): Volume එක වෙන container එකකට attach කරලා data backup කරන්න පුළුවන්.
  • Volume Drivers: Cloud storage (AWS EBS, Azure Disk) වගේ දේවල් වලට extend කරන්න පුළුවන් (අපි මේ ගැන තව ටිකකින් කතා කරමු).
  • Performance: සමහර අවස්ථාවල Bind Mounts වලට වඩා හොඳ performance එකක් දෙනවා, විශේෂයෙන්ම cloud environments වල.

Named Volumes වල අවාසි (Cons):

  • Host එකෙන් direct access නැහැ: Host එකේ direct path එකක් නැති නිසා, සාමාන්‍යයෙන් Host එකෙන් volume එකේ data ටික direct access කරන්න අමාරුයි (docker volume inspect කරලා path එක හොයාගත්තත්, ඒක Docker manage කරන තැනක් නිසා direct modify කරන එක recommend කරන්නේ නැහැ).

Named Volume එකක් භාවිතා කරන හැටි:

මුලින්ම අපි volume එකක් create කරගමු:

docker volume create my-app-data

දැන් මේ volume එක container එකකට mount කරමු:

docker run -d \
  --name my-database \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v my-app-data:/var/lib/postgresql/data \
  postgres:13

මෙතනදී -v my-app-data:/var/lib/postgresql/data කියන එකෙන් කියවෙන්නේ, my-app-data කියන named volume එක container එක ඇතුළේ /var/lib/postgresql/data කියන directory එකට mount කරනවා කියලා.

Docker Volume Commands:

Volumes manage කරන්න Docker commands කීපයක් තියෙනවා:

  • docker volume ls: සියලුම volumes list කරන්න.
  • docker volume inspect my-app-data: my-app-data volume එකේ විස්තර බැලීමට (Host එකේ path එක මෙතනින් හොයාගන්න පුළුවන්).
  • docker volume rm my-app-data: my-app-data volume එක delete කිරීමට.
  • docker volume prune: භාවිතයේ නැති (unused) volumes සියල්ලම delete කිරීමට.

Docker Compose සමග Named Volumes:

Docker Compose භාවිත කරනකොට Named Volumes create කරන එක ඊටත් වඩා පහසුයි:

version: '3.8'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - db_data:/var/lib/postgresql/data
  webapp:
    image: my-web-app
    ports:
      - "80:80"

volumes:
  db_data: # මෙතනින් volume එක declare කරනවා

මේ docker-compose.yml file එක run කළාම, Docker විසින් db_data කියන named volume එක automatically create කරලා, db service එකට mount කරනවා.

4. අනෙකුත් Storage Options සහ උසස් සංකල්ප

Bind Mounts සහ Named Volumes වලට අමතරව තවත් storage options කිහිපයක් තියෙනවා:

tmpfs Mounts:

tmpfs mounts කියන්නේ container එකේ RAM එක ඇතුළේ create වෙන තාවකාලික storage එකක්. මේකේ තියෙන data container එක නැවත්තුවොත් හෝ delete කළොත් ස්වයංක්‍රීයවම නැතිවෙලා යනවා.

  • Use Cases: Caching, session data, හෝ sensitive data (passwords වගේ) වගේ දේවල් වලට මේක ගොඩක් හොඳයි. මොකද මේවා persistence වෙන්න අවශ්‍ය නැහැ වගේම, container එක delete කළාම data ටිකත් auto delete වෙන නිසා security එකත් වැඩි වෙනවා.
  • වාසි: ගොඩක් වේගවත්, data persistence වෙන්නේ නැහැ.
  • අවාසි: Data නැතිවෙනවා, RAM එකේ ප්‍රමාණයෙන් සීමිතයි.

tmpfs mount එකක් භාවිතා කරන හැටි:

docker run -it --tmpfs /app/temp:rw,noexec,nosuid alpine sh

මෙතනදී /app/temp කියන path එක container එකේ RAM එකේ mount වෙනවා. rw,noexec,nosuid කියන්නේ mount options. rw කියන්නේ read-write, noexec කියන්නේ executable files run කරන්න බැහැ, nosuid කියන්නේ set-user-ID සහ set-group-ID bits disable කරනවා.

Volume Drivers:

සාමාන්‍යයෙන් Docker Volumes Host machine එකේ local storage එක මත පදනම් වෙලා තමයි ක්‍රියා කරන්නේ. ඒත්, enterprise environments වලදී හෝ distributed systems වලදී අපිට cloud providers ලාගේ storage (AWS EBS, Azure Disk, Google Persistent Disk) හෝ Network File Systems (NFS) වගේ දේවල් පාවිච්චි කරන්න අවශ්‍ය වෙනවා. අන්න ඒ වගේ වෙලාවට Volume Drivers පාවිච්චි කරන්න පුළුවන්.

  • Volume Drivers කියන්නේ මොනවද?: මේවා third-party plugins. මේවායින් Docker Volumes වලට Host machine එකේ local storage එකට අමතරව වෙනත් storage solutions එක්ක communicate කරන්න පුළුවන් වෙනවා.
  • වැදගත්කම: Scalability, high availability, disaster recovery, centralized storage management වගේ දේවල් වලට මේවා ගොඩක් වැදගත්.
  • උදාහරණ: rancher/convoy, rexray/rbd (CEPH), cloud provider specific drivers.

Volume Driver එකක් install කරලා volume එකක් create කරන හැටි:

# උදාහරණයක් ලෙස, RexRay driver එකක් install කරලා (installation steps driver එකෙන් driver එකට වෙනස් වෙනවා)
docker plugin install rexray/s3fs S3FS_OPTIONS="--url=https://s3.amazonaws.com"

# Volume එකක් create කිරීම
docker volume create --driver rexray/s3fs --name my-s3-volume

# Container එකකට mount කිරීම
docker run -it -v my-s3-volume:/data alpine sh

මේක තවත් advanced topic එකක්. හැබැයි මේ වගේ options තියෙනවා කියලා දැනගෙන ඉන්න එක වැදගත්.

5. Data Persistence සහ Backup Strategies

Data persistence කියන්නේ data නැති නොවී තියාගන්න එක. ඒත් අපි දන්නවා ඕනෑම වෙලාවක Hardware fail වෙන්න පුළුවන්, software bug එකක් එන්න පුළුවන්. ඒ නිසා Backups කියන්නේ data persistence වල අත්‍යාවශ්‍ය කොටසක්.

ඇයි Backups අත්‍යාවශ්‍ය වෙන්නේ?

  • Disaster Recovery: Hardware failure, accidental deletion, cyber attacks වගේ දේවල් වලින් data නැති වුණොත් ආයෙත් ගන්න පුළුවන්.
  • Compliance: සමහර industries වලට data backups අනිවාර්යයි.
  • Migration: System එකක් upgrade කරනකොට හෝ server එකක් වෙනස් කරනකොට data migrate කරන්න පුළුවන්.

Docker Volumes Backup කිරීමේ ක්‍රම:

Named Volumes backup කරන්න ගොඩක් හොඳ සහ recommended ක්‍රමයක් තමයි, temporary container එකක් පාවිච්චි කරන එක.

Named Volume එකක් Backup කරන හැටි:

අපි හිතමු අපිට my-app-data කියන volume එකේ data ටික backup කරගන්න ඕනේ කියලා. Host එකේ current directory එකට backup file එක ගන්න ඕනේ නම්, මෙන්න මෙහෙම කරන්න පුළුවන්:

docker run --rm -v my-app-data:/data -v $(pwd):/backup ubuntu tar cvf /backup/my-app-data-backup.tar /data

මේ command එකෙන් වෙන්නේ:

  • docker run --rm: Temporary container එකක් run කරනවා, වැඩේ ඉවර වුණාම ඒක automatically delete වෙනවා.
  • -v my-app-data:/data: අපේ my-app-data volume එක container එක ඇතුළේ /data කියන path එකට mount කරනවා.
  • -v $(pwd):/backup: Host එකේ current directory එක container එක ඇතුළේ /backup කියන path එකට mount කරනවා. Backup file එක save වෙන්නේ මේකට.
  • ubuntu tar cvf /backup/my-app-data-backup.tar /data: ubuntu image එක පාවිච්චි කරලා, tar command එකෙන් /data එකේ තියෙන හැමදෙයක්ම my-app-data-backup.tar කියලා compress කරලා /backup folder එකට (ඒ කියන්නේ Host එකේ current folder එකට) save කරනවා.

Backup එකක් Restore කරන හැටි:

අපි හිතමු අපිට my-app-data-backup.tar file එකෙන් my-new-app-data කියන අලුත් volume එකකට data restore කරන්න ඕනේ කියලා.

docker volume create my-new-app-data
docker run --rm -v my-new-app-data:/data -v $(pwd):/backup ubuntu tar xvf /backup/my-app-data-backup.tar -C /data --strip-components 1

මෙතනදී tar xvf /backup/my-app-data-backup.tar -C /data --strip-components 1 කියන එකෙන්, backup file එක /data (අපේ අලුත් volume එක) එකට extract කරනවා. --strip-components 1 කියන එක වැදගත් වෙන්නේ tar archive එකේ root directory එක strip කරලා data ටික direct /data එකට දාන්න.

මේ backup සහ restore ක්‍රමවේදයන් ගොඩක් flexible. ඔබට මේවා script කරලා automated backups run කරන්නත් පුළුවන්.

අවසන් වශයෙන්...

ඉතින් යාළුවනේ, Docker Containers වල data persistence කියන්නේ ගොඩක් වැදගත් concept එකක් කියලා දැන් ඔබට පැහැදිලි ඇති කියලා හිතනවා. අපි අද Bind Mounts, Named Volumes, tmpfs mounts සහ Volume Drivers ගැනත් කතා කළා. ඒ වගේම data persistence වල අනිවාර්ය කොටසක් වන backup strategies ගැනත් කතා කළා.

  • Bind Mounts: Development වලට, Host එකෙන් direct access ඕනේ වෙලාවට.
  • Named Volumes: Production වලට, databases වලට, portable data වලට, Docker manage කරන storage වලට.
  • tmpfs Mounts: Temporary data වලට, sensitive data වලට, RAM එකේ තියාගන්න.

ඔබගේ application එකේ අවශ්‍යතාවය අනුව නිවැරදි storage option එක තෝරාගන්න එක තමයි වැදගත්ම දේ. ඒ වගේම, හැම වෙලාවෙම data backups ගැන අවධානයෙන් ඉන්න එකත් අමතක කරන්න එපා!

මේක තවත් practical විෂයයක්. ඉතින්, තනියම මේ commands ටික run කරලා බලන්න. පොඩි project එකකට මේවා implement කරලා බලන්න. එතකොට තමයි හරියටම තේරෙන්නේ. මේ ගැන ඔබට මොනවා හරි ප්‍රශ්න තියෙනවා නම්, එහෙමත් නැත්නම් මේක පාවිච්චි කරපු ඔබගේ අත්දැකීම් කොමෙන්ට් එකක් දාලා කියන්න. අපි කතා කරමු!

තවත් අලුත් Tech topic එකකින් හමුවෙමු! ඔබට ජය!