Docker Images & Containers: ගැඹුරු අවබෝධයක් | Sinhala Guide

Docker Images & Containers: ගැඹුරු අවබෝධයක් | Sinhala Guide

ආයුබෝවන් යාළුවනේ! අද අපි කතා කරන්න යන්නේ නූතන Software Development ලෝකයේ නැතුවම බැරි තාක්ෂණයක් ගැන – ඒ තමයි Docker. ඔබ Developer කෙනෙක් හෝ DevOps Engineer කෙනෙක් නම්, Docker කියන්නේ ඔබට අනිවාර්යයෙන්ම දැනගෙන ඉන්න ඕන දෙයක්. මේ Guide එකෙන් අපි Docker Images සහ Containers කියන ප්‍රධාන සංකල්ප දෙක ගැඹුරින් සාකච්ඡා කරනවා.

ඔබගේ Application එකක් Build කරලා, Test කරලා, Deploy කරනකොට එක එක පරිසර වලදි (Development, Staging, Production) වෙනස්කම් නිසා එන ගැටලු වලට Docker කියන්නේ නියම විසඳුමක්. “මගේ මැෂින් එකේ වැඩ කළා, නමුත් Production එකේ වැඩ කරන්නේ නැහැ” කියන ප්‍රශ්නයට Docker වලින් සමු දෙන්න පුළුවන්. ඒ කොහොමද කියලා අපි බලමු!

මේ ලිපිය අවසානයේදී, ඔබට Docker Images සහ Containers කියන්නේ මොනවද, ඒවා එකිනෙකාට සම්බන්ධ වෙන්නේ කොහොමද, ඒවායේ Lifecycle එක මොන වගේද, වගේම ඒවා Manage කරන්නේ කොහොමද කියන එක ගැන හොඳ අවබෝධයක් ලැබෙනවා. අපි මේක පියවරෙන් පියවර ඉතාම සරලව, සිංහලෙන් පැහැදිලි කරමු. එහෙනම්, අපි පටන් ගමු!

1. Docker Images - ඔබේ Application එකේ Blueprints

මුලින්ම අපි බලමු Docker Image එකක් කියන්නේ මොකක්ද කියලා. සරලව කිව්වොත්, Docker Image එකක් කියන්නේ ඔබේ Application එක Run කරන්න අවශ්‍ය කරන සියලුම දේවල් (code, runtime, system tools, system libraries, settings, etc.) අඩංගු read-only template එකක්. මේක හරියට ගෙයක් හදන්න කලින් තියෙන Blueprints (සැලසුම්) වගේ.

ඔබේ Application එක Run කරන්න ඕන Operating System, dependencies, environment variables වගේ හැම දෙයක්ම මේ Image එක ඇතුළේ තියෙනවා. ඒ නිසා, මේ Image එක ඕනෑම Docker Engine එකක් තියෙන මැෂින් එකක Run කරන්න පුළුවන්, එකම විදිහට!

Image Layers සහ Base Images

Docker Images හදලා තියෙන්නේ layers වලින්. මේක හරිම වැදගත් සංකල්පයක්. හැම Docker Image එකක්ම එකිනෙකට උඩින් එකතු වුණු Layers ගොඩකින් හැදිලා තියෙන්නේ. මේ layers බොහෝ විට Read-only වෙනවා.

  • Base Image: හැම Docker Image එකක්ම වගේ පටන් ගන්නේ Base Image එකකින්. මේවා සාමාන්‍යයෙන් Ubuntu, Alpine, Node.js, Python වගේ Operating Systems හෝ Run-times අඩංගු Image එකක්. උදාහරණයක් විදියට, ඔබ Python Application එකක් හදනවා නම්, python:3.9-slim වගේ Base Image එකකින් පටන් ගන්න පුළුවන්.
  • Intermediate Layers: Base Image එකට උඩින්, ඔබ ඔබේ Application එකට අවශ්‍ය dependencies Install කරන විට, code එක Add කරන විට, configuration වෙනස් කරන විට, අලුත් Layers හැදෙනවා.

මේ Layering System එකේ වාසි ගොඩක් තියෙනවා:

  • Efficiency: Layers කිහිපයක් Images අතර Share කරන්න පුළුවන්. ඒ නිසා Disk Space ඉතිරි වෙනවා.
  • Speed: Image එකක් Build කරනකොට, වෙනස් වුණු Layer එක විතරක් නැවත Build කරන නිසා වේගවත් වෙනවා.

Image Pull කිරීම (Downloading Images)

අපිට Docker Images Docker Hub වගේ Registry වලින් Download කරගන්න පුළුවන්. මේකට අපි කියන්නේ pull කරනවා කියලා. මේක හරියට App Store එකකින් App එකක් Download කරනවා වගේ වැඩක්.

අපි Node.js Application එකක් Run කරන්න අවශ්‍ය Node.js Image එක Pull කරමු.

docker pull node:16-alpine

මේ node:16-alpine කියන්නේ Image Name එක (node) සහ Tag එක (16-alpine). Tag එකෙන් අපි Image එකේ Version එක හෝ Specific Variant එකක් තෝරා ගන්නවා. Tag එකක් නොදුන්නොත්, Docker Default එක විදියට latest Tag එක Pull කරනවා.

දැන් අපි බලමු අපේ මැෂින් එකේ තියෙන Images මොනවද කියලා:

docker images

2. Docker Containers - ඔබේ Application එක Run වෙන තැන

හරි, දැන් අපි Images ගැන දන්නවා. එහෙනම් Container එකක් කියන්නේ මොකක්ද? සරලව කිව්වොත්, Docker Image එකකින් හදපු, executable instance එකක් තමයි Container එකක් කියන්නේ. මේක හරියට Blueprints (Image) වලින් හදපු ඇත්ත ගේ (Container) වගේ. Image එක Read-only වුණාට, Container එක Read-write වෙනවා.

Container එකක් කියන්නේ Isolated පරිසරයක්. ඒ කියන්නේ, එක Container එකක් ඇතුලේ Run වෙන දේවල් තව Container එකකට හෝ Host Machine එකට බලපාන්නේ නැහැ. මේක තමයි Docker වල තියෙන ලොකුම වාසියක්!

Container Run කිරීම (Launching a Container)

අපි කලින් Pull කරගත්තු Node.js Image එකෙන් Container එකක් Run කරමු. මේකට අපි docker run Command එක පාවිච්චි කරනවා.

docker run -d -p 80:8080 --name my-node-app node:16-alpine sh -c "while true; do echo 'Hello from Docker!'; sleep 1; done"

මේ Command එක ටිකක් සංකීර්ණයි වගේ පෙනුණත්, අපි කොටස් වශයෙන් බලමු:

  • docker run: අලුත් Container එකක් Run කරන්න.
  • -d: Container එක Background එකේ (detached mode) Run කරන්න. නැත්නම් Terminal එක block වෙනවා.
  • -p 80:8080: Port Mapping. Host Machine එකේ Port 80 එක Container එකේ Port 8080 එකට Map කරනවා. (මේකෙන් තමයි පිටතින් Container එකට Access කරන්න පුළුවන් වෙන්නේ).
  • --name my-node-app: Container එකට my-node-app කියලා නමක් දෙනවා. (නමක් නොදුන්නොත් Docker random නමක් දෙනවා).
  • node:16-alpine: පාවිච්චි කරන Image එක.
  • sh -c "while true; do echo 'Hello from Docker!'; sleep 1; done": Container එක ඇතුලේ Run කරන්න ඕන Command එක. (මේක සරල Bash script එකක්, "Hello from Docker!" කියලා හැම තප්පරයකටම පින්ට් කරන).

දැන් අපේ Container එක Run වෙනවාද බලන්න:

docker ps

මේ Command එකෙන් Run වෙන හැම Container එකක්ම පෙන්නනවා. -a Flag එක දැම්මොත් නැවතිලා තියෙන Container පවා පෙන්නනවා.

docker ps -a

Container Stop කිරීම (Stopping a Container)

Container එකක් නවත්වන්න අපිට docker stop Command එක පාවිච්චි කරන්න පුළුවන්. මේකට Container ID එක හෝ Name එක දෙන්න පුළුවන්.

docker stop my-node-app

හෝ

docker stop <CONTAINER_ID>

Container Start කිරීම (Starting a Stopped Container)

නැවතුණු Container එකක් නැවත පටන් ගන්න docker start Command එක පාවිච්චි කරන්න පුළුවන්.

docker start my-node-app

Container Remove කිරීම (Deleting a Container)

අපිට අවශ්‍ය නැති Container එකක් Delete කරන්න docker rm Command එක පාවිච්චි කරන්න පුළුවන්. නමුත් Container එකක් Delete කරන්න කලින් ඒක Stop කරලා තියෙන්න ඕන.

docker rm my-node-app

Container එක Run වෙන අතරතුරම Remove කරන්න අවශ්‍ය නම් -f (force) Flag එක පාවිච්චි කරන්න පුළුවන්. ඒත් ඒක එච්චර හොඳ පුරුද්දක් නෙවෙයි.

docker rm -f my-node-app

3. Docker Images සහ Container Lifecycles ගැඹුරට

Images සහ Containers වල මූලික operations ගැන අපි කතා කළා. දැන් අපි තවත් වැදගත් operations ටිකක් බලමු.

Image Push කිරීම (Uploading Images)

ඔබ Docker Image එකක් Build කළාට පස්සේ, ඒක Docker Hub වගේ Public Registry එකකට හෝ Private Registry එකකට Upload කරන්න පුළුවන්. මේකට අපි කියන්නේ push කරනවා කියලා. මේකෙන් පුළුවන් ඔබේ Image එක අනිත් අයත් එක්ක Share කරන්න, නැත්නම් වෙන මැෂින් වල Deploy කරන්න.

Image එකක් push කරන්න කලින්, Image එක Tag කරන්න ඕන Registry Name එකත් එක්ක. උදාහරණයක් විදියට, ඔබ my-repo/my-app:1.0 වගේ Tag එකක් දාන්න ඕන.

# Docker Hub එකට Login වෙන්න
docker login

# Local Image එක Tag කරන්න
docker tag my-local-app:latest my-username/my-app:1.0

# Image එක Push කරන්න
docker push my-username/my-app:1.0

Image Remove කිරීම (Deleting Images)

අවශ්‍ය නැති Docker Images Local Machine එකෙන් Delete කරන්න docker rmi (remove image) Command එක පාවිච්චි කරන්න පුළුවන්.

docker rmi node:16-alpine

සැලකිය යුතුයි: යම්කිසි Image එකකින් Run වෙන Container එකක් තියෙනවා නම්, ඒ Image එක Delete කරන්න බැහැ. මුලින්ම Container එක Stop කරලා Remove කරන්න ඕන.

Run වෙන Container තිබුණත් Image එක Delete කරන්න ඕන නම්, -f (force) Flag එක පාවිච්චි කරන්න පුළුවන්. ඒත් ඒකත් එච්චර හොඳ පුරුද්දක් නෙවෙයි.

docker rmi -f node:16-alpine

4. Docker Objects Inspect කිරීම

Docker Images සහ Containers ගැන විස්තර බලන්න Docker Command කිහිපයක් තියෙනවා. මේවා ගැටලු විසඳා ගැනීමට (Troubleshooting) හරිම ප්‍රයෝජනවත්.

Images ලැයිස්තුගත කිරීම

ඔබේ Local Machine එකේ තියෙන හැම Docker Image එකක්ම බලන්න:

docker images

Containers ලැයිස්තුගත කිරීම

Run වෙන Container බලන්න:

docker ps

Run වෙන සහ නැවතිලා තියෙන හැම Container එකක්ම බලන්න:

docker ps -a

Docker Inspect Command එක

docker inspect Command එකෙන් Image එකක් හෝ Container එකක් ගැන සම්පූර්ණ JSON format එකෙන් විස්තර බලාගන්න පුළුවන්. මේකේ Container එකේ Network settings, Volumes, Environment variables, Mounts වගේ ගොඩක් දේවල් තියෙනවා.

Image එකක් Inspect කිරීම

අපි කලින් Pull කරගත්තු node:16-alpine Image එක Inspect කරමු.

docker inspect node:16-alpine

මේ Command එක Run කළාම, Image එකේ හැම විස්තරයක්ම (Layers, Configuration, History, etc.) JSON format එකෙන් පෙන්වනවා. ඔබට විශේෂිත තොරතුරක් පමණක් අවශ්‍ය නම්, --format Flag එක පාවිච්චි කරන්න පුළුවන්.

docker inspect --format='{{.Os}}' node:16-alpine

Container එකක් Inspect කිරීම

අපි Run කරන ලද my-node-app Container එක Inspect කරමු.

docker inspect my-node-app

මේකෙන් Container එකේ Current State, IP Address, Port mappings, Mounts වගේ ගොඩක් වැදගත් තොරතුරු ලබාගන්න පුළුවන්.

Container Logs බැලීම

Container එකක Output (console logs) බලන්න docker logs Command එක පාවිච්චි කරනවා.

docker logs my-node-app

Real-time logs බලන්න අවශ්‍ය නම් -f (follow) Flag එක පාවිච්චි කරන්න පුළුවන්.

docker logs -f my-node-app

අවසන් වශයෙන්

ඉතින් යාළුවනේ, මේ Guide එකෙන් ඔබට Docker Images සහ Containers කියන්නේ මොනවද, ඒවායේ Lifecycle එක කොහොමද, වගේම ඒවා Manage කරන්නේ, Inspect කරන්නේ කොහොමද කියන එක ගැන හොඳ අවබෝධයක් ලැබෙන්න ඇති කියලා හිතනවා. මේවා Docker වල මූලිකම සහ වැදගත්ම සංකල්ප දෙකක්. මේවා හොඳින් තේරුම් ගැනීමෙන් ඔබට Docker Ecosystem එක ඇතුළේ වැඩ කරන්න හරිම ලේසි වේවි.

Docker වලට තව ගොඩක් දේවල් තියෙනවා ඉගෙන ගන්න. Dockerfiles Build කරන හැටි, Volumes, Networks, Docker Compose වගේ දේවල් අපි තව ලිපි වලින් කතා කරමු. මේ මූලික දැනුම තියාගෙන ඔබේම Projects වලට Docker එකතු කරලා බලන්න. එතකොට තමයි මේකේ නියම වටිනාකම තේරෙන්නේ!

ඔබේ අදහස්, ප්‍රශ්න, හෝ මේ Guide එකෙන් ඉගෙන ගත්තු දේවල් පහළින් Comment කරන්න අමතක කරන්න එපා. අපි ඊළඟ ලිපියකින් නැවත හමුවෙමු! සුභ දවසක්!