Docker Networking Essentials Sinhala Guide | Bridge, Host, Port Mapping | Docker ජාලකරණය

Docker Networking Essentials Sinhala Guide | Bridge, Host, Port Mapping | Docker ජාලකරණය

හායි යාළුවනේ! කොහොමද ඉතින්? අද අපි කතා කරන්න යන්නේ modern software development වලට අත්‍යවශ්‍ය දෙයක් ගැන – ඒ තමයි Docker Networking. කන්ටේනර්ස් (containers) කියන්නේ අපේ applications isolate කරලා, හැම තැනම එකම විදියට run කරන්න පුළුවන් සුපිරි ක්‍රමයක් කියලා අපි දන්නවනේ. ඒත් මේ කන්ටේනර්ස් එකිනෙකාත් එක්ක, නැත්නම් පිටත ලෝකයත් එක්ක කතා කරන්නේ කොහොමද? එතැනදී තමයි Docker Networking වල වැදගත්කම කරළියට එන්නේ.

හිතන්නකෝ, අපේ ගෙදර තියෙන වෙන වෙනම කාමර වගේ තමයි Docker containers කියන්නේ. හැබැයි මේ කාමර ඇතුළේ ඉන්න අයට එළියේ අයත් එක්ක කතා කරන්න, නැත්නම් එක කාමරයක ඉන්න කෙනෙකුට තව කාමරයක ඉන්න කෙනෙකුත් එක්ක කතා කරන්න ක්‍රමයක් ඕනෙනේ. ඒක තමයි Docker Networking වලින් කරන්නේ. මේ මාර්ගෝපදේශය හරහා අපි Docker වලට අදාළ ජාලකරණයේ (networking) මූලික කරුණු, පොදු network types කිහිපයක්, port mapping, DNS සහ තවත් වැදගත් දේවල් ගොඩක් ගැන සිංහලෙන් සරලව කතා කරමු. මේවා හොඳට තේරුම් ගත්තොත් ඔයාට Docker containers වලින් වැඩ කරන එක තවත් පහසු වෙයි!

1. Docker Networking වල මූලික අදහස (The Basic Idea of Docker Networking)

Docker containers කියන්නේ එකිනෙකාගෙන් සම්පූර්ණයෙන්ම වෙන් වෙලා තියෙන පොඩි පොඩි පරිසර (isolated environments) කියලා අපි දන්නවා. ඒ කියන්නේ, එක container එකක් ඇතුළේ සිදුවෙන දෙයක් තව container එකකට බලපාන්නේ නැහැ. ඒක හොඳ දෙයක් වුණත්, අපේ applications ගොඩක් වෙලාවට වෙනත් services (උදාහරණයක් විදියට database එකක්, API gateway එකක්, නැත්නම් වෙනත් microservice එකක්) එක්ක කතා කරන්න ඕනේ. එතකොට තමයි Docker ජාලකරණය අවශ්‍ය වෙන්නේ.

සරලවම කිව්වොත්, Docker Networking වලින් කරන්නේ containers වලට IP addresses ලබා දීම සහ ඒ IP addresses හරහා එකිනෙකාට සම්බන්ධ වීමට ඉඩ දීමයි. Docker විසින් මේ වෙනුවෙන් virtual networks නිර්මාණය කරනවා. මේ networks වලට containers සම්බන්ධ වෙලා එකිනෙකාත් එක්ක වගේම පිටත ලෝකයත් එක්ක communicate කරනවා. මේක ටිකක් සංකීර්ණ වුණත්, Docker මේ දේවල් පහසුවෙන් කළමනාකරණය කරන්න අපිට tools සපයනවා.

2. Bridge Networks - පොදුම වර්ගය (The Most Common Type)

Docker Networking වල තියෙන පොදුම network type එක තමයි Bridge Network එක. ඔයා Docker container එකක් වෙනම network එකක් specify නොකර run කරනවා නම්, ඒක default විදියට bridge network එකට connect වෙනවා. මේ network එකෙන් කරන්නේ containers වලට private, internal IP addresses ලබාදීලා, ඒවාට එකිනෙකාත් එක්ක කතා කරන්න ඉඩ දෙන එක.

හිතන්නකෝ, අපේ ගෙදර Wi-Fi router එකක් වගේ තමයි මේ bridge network එක. router එකට connect වෙලා ඉන්න හැම device එකකටම වගේ, මේ bridge network එකට connect වෙලා ඉන්න containers වලට එකිනෙකාත් එක්ක කතා කරන්න පුළුවන්. ඒත් පිටත ලෝකයට කතා කරන්න පුළුවන් වෙන්නේ Network Address Translation (NAT) හරහා. ඒ වගේම, පිටත ලෝකයේ ඉන්න කෙනෙකුට මේ containers වලට කෙලින්ම access වෙන්න බැහැ; ඒකට port mapping අවශ්‍ය වෙනවා (ඒ ගැන අපි ටිකකින් කතා කරමු).

Custom Bridge Networks වල වැදගත්කම

Docker default විදියට `bridge` කියන network එකක් හදනවා. ඒත් අපි recommend කරන්නේ අපේම custom bridge networks හදාගෙන වැඩ කරන එක. ඒ ඇයි?

  1. Name Resolution: Custom bridge network එකක් ඇතුලේ ඉන්න containers වලට එකිනෙකාගේ IP address නොදැන, නම (container name) හරහා communicate කරන්න පුළුවන්. මේක ඇත්තටම සෑහෙන පහසුවක්!
  2. Isolation: ඔයාගේ different applications වලට වෙන වෙනම network හදාගත්තම, ඒවායේ network traffic එකිනෙකාගෙන් වෙන් කරලා තියන්න පුළුවන්.

උදාහරණයක්: Custom Bridge Network එකක් සාදාගෙන containers දෙකක් කතා කරවමු

මුලින්ම අපි custom bridge network එකක් හදමු:

docker network create my_custom_app_network

දැන් අපි container දෙකක් මේ network එකට connect කරලා run කරමු. අපි alpine/git image එක පාවිච්චි කරන්නේ ping command එක තියෙන නිසා.

docker run -d --name app_container1 --network my_custom_app_network alpine/git sleep 3600
docker run -d --name app_container2 --network my_custom_app_network alpine/git sleep 3600

දැන් අපි app_container1 එක ඇතුළට ගිහින් app_container2 එකට ping කරලා බලමු (නමෙන්!).

docker exec -it app_container1 ping app_container2

ඔයාට පේයි, app_container1 එකට app_container2 එකේ IP address නොදැන, නමෙන් ping කරන්න පුළුවන්. මේක තමයි custom bridge network එකක තියෙන ලොකුම වාසියක්!

3. Host සහ None Networks - විශේෂ අවස්ථා (Host and None Networks - Special Cases)

Bridge networks තමයි බහුලවම පාවිච්චි වෙන්නේ. ඒත් සමහර විශේෂ අවස්ථාවලට වෙනත් network types දෙකක් තියෙනවා: ඒ තමයි Host Network සහ None Network.

Host Network

Host network කියන්නේ, container එක ඔයාගේ host machine එකේම network stack එක පාවිච්චි කරන එක. සරලව කිව්වොත්, container එකට වෙනම IP address එකක් ලැබෙන්නේ නැහැ. ඒක host machine එකේම IP address සහ ports පාවිච්චි කරනවා.

  • වාසි (Pros): Performance එක හොඳයි. මොකද network virtualization layer එකක් නැති නිසා.
  • අවාසි (Cons):
    • Security: Container එක host එකේ network stack එකට access වෙන නිසා security අතින් අවදානම් වෙන්න පුළුවන්.
    • Port Conflicts: Host එකේ දැනටමත් පාවිච්චි කරන port එකක් container එකටත් අවශ්‍ය වුණොත් conflict වෙන්න පුළුවන්.
    • Isolation: network isolation එකක් නැහැ.
  • භාවිතා කරන අවස්ථා (Use Cases): Performance sensitive applications වලට, නැත්නම් network stack එකට low-level access අවශ්‍ය monitoring tools වගේ දේවල් වලට මේක පාවිච්චි කරන්න පුළුවන්.

භාවිතා කරන ආකාරය:

docker run -d --network host --name my_host_app nginx

මේ container එක 80 port එකෙන් host එකේම IP address එකෙන් access කරන්න පුළුවන්. ඒ කියන්නේ, host එකේ localhost:80 වලට request කරනකොට Nginx container එකෙන් response එක එනවා.

None Network

None network කියන්නේ, container එකකට කිසිම network interface එකක් නොදෙන එක. ඒ කියන්නේ, මේ container එකට එළියත් එක්කවත්, වෙන container එකක් එක්කවත් කතා කරන්න බැහැ. සම්පූර්ණයෙන්ම වෙන් වෙලා තියෙන්නේ.

  • වාසි (Pros): උපරිම security සහ isolation.
  • අවාසි (Cons): කිසිම network communication එකක් කරන්න බැහැ.
  • භාවිතා කරන අවස්ථා (Use Cases): Files generate කරන, computation විතරක් කරන, කිසිම external access එකක් අවශ්‍ය නැති containers වලට මේක හොඳයි.

භාවිතා කරන ආකාරය:

docker run -it --network none --name my_isolated_app alpine echo "Hello, I'm isolated!"

4. Port Mapping (Port Forwarding) - එළියට දොර අරින හැටි (How to Open the Door to the Outside)

අපි කලින් කතා කළානේ bridge network එකක ඉන්න containers වලට පිටත ලෝකයෙන් කෙලින්ම access කරන්න බැහැ කියලා. එතකොට අපේ web application එකක් වගේ container එකක් deploy කරාම, ඒක බ්‍රවුසරයෙන් බලන්නේ කොහොමද? එතැනදී තමයි Port Mapping නැත්නම් Port Forwarding කියන සංකල්පය එන්නේ.

Port Mapping වලින් කරන්නේ host machine එකේ port එකක්, container එකක port එකකට map කරන එක. ඒ කියන්නේ, host machine එකේ අදාළ port එකට එන traffic එක, Docker විසින් container එකේ අදාළ port එකට redirect කරනවා. හරියට, ඔයාගේ ගෙදරට කෙනෙක් ආවම, එළිපිට තියෙන ගේට්ටුවෙන් ඇතුළට ඇවිත්, එතැනින් ඔයාගේ කාමරේ දොර ළඟට යනවා වගේ.

මේකට අපි -p නැත්නම් --publish flag එක පාවිච්චි කරනවා.

Syntax: -p <host_port>:<container_port>

උදාහරණයක්: Nginx web server එකක් host machine එකේ 8080 port එකට map කරමු

docker run -d -p 8080:80 --name my_nginx_server nginx

මේ command එකෙන් කරන්නේ Nginx container එකක් run කරලා, ඒකේ 80 port එක (Nginx default විදියට listen කරන port එක) host machine එකේ 8080 port එකට map කරන එක. දැන් ඔයාට web browser එකකින් http://localhost:8080 (නැත්නම් ඔයාගේ host machine එකේ IP address:8080) හරහා Nginx server එක access කරන්න පුළුවන්.

ඔයාට කිහිපයක් port map කරන්නත් පුළුවන්:

docker run -d -p 80:80 -p 443:443 --name my_web_app my_image

තව දෙයක්, -P (කැපිටල් P) flag එකෙන් Docker විසින් random host port එකක් container එකේ exposed ports වලට map කරනවා. මේක ටෙස්ට් කරන අවස්ථාවලදී වගේ ප්‍රයෝජනවත් වෙන්න පුළුවන්.

docker run -d -P --name random_port_nginx nginx

මේ command එකෙන් පස්සේ docker ps ගහලා බැලුවොත්, host එකේ random port එකක් 80 ට map වෙලා තියෙනවා පෙනෙයි.

5. Container DNS - නම් වලින් හොයාගන්න හැටි (How to Find by Names)

අපි කලින් කතා කළා custom bridge network එකක් ඇතුළේ ඉන්න containers වලට එකිනෙකාගේ නම (container name) පාවිච්චි කරලා communicate කරන්න පුළුවන් කියලා. මේක වෙන්නේ Docker තමන්ටම ආවේණික DNS (Domain Name System) server එකක් පවත්වාගෙන යන නිසා.

සාමාන්‍යයෙන්, ඔයා custom bridge network එකක් හදලා, ඒකට containers කිහිපයක් attach කරාම, Docker DNS server එක container එකේ නමට අදාළ IP address එක resolve කරනවා. මේක අපිට IP addresses මතක තියාගැනීමේ කරදරයෙන් නිදහස් කරනවා. Microservices architecture එකක් වගේ multiple containers එක්ක වැඩ කරනකොට මේක හරිම වැදගත්.

අපි කලින් දුන්න app_container1 සහ app_container2 උදාහරණය මතක් කරගන්න. app_container1 එකට ping app_container2 කියලා ගැහුවම, Docker DNS එක app_container2 කියන නමට අදාළ IP address එක හොයාගෙන ping command එකට දෙනවා. සුපිරි වැඩක් නේද?

ඔයාට අවශ්‍ය නම් container එකක් run කරනකොට custom DNS servers specify කරන්නත් පුළුවන් --dns flag එක පාවිච්චි කරලා:

docker run -d --name my_app --dns 8.8.8.8 --dns 8.8.4.4 my_image

මේකෙන් Google Public DNS servers (8.8.8.8 and 8.8.4.4) පාවිච්චි කරන්න කියලා Docker ට කියනවා.

6. Network Namespaces - Docker වල අභ්‍යන්තරය (Inside Docker's Internals)

Docker මේ හැම network isolation එකක්ම කරන්නේ කොහොමද කියලා කවදාවත් හිතලා තියෙනවද? ඒකට මූලික වශයෙන් Linux kernel එකේ තියෙන Network Namespaces කියන feature එක පාවිච්චි කරනවා.

Network Namespace එකක් කියන්නේ, Linux kernel එකේ networking resources (ජාල කාඩ්පත්, IP addresses, routing tables, firewall rules වගේ දේවල්) වෙන වෙනම process groups වලට වෙන් කරන ක්‍රමයක්. හරියට, එකම පරිගණකය ඇතුළේ වෙන වෙනම, ස්වාධීන network stack තියෙනවා වගේ.

සාමාන්‍යයෙන්, ඔයා Docker container එකක් run කරනකොට (Host network mode හැර), Docker විසින් අලුත් network namespace එකක් හදලා, ඒ container එක ඒ namespace එක ඇතුළේ run කරනවා. මේ නිසා තමයි එක container එකක IP address එක, routing table එක තව container එකකට බලපාන්නේ නැත්තේ. මේ isolation එක තමයි Docker වල ප්‍රධානම වාසියක්!

මේ සංකල්පය ගැඹුරින් ඉගෙන ගන්න එකට වඩා, Docker මේ වගේ Linux kernel features පාවිච්චි කරනවා කියලා දැනගැනීමෙන්, Docker ක්‍රියා කරන ආකාරය ගැන හොඳ අවබෝධයක් ලැබෙනවා.

7. docker network Commands - ජාල කළමනාකරණය (Network Management)

Docker ජාල කළමනාකරණය කරන්න සෑහෙන commands ප්‍රමාණයක් තියෙනවා. මේවා පාවිච්චි කරලා අපිට networks හදන්න, බලන්න, මකන්න, containers connect කරන්න පුළුවන්.

a. Networks ලැයිස්තුගත කිරීම (Listing Networks)

ඔයාගේ Docker host එකේ තියෙන හැම network එකක්ම බලන්න මේ command එක පාවිච්චි කරන්න:

docker network ls

මේකෙන් network ID එක, නම, driver එක සහ scope එක පෙන්නනවා.

b. Network එකක් නිර්මාණය කිරීම (Creating a Network)

Custom bridge network එකක් හදන්න මේ command එක පාවිච්චි කරන්න:

docker network create <network_name>

උදාහරණයක්:

docker network create my_backend_network

c. Network විස්තර බැලීම (Inspecting a Network)

විශේෂිත network එකක් ගැන වැඩි විස්තර (IP range, connected containers, gateway, etc.) දැනගන්න මේ command එක පාවිච්චි කරන්න:

docker network inspect <network_name_or_id>

උදාහරණයක්:

docker network inspect my_backend_network

d. Containers Networks වලට සම්බන්ධ කිරීම/වෙන් කිරීම (Connecting/Disconnecting Containers)

දැනට run වෙන container එකක් network එකකට connect කරන්න:

docker network connect <network_name> <container_name_or_id>

උදාහරණයක්:

docker network connect my_backend_network my_existing_app

Container එකක් network එකකින් disconnect කරන්න:

docker network disconnect <network_name> <container_name_or_id>

e. Network එකක් ඉවත් කිරීම (Removing a Network)

Network එකක් මකන්න (ඒකට connected වෙලා containers නොතිබිය යුතුයි):

docker network rm <network_name_or_id>

උදාහරණයක්:

docker network rm my_backend_network

මේ commands ටික හොඳට පුරුදු වුණාම ඔයාට Docker networking හරියට කළමනාකරණය කරන්න පුළුවන්.

නිගමනය (Conclusion)

ඉතින් යාළුවනේ, මේ මාර්ගෝපදේශය හරහා අපි Docker Networking Essentials ගැන හොඳට ඉගෙන ගත්තා කියලා මම හිතනවා. Docker containers වලට තනියම වැඩ කරන්න බැහැ, ඒවාට එකිනෙකාත් එක්ක, පිටත ලෝකයත් එක්ක කතා කරන්න networking අත්‍යවශ්‍යයි. අපි Bridge networks (ඒකේ තියෙන name resolution වාසිය), Host සහ None network modes වල විශේෂතා, Port Mapping වලින් අපේ applications expose කරන හැටි, Container DNS ක්‍රියා කරන ආකාරය සහ Docker network commands පාවිච්චි කරලා networks කළමනාකරණය කරන හැටි ගැන කතා කළා.

මේ concepts හොඳට තේරුම් ගැනීමෙන් ඔයාට Docker පාවිච්චි කරලා වඩාත් robust සහ scalable applications හදන්න පුළුවන් වෙයි. Microservices architectures වගේ සංකීර්ණ deployments වලදී Docker networking කියන්නේ නැතුවම බැරි දෙයක්.

දැන් ඉතින් අදම ඔයාගේ Docker environment එකේ මේවා අත්හදා බලන්න! Custom networks හදලා, containers කිහිපයක් run කරලා, එකිනෙකාට ping කරලා බලන්න. Port mapping කරලා web server එකක් access කරලා බලන්න. ඔයාගේ අත්දැකීම් කොහොමද? මොනවා හරි ප්‍රශ්න තියෙනවා නම් පහළින් comment කරන්න. අපි උත්සාහ කරමු උදව් කරන්න. එහෙනම් තවත් අලුත් දෙයක් එක්ක ඉක්මනින්ම හම්බවෙමු! ජය වේවා!