Docker Networking Essentials | Container Networks Sinhala Guide
ආයුබෝවන් හැමෝටම! 👋 අද අපි කතා කරන්න යන්නේ Docker ගැන කතා කරනකොට ගොඩක් වැදගත්, ඒ වගේම සමහර වෙලාවට පොඩ්ඩක් සංකීර්ණ වෙන්න පුළුවන් මාතෘකාවක් ගැන – ඒ තමයි Docker Networking. අපේ applications Docker containers ඇතුලේ run කරනකොට, ඒ containers එකිනෙකා එක්ක, ඒ වගේම අපේ host machine එකත් එක්ක, අන්තර්ජාලයත් එක්ක කොහොමද කතා බහ කරන්නේ කියලා තේරුම් ගැනීම අත්යවශ්යයි.
හිතන්න, ඔයාගේ application එකට web server එකක් (උදාහරණයක් විදිහට Nginx) තියෙනවා, ඒක database එකක් (උදාහරණයක් විදිහට PostgreSQL) එක්ක කතා කරන්න ඕනේ කියලා. මේ දෙකම වෙන වෙනම Docker containers විදිහට run වෙනවා නම්, ඒ දෙන්නා අතරේ connection එකක් හදන්නේ කොහොමද? එතනට තමයි Docker Networking එන්නේ.
මේ tutorial එකෙන් අපි Docker Networking වල මූලික සංකල්ප සරලව තේරුම් ගමු. අපි මේවා ගැන කතා කරනවා:
- Bridge Networks (මේක තමයි default එක)
- Host Networks සහ None Networks
- Port Mapping (මේක නැතුව web app එකක් පාවිච්චි කරන්න බෑ!)
- Container DNS (නමකින් containers හොයාගන්න විදිහ)
- docker network commands (ජාල කළමනාකරණයට)
ඉතින්, ඔයා Docker වලට අලුත් කෙනෙක් වුණත්, නැත්නම් දැනටමත් Docker පාවිච්චි කරන කෙනෙක් වුණත්, මේ දැනුම ඔයාගේ project වලට ගොඩක් ප්රයෝජනවත් වෙයි කියලා මට විශ්වාසයි. එහෙනම්, අපි පටන් ගමු!
Docker Network Fundamentals - මොකක්ද මේ Docker Networking?
සරලවම කිව්වොත්, Docker Networking කියන්නේ Docker containers වලට එකිනෙකා සමඟ සහ host machine එක සමඟ සන්නිවේදනය කරන්න අවශ්ය යටිතල පහසුකම් සපයන ක්රමවේදයට. සාමාන්යයෙන්, Docker install කරනකොටම එයාලා virtual network interface එකක් හදනවා. ඒක හරියට ඔයාගේ පරිගණකයේ තියෙන network card එකක් වගේ, හැබැයි මේක software වලින් හැදුව එකක්. හැම Docker container එකකටම මේ network interface එක හරහා IP address එකක් ලැබෙනවා.
Docker container එකක් run කරනකොට, එයාලාට තමන්ටම කියලා වෙනම network namespace එකක් හම්බවෙනවා. මේක හරියට "ගෙයක් ඇතුළේ වෙනම කාමරයක්" වගේ. හැම container එකක්ම තමන්ගේම "කාමරයේ" ඉඳගෙන network එකට සම්බන්ධ වෙනවා. මේ නිසා එක container එකක වෙන දේවල් තව container එකකට බලපාන්නේ නැහැ (unless you explicitly connect them).
Docker networking වලදී ප්රධාන වශයෙන් network drivers වර්ග කිහිපයක් තියෙනවා. මේ tutorial එකේදී අපි වඩාත් බහුලව භාවිත කරන සහ වැදගත් වන drivers කිහිපයක් ගැන කතා කරමු.
Bridge Networks - පාලමෙන් එහා මෙහා
Docker වලදී අපිට හම්බවෙන default network driver එක තමයි Bridge Network එක. ඔයා docker run command එකක් execute කරනකොට කිසිම network එකක් specify කරන්නේ නැත්නම්, Docker විසින් auto generate කරන default bridge network එකට තමයි container එක සම්බන්ධ වෙන්නේ.
Default Bridge Network එක කොහොමද වැඩ කරන්නේ?
Docker install කරනකොට, docker0 කියලා virtual bridge එකක් හැදෙනවා. මේක හරියට network switch එකක් වගේ. හැම container එකකටම මේ bridge එකට සම්බන්ධ වෙන්න virtual network interface එකක් ලැබෙනවා. මේ bridge එක හරහා containers වලට host machine එකටත්, අන්තර්ජාලයටත්, සහ එකම bridge network එකේ ඉන්න අනිත් containers වලටත් සම්බන්ධ වෙන්න පුළුවන්.
හැබැයි, default bridge network එකේ තියෙන පොඩි ගැටලුවක් තමයි, containers වලට IP addresses වලින් විතරයි එකිනෙකා හොයාගන්න පුළුවන් වෙන්නේ. ඒක ඇත්තටම එතරම් පහසු නැහැ. ඒකයි අපි User-Defined Bridge Networks වලට යන්නේ.
User-Defined Bridge Networks - අපිට ඕන විදිහට ජාලයක් හදමු
User-defined bridge network එකක් කියන්නේ ඔයාටම කියලා හදාගන්න පුළුවන් bridge network එකක්. මේකේ තියෙන ලොකුම වාසිය තමයි, මේ network එකට සම්බන්ධ වෙන containers වලට IP addresses වෙනුවට names (service discovery) වලින් එකිනෙකා හොයාගන්න පුළුවන් වීම. ඒ වගේම මේ network එකේ තියෙන containers එකිනෙකාගෙන් හොඳින් isolate කරලා තියෙනවා, ඒ කියන්නේ ආරක්ෂාව වැඩියි.
ප්රායෝගික උදාහරණයක්:
අපි හිතමු අපිට web server එකක් (Nginx) සහ database එකක් (PostgreSQL) Docker containers විදිහට run කරන්න ඕනේ කියලා. මේ දෙන්නටම එකිනෙකා එක්ක කතා කරන්න ඕනේ. මේකට user-defined bridge network එකක් පාවිච්චි කරන්නේ කොහොමද කියලා බලමු.
මුලින්ම අපි අපේම bridge network එකක් හදමු:
docker network create my-app-networkදැන් මේ my-app-network එකට අපේ PostgreSQL container එක සම්බන්ධ කරමු:
docker run -d \
--name my-postgres \
--network my-app-network \
-e POSTGRES_PASSWORD=mysecretpassword \
postgres:13මෙහිදී:
-d: container එක background එකේ run කරන්න.--name my-postgres: container එකටmy-postgresකියලා නමක් දෙන්න.--network my-app-network: අපි හදපු network එකට මේ container එක connect කරන්න.-e POSTGRES_PASSWORD=mysecretpassword: database එකට environment variable එකක් දෙන්න.
දැන් අපි Nginx web server එකත් මේ network එකටම connect කරමු:
docker run -d \
--name my-nginx \
--network my-app-network \
-p 80:80 \
nginx:latestමෙහිදී -p 80:80 කියන එකෙන් අපි host machine එකේ port 80 එක container එකේ port 80 එකට map කරනවා. (මේ ගැන Port Mapping section එකේදී තවත් විස්තර කරමු).
දැන්, my-nginx container එකට my-postgres container එකට my-postgres කියන නමෙන්ම access කරන්න පුළුවන්. උදාහරණයක් විදිහට Nginx එක ඇතුලේ ඉඳන් PostgreSQL server එකට connect වෙන්න my-postgres:5432 වගේ endpoint එකක් පාවිච්චි කරන්න පුළුවන්. මේක තමයි service discovery කියන්නේ!
docker network ls command එකෙන් ඔයාට තියෙන networks මොනවද කියලා බලන්න පුළුවන්:
docker network lsHost Network - ජාල හුදකලා කිරීමකින් තොරව
Host Network එකක් කියන්නේ Docker container එකක් host machine එකේ network stack එකම පාවිච්චි කරන එකට. මේකේදී container එකට වෙනම network namespace එකක් හම්බවෙන්නේ නැහැ. container එක host machine එකේ IP address එකම පාවිච්චි කරනවා, ඒ වගේම host machine එකට විවෘත වෙලා තියෙන හැම port එකකටම container එකටත් access කරන්න පුළුවන්.
භාවිතා කරන්නේ කවදද?
- Performance: සමහර වෙලාවට network performance වැඩි කරගන්න අවශ්ය වුණාම (network latency අඩු කරන්න).
- Special Use Cases: සමහර network-intensive applications වලට, හෝ host machine එකේ network settings වලට direct access අවශ්ය වන අවස්ථාවලදී.
අවාසි:
- No Isolation: Container එක host machine එකෙන් network මට්ටමින් isolate වෙන්නේ නැහැ. ඒ නිසා ආරක්ෂාව අඩුයි.
- Port Conflicts: Host machine එකේ port එකක් දැනටමත් භාවිතයේ නම්, container එකට ඒ port එක පාවිච්චි කරන්න බැහැ.
Host network එකක් පාවිච්චි කරන්න මේ විදිහට command එක දෙන්න පුළුවන්:
docker run -d \
--name my-host-app \
--network host \
my-image:latestමේක ඉතා පරිස්සමෙන් පාවිච්චි කරන්න ඕනේ option එකක්, විශේෂයෙන් production environment එකකදී.
None Network - ජාලයක් නැතිව
None Network එකක් කියන්නේ නමටම අනුව, container එකට කිසිම network interface එකක් නැහැ. ඒ කියන්නේ, container එකට අන්තර්ජාලයට යන්න බැහැ, අනිත් containers එක්ක කතා කරන්න බැහැ, host machine එකත් එක්ක කතා කරන්න බැහැ. Container එකක් සම්පූර්ණයෙන්ම network එකෙන් disconnect වෙනවා.
භාවිතා කරන්නේ කවදද?
- Security: සමහර වෙලාවට container එකකට කිසිම network access එකක් අවශ්ය නැති, ඉතාමත්ම secure විදිහට run කරන්න ඕනේ අවස්ථා වලදී (උදා: sensitive data processing).
- Debugging: Network සම්බන්ධ ගැටලුවක් නැතුව run වෙනවද බලන්න.
- Batch Jobs: Network access නැතුව තමන්ගේ කාර්යය ඉටු කරලා ඉවර වෙන batch jobs වලට.
None network එකක් පාවිච්චි කරන්න මේ විදිහට command එක දෙන්න පුළුවන්:
docker run -d \
--name my-isolated-app \
--network none \
my-image:latestPort Mapping (Exposing Ports) - දොරටු විවෘත කිරීම
අපි කලින් Nginx උදාහරණයේදී -p 80:80 කියලා දැක්කා. මේකට තමයි Port Mapping නැත්නම් Port Forwarding කියන්නේ. මේකෙන් කරන්නේ host machine එකේ port එකක් Docker container එකක port එකකට සම්බන්ධ කරන එක. මේක අත්යවශ්යයි, මොකද container එක ඇතුලේ run වෙන application එකක් host machine එකෙන් (ඒ කියන්නේ ඔයාගේ පරිගණකයෙන් හෝ අන්තර්ජාලයෙන්) access කරන්න නම් මේ විදිහට port එකක් map කරන්නම වෙනවා.
හිතන්න ඔයාගේ Nginx web server එක container එක ඇතුලේ port 80 එකේ run වෙනවා. ඒක host machine එකෙන් localhost:80 වගේ access කරන්න නම්, host machine එකේ port 80 එක container එකේ port 80 එකට map කරන්න ඕනේ.
Port mapping කරන්නේ docker run command එකේදී -p (lowercase) නැත්නම් -P (uppercase) flags පාවිච්චි කරලා.
-p host_port:container_port: මේකෙන් අපිට අවශ්ය විදිහට specific host port එකක් specific container port එකකට map කරන්න පුළුවන්.- උදා:
docker run -d -p 8080:80 nginx: Host එකේ port 8080 එක container එකේ port 80 එකට map කරනවා. එතකොටlocalhost:8080කියලා access කරන්න පුළුවන්. - උදා:
docker run -d -p 127.0.0.1:80:80 nginx: මේකෙන් host machine එකේ specific IP address එකකට (මෙහිදීlocalhost) විතරක් port එක map කරන්න පුළුවන්.
- උදා:
-P(uppercase): මේකෙන් Docker විසින් container එකේ expose කරලා තියෙන හැම port එකක්ම host machine එකේ random, available port එකකට map කරනවා. මේක ප්රයෝජනවත් වෙන්නේ අපිට exact port එකක් අවශ්ය නැති අවස්ථාවලදී.
Port Mapping උදාහරණය:
අපි Node.js web application එකක් හදලා තියෙනවා කියලා හිතමු, ඒක container එක ඇතුලේ port 3000 එකේ run වෙනවා. අපි ඒක host machine එකේ port 8000 එකෙන් access කරන්න ඕනේ.
# මේ Node.js app එකක් තියෙන Docker image එකක් කියලා හිතමු
docker run -d \
--name my-node-app \
-p 8000:3000 \
my-node-app-image:latestදැන්, ඔයාට web browser එකේ http://localhost:8000 කියලා ගහලා ඔයාගේ Node.js application එක access කරන්න පුළුවන්.
Container DNS and Service Discovery - නමකින් හොයාගමු!
කලින් අපි user-defined bridge network ගැන කතා කරනකොට කිව්වා containers වලට නමකින් එකිනෙකා හොයාගන්න පුළුවන් කියලා. මේකට තමයි Service Discovery කියන්නේ, සහ මේක සිද්ධ වෙන්නේ Docker විසින් සපයන built-in DNS (Domain Name System) service එක හරහා.
ඔයා docker run command එකේදී --name flag එකෙන් container එකකට නමක් දුන්නොත්, ඒ නමෙන් network එක ඇතුලේ ඉන්න අනිත් containers වලට ඒ container එකට connect වෙන්න පුළුවන්. මේක IP addresses මත රඳා පැවතීමට වඩා ගොඩක් පහසුයි, මොකද IP addresses වෙනස් වෙන්න පුළුවන්.
කොහොමද මේක වැඩ කරන්නේ?
user-defined network එකකට connect වෙලා ඉන්න හැම container එකක්ම, ඒ network එකේ ඉන්න අනිත් containers වලට තමන්ගේ නමින් resolve කරන්න පුළුවන් වෙන විදිහට Docker විසින් DNS entries maintain කරනවා.
අපේ Nginx සහ PostgreSQL උදාහරණය නැවත බලමු:
- අපි
my-app-networkකියන network එක හැදුවා. my-postgrescontainer එක මේ network එකට join කළා.my-nginxcontainer එකත් මේ network එකට join කළා.
my-nginx container එක ඇතුලේ ඉඳන්, my-postgres container එකට connect වෙන්න my-postgres කියන hostname එක පාවිච්චි කරන්න පුළුවන්. PostgreSQL server එක default port 5432 එකේ run වෙනවා නම්, connection string එක host=my-postgres port=5432 වගේ දෙයක් වෙන්න පුළුවන්. මේක docker-compose වගේ tools වලදී ඉතාමත්ම ප්රයෝජනවත් වෙනවා.
Network Namespaces - යටින් සිදුවන දේ
Docker networking වල පදනම තමයි Linux Network Namespaces. මේවා Linux kernel එකේ feature එකක්. Network namespace එකක් කියන්නේ, ඒක ඇතුළේ තියෙන processes වලට තමන්ටම කියලා වෙනම network interface, routing tables, IP addresses, port numbers වගේ network resources set එකක් තියෙනවා.
සරලව කිව්වොත්, හැම Docker container එකක්ම තමන්ගේම Network Namespace එකක් ඇතුළේ run වෙනවා. මේ නිසා, container එකක් තමන්ගේම network settings තියාගෙන, host machine එකෙන් සහ අනිත් containers වලින් network මට්ටමින් සම්පූර්ණයෙන්ම isolate වෙලා ඉන්නවා. Bridge networks, host networks වගේ දේවල් මේ Network Namespaces මත තමයි ගොඩනැගිලා තියෙන්නේ. මේ සංකල්පය අවබෝධ කර ගැනීමෙන් Docker networking වල ගැඹුර තේරුම් ගන්න උදව් වෙනවා.
Docker Network Commands - ජාල කළමනාකරණය
Docker networks manage කරන්න අපිට ගොඩක් වැදගත් commands ටිකක් තියෙනවා. මේවා පාවිච්චි කරලා අපිට networks හදන්න, බලන්න, modify කරන්න පුළුවන්.
docker network ls: ඔයාගේ Docker host එකේ තියෙන හැම network එකක්ම list කරන්න මේ command එක පාවිච්චි කරනවා.
docker network lsOutput එක මේ වගේ වෙන්න පුළුවන්:
NETWORK ID NAME DRIVER SCOPE
90e1f7d5c9e2 bridge bridge local
40f7b0a1d3f9 host host local
5b3f7c1d9a2e my-app-network bridge local
d8e4f5a6b7c0 none null localdocker network create [network_name]: අලුත් user-defined bridge network එකක් හදන්න.
docker network create my-new-custom-networkdocker network inspect [network_name]: Specific network එකක විස්තර බැලීමට. මේකෙන් network ID එක, driver එක, IPAM (IP Address Management) settings, සහ ඒ network එකට connect වෙලා ඉන්න containers මොනවද කියන එකත් බලාගන්න පුළුවන්.
docker network inspect my-app-networkමේ command එකේ output එක JSON format එකෙන් එනවා, ඒක ගොඩක් විස්තරාත්මකයි. උදාහරණයක් විදිහට:
[
{
"Name": "my-app-network",
"Id": "5b3f7c1d9a2e...",
"Created": "2023-10-27T10:00:00.123456789Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"e1f2d3c4b5a6...": {
"Name": "my-postgres",
"EndpointID": "f7a8b9c0d1e2...",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16"
},
"a1b2c3d4e5f6...": {
"Name": "my-nginx",
"EndpointID": "c3d4e5f6a7b8...",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16"
}
},
"Options": {},
"Labels": {}
}
]docker network connect [network_name] [container_name/id]: දැනට run වෙන container එකක් network එකකට connect කරන්න.
docker network connect my-app-network existing-container-namedocker network disconnect [network_name] [container_name/id]: Container එකක් network එකකින් disconnect කරන්න.
docker network disconnect my-app-network my-nginxdocker network rm [network_name/id]: Network එකක් delete කරන්න. Network එකක් delete කරන්න කලින් ඒකට connect වෙලා ඉන්න හැම container එකක්ම disconnect කරන්න ඕනේ.
docker network rm my-new-custom-networkමේ commands පාවිච්චි කරලා ඔයාගේ Docker networking setup එක හොඳින් maintain කරන්න පුළුවන්.
Conclusion: අවසාන වශයෙන්
ඉතින් යාලුවනේ, මේ tutorial එකෙන් අපි Docker Networking වල මූලික සංකල්ප, ඒ වගේම ප්රධාන network drivers (Bridge, Host, None) ගැන, Port Mapping වල වැදගත්කම ගැන, සහ containers වලට නමකින් එකිනෙකා හොයාගන්න පුළුවන් Service Discovery යාන්ත්රණය ගැනත් ඉගෙන ගත්තා. ඒ වගේම Docker networks manage කරන්න අවශ්ය docker network commands කිහිපයකුත් අපි බැලුවා.
Docker කියන්නේ containerization සඳහා තියෙන powerful tool එකක්. ඒකේ networking part එක හරියට තේරුම් ගැනීම ඔයාට scalable, resilient applications build කරන්න ගොඩක් උදව් වෙනවා. මතක තියාගන්න, applications develop කරනකොට, security, performance, සහ maintainability ගැන හිතලා නිවැරදි network strategy එකක් තෝරා ගැනීම අත්යවශ්යයි.
දැන් ඔයාට හොඳ අවබෝධයක් තියෙනවා Docker containers එකිනෙකා සමඟ සහ host machine එක සමඟ සන්නිවේදනය කරන්නේ කොහොමද කියලා. මේ දැනුම පාවිච්චි කරලා ඔයාගේ ඊළඟ Docker project එකේදී මේ concepts implement කරන්න උත්සාහ කරන්න.
ඔයාගේ අත්දැකීම් මොනවාද? ඔයා කැමතිම Docker network වර්ගය මොකක්ද? පහත comment section එකේ ඔයාගේ අදහස් අපිත් එක්ක බෙදාගන්න! 💬
සාර්ථක Docker ගමනක්! 🚀