Docker నెట్వర్క్లు మరియు పోర్ట్ ఫార్వార్డింగ్
కంటైనర్లు ఒకదాన్ని ఒకటి ఎలా చూస్తాయి, పోర్ట్ను పబ్లిష్ చేయడం సాధారణ EXPOSE నుండి ఎలా భిన్నంగా ఉంటుంది, Docker ఎందుకు ufw నియమాలను బైపాస్ చేస్తుంది.
23 ఆగస్టు, 2026న నవీకరించబడింది
కంటైనర్ సమస్యల్లో సగం నెట్వర్క్కు సంబంధించినవే ఉంటాయి: ఒక సర్వీస్ డేటాబేస్ను చేరుకోలేకపోవడం, ఒక పోర్ట్ ఆక్రమించబడి ఉండటం, ప్యానెల్ అకస్మాత్తుగా మొత్తం ఇంటర్నెట్కు బహిర్గతమవడం. ఇది ఎలా పనిచేస్తుందో విడమర్చి చూద్దాం.
మూడు రకాల నెట్వర్క్లు
- bridge — డిఫాల్ట్. కంటైనర్లకు అంతర్గత చిరునామాలు లభిస్తాయి, అవి ఒకదానితో ఒకటి సంభాషిస్తాయి; బయటకు హోస్ట్ NAT ద్వారా వెళ్తాయి.
- host — కంటైనర్ నేరుగా హోస్ట్ నెట్వర్క్ను ఉపయోగిస్తుంది; పోర్ట్ పబ్లిషింగ్ అవసరం లేదు, పని చేయదు కూడా. వేగంగా ఉంటుంది, కానీ ఐసోలేషన్ ఉండదు: కంటైనర్ పోర్ట్ 80 అంటే హోస్ట్ పోర్ట్ 80.
- none — నెట్వర్క్ అసలు ఉండదు. అవసరం లేని టాస్క్ల కోసం.
మీరు సృష్టించిన లేదా Compose సృష్టించిన కస్టమ్ నెట్వర్క్ డిఫాల్ట్ bridge నుండి ఒక ముఖ్యమైన విషయంలో భిన్నంగా ఉంటుంది: అందులో పేరు రిజల్యూషన్ పని చేస్తుంది. app కంటైనర్ db కంటైనర్ను db అనే పేరుతో చేరుకోగలదు.
docker network create backend
docker network ls
docker network inspect backend
Composeలో అలాంటి నెట్వర్క్ ప్రతి ప్రాజెక్ట్ కోసం ఆటోమేటిక్గా సృష్టించబడుతుంది.
పోర్ట్ పబ్లిషింగ్
ports:
- "127.0.0.1:8080:8080" # accessible only from the machine itself
- "80:80" # accessible to the whole internet
ఎడమవైపు హోస్ట్లోని పోర్ట్, కుడివైపు కంటైనర్ లోపలి పోర్ట్. ఇమేజ్లోని EXPOSE డైరెక్టివ్ ఏదీ పబ్లిష్ చేయదు: అది అప్లికేషన్ ఏ పోర్ట్లో వింటుందో తెలిపే ఒక గమనిక మాత్రమే.
నియమం సులభం: బయటి నుండి యాక్సెస్ అవసరమైనవి మాత్రమే పబ్లిష్ చేయండి. డేటాబేస్, ప్యానెల్, అంతర్గత API లను 127.0.0.1పై ఉంచండి, సర్టిఫికెట్ ఉన్న వెబ్ సర్వర్ వాటిని బయటకు బహిర్గతం చేస్తుంది.
Docker
iptablesనియమాలను తనే రాస్తుంది, అది కూడాufwనిర్వహించే చైన్లకు ముందే రాస్తుంది.-p 8080:8080గా పబ్లిష్ చేసిన పోర్ట్,ufw“deny” చూపించినా ఇంటర్నెట్ నుండి యాక్సెస్ అవుతుంది. ఫైర్వాల్పై ఆధారపడకండి — పోర్ట్ను127.0.0.1కు బైండ్ చేయండి.
కంటైనర్ల మధ్య సంభాషణ
services:
app:
networks: [frontend, backend]
db:
networks: [backend]
proxy:
networks: [frontend]
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
ఇక్కడ డేటాబేస్ అప్లికేషన్కు మాత్రమే యాక్సెస్ అవుతుంది, బయటకు వెబ్ సర్వర్ మాత్రమే కనిపిస్తుంది. ఏ స్టాక్కైనా ఇదే సరైన సెటప్.
కంటైనర్ లోపల పక్కనున్న దాన్ని దాని సర్వీస్ పేరుతో సంబోధించండి: postgres://db:5432/app. కంటైనర్ లోపల localhost అంటే కంటైనర్ తానే, హోస్ట్ కాదు — latest తర్వాత రెండో అత్యంత సాధారణ పొరపాటు ఇది.
హోస్ట్పై నడుస్తున్న సర్వీస్ను కంటైనర్ నుండి చేరుకోవడానికి host.docker.internal అనే పేరును ఉపయోగించండి, దీని కోసం ఇది జోడించండి:
extra_hosts:
- "host.docker.internal:host-gateway"
డయాగ్నస్టిక్స్
docker compose exec app ping -c2 db
docker compose exec app getent hosts db
sudo ss -tulpn | grep LISTEN
docker port <container>
ఒక పోర్ట్ నిజానికి ఏ ఇంటర్ఫేస్పై వింటుందో ss చూపిస్తుంది: 0.0.0.0:8080 — బయటకు తెరిచి ఉంది, 127.0.0.1:8080 — లేదు.
సాధారణ పొరపాట్లు
- “Port already in use”. దాన్ని మరో కంటైనర్ లేదా హోస్ట్ సర్వీస్ ఆక్రమించి ఉంటుంది.
sudo ss -tulpn | grep :80దోషిని కనుగొంటుంది. - వేర్వేరు Compose ప్రాజెక్ట్ల్లోని కంటైనర్లు ఒకదాన్ని ఒకటి చూడలేవు. ప్రతి ప్రాజెక్ట్కు దాని స్వంత నెట్వర్క్ ఉంటుంది.
networks: { shared: { external: true } }ద్వారా వాటిని స్పష్టంగా కనెక్ట్ చేయండి. - అప్లికేషన్ కంటైనర్ లోపల
127.0.0.1పై వింటుంది. అప్పుడు పబ్లిషింగ్ సహాయపడదు: కంటైనర్ బయటి నుండి దాన్ని చేరుకోలేరు. అప్లికేషన్ను0.0.0.0పై వినేలా కాన్ఫిగర్ చేయండి. - బ్యాండ్విడ్త్. ప్రతి హోస్ట్కు 500 Mbps వరకు షేర్ చేయబడుతుంది. ఫైల్ పంపిణీ దాన్ని మిగతా అన్నింటితో పంచుకుంటుంది.