SSD Nodes Learn 🎉 VPS $5.50/నెల నుండి
మార్గదర్శకాలు Matt Connorద్వారా Matt Connor · అప్‌డేట్ చేయబడింది 2026-08-13

Rocky Linux లేదా AlmaLinux లో Docker ఇన్‌స్టాల్ చేయడం ఎలా

Rocky Linux మరియు AlmaLinux లో Docker Engine ఇన్‌స్టాల్ చేసే విధానం ఇక్కడ ఉంది. Podman సమస్యలు, SELinux bind mounts మరియు dnf రిపోజిటరీ కాన్ఫిగరేషన్ వంటి ముఖ్యమైన అంశాలను తెలుసుకోండి.

Rocky Linux మరియు AlmaLinux లపై Docker ను ఇన్‌స్టాల్ చేయడం

Rocky Linux లేదా AlmaLinux లపై Docker ను ఇన్‌స్టాల్ చేయడానికి, మీరు Docker యొక్క సొంత dnf రిపోజిటరీని జోడించి, compose ప్లగిన్‌తో ఇంజిన్‌ను ఇన్‌స్టాల్ చేసి, ఆపై సేవను ఎనేబుల్ చేయాలి. ఈ ప్రక్రియ నాలుగు కమాండ్లతో పూర్తవుతుంది. ఈ రెండు డిస్ట్రిబ్యూషన్లు Red Hat Enterprise Linux (RHEL) యొక్క రీబిల్డ్స్ మరియు ప్యాకేజీ లేఅవుట్‌ను పంచుకుంటాయి కాబట్టి, రెండింటిలోనూ ఇది ఒకేలా ఉంటుంది. CentOS Stream కూడా ఇదే విధంగా పనిచేస్తుంది.

ఇన్‌స్టాలేషన్ చిన్నదిగా ఉంటుంది, కాబట్టి ఈ గైడ్‌లో ఎక్కువ భాగం Enterprise Linux (EL) ఉబుంటు (Ubuntu) కంటే భిన్నంగా ఎలా పనిచేస్తుందో వివరిస్తుంది. మీ ఇమేజ్‌లో ఇప్పటికే docker కమాండ్‌ను Podman ఆక్రమించి ఉండవచ్చు. bind-mounted ఫైళ్లకు సరైన లేబుల్ లేకపోతే SELinux వాటిని బ్లాక్ చేస్తుంది. Firewalld అనేది Docker ప్రచురించిన పోర్ట్‌లను ఫిల్టర్ చేయదు, కాబట్టి firewall-cmd ఏ పోర్ట్ ఓపెన్ లేదని చూపించినప్పటికీ, కంటైనర్ పోర్ట్ ఇంటర్నెట్‌కు బహిర్గతమై ఉండవచ్చు.

get.docker.com లోని Docker కన్వీనియన్స్ స్క్రిప్ట్‌ను ఉపయోగించవద్దు. ఇది ప్రొడక్షన్ వినియోగానికి సిఫార్సు చేయబడదని Docker డాక్యుమెంటేషన్ చెబుతోంది. ఇది అడగకుండానే మీ రిపోజిటరీ కాన్ఫిగరేషన్‌ను తిరిగి రాస్తుంది మరియు అప్‌గ్రేడ్ చేయడానికి దీనిని సురక్షితంగా మళ్లీ రన్ చేయలేము. రిపోజిటరీని మాన్యువల్‌గా జోడించడం వల్ల, సర్వర్‌లోని ఇతర ప్యాకేజీల మాదిరిగానే Docker ను కూడా dnf upgrade ద్వారా నిర్వహించవచ్చు.

Podman ఇప్పటికే docker కమాండ్‌కు సమాధానమిస్తోందా?

Rocky Linux మరియు AlmaLinux వాటి డిఫాల్ట్ రిపోజిటరీలలో podman ను కలిగి ఉంటాయి, మరియు అనేక VPS ఇమేజ్‌లు దీనిని మీ కోసం ఇన్‌స్టాల్ చేస్తాయి. కొన్ని ఇమేజ్‌లు మరింత ముందుకు వెళ్లి podman-docker ను ఇన్‌స్టాల్ చేస్తాయి, ఇది /usr/bin/docker వద్ద ఒక షెల్ స్క్రిప్ట్‌ను ఉంచుతుంది, ఇది podman ను పిలుస్తుంది. మీరు టైప్ చేసే ప్రతి docker కమాండ్ అప్పుడు podman ను రన్ చేస్తుంది, కాబట్టి Docker కోసం రాసిన గైడ్ మీరు ఆశించని అవుట్‌పుట్‌ను ఇస్తుంది.

మొదటి సూచన ఒక బ్యానర్. /usr/bin/docker స్క్రిప్ట్ /etc/containers/nodocker ఫైల్ కోసం తనిఖీ చేస్తుంది, మరియు ఆ ఫైల్ లేనప్పుడు అది ఏదైనా రన్ చేయడానికి ముందు ఒక లైన్‌ను ప్రింట్ చేస్తుంది:

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.

ఆ బ్యానర్‌ను నిశ్శబ్దం చేయడానికి ఎవరైనా ఆ ఫైల్‌ను సృష్టించి ఉండవచ్చు, కాబట్టి దానిపై మాత్రమే ఆధారపడవద్దు. ప్యాకేజీ డేటాబేస్‌ను అడగండి, ఏ ప్యాకేజీ ఆ బైనరీని కలిగి ఉందో:

command -v docker
rpm -qf "$(command -v docker)"

podman-docker తో ప్రారంభమయ్యే సమాధానం అంటే podman సమాధానమిస్తోందని అర్థం. docker-ce-cli తో ప్రారంభమయ్యే సమాధానం అంటే అసలైన Docker అని అర్థం. rpm -qf ఏ ప్యాకేజీ ఆ ఫైల్‌ను కలిగి లేదని నివేదిస్తే, ఎవరైనా దానిని మాన్యువల్‌గా ఇన్‌స్టాల్ చేశారు మరియు మీరు దానిని నమ్మే ముందు స్క్రిప్ట్‌ను చదవాలి.

Podman అదే OCI ఇమేజ్‌లను రన్ చేస్తుంది మరియు ఇది ఒక మంచి ఎంపిక. మీకు ఇది కావాలంటే, ఇక్కడే ఆపండి. మీకు Docker Engine కావాలంటే, ముందుగా వైరుధ్యంగా ఉన్న ప్యాకేజీలను తొలగించండి. RHEL కోసం Docker డాక్యుమెంట్ చేసిన జాబితా ఇది:

sudo dnf remove docker docker-client docker-client-latest docker-common \
  docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc

మీరు నిర్ధారించే ముందు dnf దేనిని తొలగించాలనుకుంటుందో చదవండి. కొత్త VPS ఇమేజ్‌పై జాబితా చిన్నదిగా ఉంటుంది. ఎవరైనా ఇప్పటికే ఉపయోగించిన బాక్స్‌పై, podman ను తొలగించడం వల్ల cockpit-podman లేదా దానిపై ఆధారపడే మరొక సాధనం తొలగిపోవచ్చు.

Podman ను Docker తో పాటు ఉంచడం సూత్రప్రాయంగా సాధ్యమే: కేవలం podman-docker ను తొలగించండి, తద్వారా docker పేరు ఖాళీగా ఉంటుంది, మరియు runc, దీనిని containerd.io ప్యాకేజీ భర్తీ చేస్తుంది. Docker డాక్యుమెంటేషన్ podman ను వైరుధ్యంగా ఉన్న ప్యాకేజీగా పరిగణిస్తుంది, కాబట్టి ఈ అమరికకు Docker మద్దతు ఇవ్వదు. ఇన్‌స్టాలేషన్ ఇప్పటికీ వైరుధ్యాన్ని నివేదిస్తే, పైన ఉన్న పూర్తి తొలగింపు జాబితాను ఉపయోగించండి.

dnf config-manager ఉపయోగించి Docker రిపోజిటరీని జోడించడం

Docker తన RPM ప్యాకేజీలను Enterprise Linux కోసం download.docker.com వద్ద ప్రచురిస్తుంది. ఈ రిపోజిటరీ ఫైల్ CentOS ట్రీని సూచిస్తుంది, దీనినే Rocky Linux మరియు AlmaLinux కూడా ఉపయోగిస్తాయి. ఆగస్టు 2026 నాటికి, Docker ఈ రిపోజిటరీని CentOS Stream 9 మరియు CentOS Stream 10 కోసం ధృవీకరించింది.

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

dnf వెర్షన్ 5 లో --add-repo ఆర్గ్యుమెంట్‌ను తొలగించారు, కాబట్టి కొత్త వెర్షన్లలో రెండవ కమాండ్ విఫలమవుతుంది. మీ సిస్టమ్‌లో ఏ వెర్షన్ ఉందో తనిఖీ చేసి, దానికి తగిన కమాండ్‌ను ఎంచుకోండి:

dnf --version

ఒకవేళ అది 5.x వెర్షన్‌ను చూపిస్తే, దానికి బదులుగా సబ్‌కమాండ్ ఫార్మాట్‌ను ఉపయోగించండి:

sudo dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/centos/docker-ce.repo

ఈ రెండు కమాండ్లు ఒకే ఫైల్‌ను /etc/yum.repos.d/docker-ce.repo లో రాస్తాయి. తప్పుడు ఫార్మాట్‌ను ఉపయోగిస్తే, అది నిశ్శబ్దంగా తప్పులు చేయకుండా, తెలియని ఆర్గ్యుమెంట్ (unknown-argument) ఎర్రర్‌ను చూపిస్తుంది, కాబట్టి మీరు దాన్ని సులభంగా గుర్తించవచ్చు.

ఆ రిపోజిటరీ ఫైల్ baseurl ను $releasever ఉన్న పాత్‌కు సెట్ చేస్తుంది, మరియు dnf మీ రిలీజ్ ప్యాకేజీ నుండి ఆ వేరియబుల్‌ను విస్తరిస్తుంది (expand చేస్తుంది). Rocky Linux మరియు AlmaLinux దీనిని మేజర్ వెర్షన్ నంబర్‌కు సెట్ చేస్తాయి, కాబట్టి EL 9 లో 9 గా మరియు EL 10 లో 10 గా ఉంటుంది. అందుకే CentOS రిపోజిటరీ Rocky సిస్టమ్‌లో సరిగ్గా పనిచేస్తుంది. ఇన్‌స్టాల్ చేసే ముందు ఈ విస్తరణను నిర్ధారించుకోండి:

sudo dnf repoinfo docker-ce-stable

Repo-baseurl లైన్‌ను చదవండి. అది /9/x86_64/stable లేదా /10/x86_64/stable తో ముగియాలి. ఒకవేళ మీ రిలీజ్ $releasever ను 9.6 వంటి పాయింట్ వెర్షన్‌కు సెట్ చేస్తే, మెటాడేటాను పొందేటప్పుడు dnf ఆ URL కోసం Status code: 404 అని రిపోర్ట్ చేస్తుంది. దీన్ని సరిచేయడానికి /etc/yum.repos.d/docker-ce.repo ని ఎడిట్ చేసి, $releasever స్థానంలో కేవలం మేజర్ నంబర్‌ను ఉంచండి.

ఇంజిన్ మరియు కంపోజ్ ప్లగిన్‌ను ఇన్‌స్టాల్ చేయండి

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ఐదు ప్యాకేజీలు ఉన్నాయి, ప్రతిదీ ఒక నిర్దిష్ట పనిని చేస్తుంది. docker-ce అనేది డెమోన్, dockerd. docker-ce-cli అనేది మీరు టైప్ చేసే docker కమాండ్. containerd.io అనేది డెమోన్ నడిపే కంటైనర్ రన్‌టైమ్. docker-buildx-plugin ఇమేజ్‌లను బిల్డ్ చేస్తుంది. docker-compose-plugin అనేది docker compose ను సబ్‌కమాండ్‌గా అందిస్తుంది.

ఈ ప్యాకేజీలు హైఫన్ ఉన్న docker-compose బైనరీని ఇన్‌స్టాల్ చేయవు. అది కంపోజ్ v1, ఇది జూలై 2023లో ముగింపు దశకు (end of life) చేరుకుంది. హైఫన్‌తో docker-compose అని పిలిచే ఏదైనా కమాండ్‌ను, స్పేస్‌తో కూడిన docker compose కి అప్‌డేట్ చేయాలి.

మొదటి ఇన్‌స్టాలేషన్ సమయంలో Docker యొక్క సైనింగ్ కీని ఇంపోర్ట్ చేయడానికి ఆగి, దాని ఫింగర్‌ప్రింట్‌ను మీకు చూపుతుంది. ఈ కీ మీరు ఇప్పుడే జోడించిన రిపో ఫైల్‌లోని gpgkey=https://download.docker.com/linux/centos/gpg నుండి వస్తుంది, కాబట్టి మీరు అంగీకరించే ముందు dnf చూపే ఫింగర్‌ప్రింట్‌ను ఆ URLతో సరిపోల్చుకోండి.

ఒక వైఫల్యం తరచుగా కనిపిస్తుంది. containerd.io కి container-selinux అవసరమని మరియు అది దేని ద్వారా లభించడం లేదని dnf నివేదిస్తే, మీ AppStream రిపోజిటరీ డిసేబుల్ చేయబడిందని అర్థం. dnf repolist రన్ చేసి, appstream జాబితాలో ఉందో లేదో నిర్ధారించుకోండి, ఎందుకంటే EL 9 మరియు EL 10 లలో container-selinux అక్కడే ఉంటుంది.

Docker ను ప్రారంభించి, అది నడుస్తుందో లేదో నిర్ధారించుకోండి

sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
sudo docker run --rm hello-world

Docker యొక్క RPM ప్యాకేజీలు ఇన్‌స్టాల్ అయిన తర్వాత daemon ను ఆపివేసి, disable చేసి ఉంచుతాయి. అందుకే ఈ దశ Docker యొక్క CentOS పేజీలో కనిపిస్తుంది, కానీ Ubuntu పేజీలో కనిపించదు; అక్కడ deb ప్యాకేజీ మీ కోసం సేవను స్వయంచాలకంగా ప్రారంభిస్తుంది. మీరు enable ను దాటవేస్తే, తదుపరి reboot వరకు మాత్రమే Docker నడుస్తుంది, ఆ తర్వాత అది ఆగిపోయి అన్ని container లను కూడా నిలిపివేస్తుంది.

systemctl status కమాండ్ Active: active (running) ను చూపాలి. hello-world కంటైనర్ This message shows that your installation appears to be working correctly. అని ప్రింట్ చేసి నిష్క్రమించాలి. ఒకవేళ అది /var/run/docker.sock వద్ద permission error ను చూపిస్తే, మీరు sudo ను మర్చిపోయారని అర్థం; దీనిని క్రింద ఉన్న docker group విభాగం ద్వారా సరిచేయవచ్చు.

Compose ప్లగిన్‌ను విడిగా తనిఖీ చేయండి, ఎందుకంటే ఇది వేరొక ప్యాకేజీ మరియు engine సరిగ్గా ఉన్నప్పటికీ ఇది లేకపోవచ్చు:

docker compose version

సరిగ్గా పనిచేస్తున్నప్పుడు Docker Compose version v2.x.x వంటి సమాధానం వస్తుంది. Reboot తర్వాత మీ సేవలు తిరిగి రావడం అనేది daemon ను enable చేయడంతో సంబంధం లేని వేరొక అంశం, మరియు restart policies ద్వారా Compose సేవలు boot సమయంలో తిరిగి రావాలో లేదో నిర్ణయించవచ్చు.

bind mount ఎందుకు permission denied అని చూపిస్తుంది?

Rocky Linux మరియు AlmaLinux డిఫాల్ట్‌గా SELinux (Security-Enhanced Linux) ను enforcing మోడ్‌లో రన్ చేస్తాయి. దీనిని getenforce తో నిర్ధారించుకోవచ్చు, ఇది Enforcing ను ప్రింట్ చేస్తుంది.

Docker కంటైనర్లు SELinux టైప్ container_t కింద రన్ అవుతాయి, మరియు ఆ టైప్ కేవలం container_file_t అని లేబుల్ చేయబడిన ఫైళ్లను మాత్రమే చదవగలదు మరియు రాయగలదు. మీరు హోస్ట్ మెషీన్‌పై సృష్టించిన డైరెక్టరీకి దాని పేరెంట్ పాత్ ఇచ్చే లేబుల్ ఉంటుంది, అది container_file_t కాదు. హోస్ట్ వైపు నుండి చూసినప్పుడు ఓనర్, గ్రూప్ మరియు మోడ్ సరిగ్గా ఉన్నట్లు అనిపించినప్పటికీ, కంటైనర్‌కు మాత్రం అనుమతి నిరాకరించబడుతుంది. దీనిని మూడు కమాండ్లతో పునరావృతం చేయవచ్చు:

sudo mkdir -p /srv/site
echo hello | sudo tee /srv/site/index.html
sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro nginx:alpine cat /usr/share/nginx/html/index.html

కంటైనర్ ఇలా ప్రింట్ చేస్తుంది:

cat: can't open '/usr/share/nginx/html/index.html': Permission denied

రెండు కమాండ్లు మీకు కారణాన్ని చూపుతాయి. ls -ldZ /srv/site లేబుల్‌ను ప్రింట్ చేస్తుంది, ఇది /srv కింద ఉన్న పాత్ కోసం system_u:object_r:var_t:s0 గా ఉంటుంది, container_file_t కాదు. ఆ తర్వాత sudo ausearch -m avc -ts recent కెర్నల్ యొక్క ఆడిట్ రికార్డును ప్రింట్ చేస్తుంది, ఇందులో avc: denied { read } ఉంటుంది, ఇది container_t అని పేరున్న scontext= ఫీల్డ్‌ను మరియు మీరు డైరెక్టరీపై చూసిన లేబుల్‌ను తెలిపే tcontext= ఫీల్డ్‌ను కలిగి ఉంటుంది. ఆ రెండు ఫీల్డ్‌ల మధ్య ఉన్న వ్యత్యాసమే అసలు సమస్య.

దీనికి పరిష్కారం వాల్యూమ్ ఆర్గ్యుమెంట్‌కు ఒక సఫిక్స్ (suffix) చేర్చడం. Docker మీ కోసం పాత్‌ను రీలేబుల్ చేస్తుంది:

sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro,z nginx:alpine cat /usr/share/nginx/html/index.html

చిన్న అక్షరాలతో ఉండే :z కంటెంట్‌ను షేర్డ్ (shared) గా రీలేబుల్ చేస్తుంది, తద్వారా అనేక కంటైనర్లు ఒకే డైరెక్టరీని ఉపయోగించవచ్చు. పెద్ద అక్షరాలతో ఉండే :Z దీనిని ప్రైవేట్ మరియు అన్‌షేర్డ్ (unshared) గా రీలేబుల్ చేస్తుంది, ఇది ఒక కంటైనర్‌కు మాత్రమే పరిమితం అవుతుంది, మరియు అదే పాత్‌ను చదవడానికి ప్రయత్నించే రెండవ కంటైనర్‌కు అనుమతి నిరాకరించబడుతుంది. సైడ్‌కార్ లేదా బ్యాకప్ కంటైనర్ కూడా యాక్సెస్ చేసే దేనికైనా :z ఉపయోగించండి. ఒకే కంటైనర్ యాజమాన్యంలో ఉండే డేటాబేస్ డైరెక్టరీ కోసం :Z ఉపయోగించండి.

Docker డాక్యుమెంటేషన్‌లో ఒక హెచ్చరిక ఉంది, దానిని మళ్ళీ గుర్తుంచుకోవడం ముఖ్యం, ఎందుకంటే రీలేబుల్ అనేది రికర్సివ్‌గా జరుగుతుంది. /home లేదా /usr వంటి సిస్టమ్ డైరెక్టరీలను :Z తో bind-mount చేయడం "మీ హోస్ట్ మెషీన్‌ను పనికిరాకుండా చేస్తుంది మరియు మీరు హోస్ట్ మెషీన్ ఫైళ్లను మాన్యువల్‌గా రీలేబుల్ చేయాల్సి రావచ్చు". ఈ సఫిక్స్‌లను మీరు కంటైనర్ కోసం సృష్టించిన డైరెక్టరీలకే వర్తింపజేయండి, సిస్టమ్ పాత్‌లకు ఎప్పుడూ చేయవద్దు.

Compose లో సఫిక్స్ అదే స్ట్రింగ్‌పై వస్తుంది:

services:
  web:
    image: nginx:alpine
    volumes:
      - /srv/site:/usr/share/nginx/html:ro,z

రెండు పరిమితుల విషయంలో జాగ్రత్తగా ఉండాలి. --mount ఫ్లాగ్ SELinux లేబుల్‌ను సెట్ చేయలేదు, కాబట్టి మీకు లేబుల్ అవసరమైనప్పుడు -v ఉపయోగించండి. నేమ్డ్ వాల్యూమ్స్‌కు సఫిక్స్ అవసరం లేదు, ఎందుకంటే Docker తనంతట తానుగా /var/lib/docker/volumes కింద సృష్టించే డైరెక్టరీలను లేబుల్ చేస్తుంది.

SELinux ను ఆఫ్ చేయవద్దు. sudo setenforce 0 ను కేవలం ఒక నిమిషం పాటు పరీక్షించడానికి మాత్రమే ఉపయోగించండి: ఒకవేళ కంటైనర్ అప్పుడు పనిచేస్తే, సమస్య లేబుల్‌దే అని అర్థం మరియు :z దానికి సమాధానం. వెంటనే sudo setenforce 1 తో దానిని తిరిగి అమర్చండి. Enterprise Linux లో, bind mount పై permission denied అనేది కంటైనర్ లోపల నుండి ఒకేలా కనిపించే రెండు వేర్వేరు కారణాల వల్ల రావచ్చు. ఒకటి SELinux లేబుల్. మరొకటి సాధారణ సంఖ్యాపరమైన యూజర్ మరియు గ్రూప్ యాజమాన్యం, ఇది PUID మరియు PGID వేరియబుల్స్ పరిష్కరించే సమస్య. ls -lnZ మీకు మోడ్, సంఖ్యాపరమైన ఓనర్ మరియు లేబుల్‌ను ఒకే లైన్‌లో చూపుతుంది, తద్వారా మీరు దేనితో సమస్య ఎదుర్కొంటున్నారో తెలుసుకోవచ్చు.

firewalld క్లోజ్డ్‌గా ఉన్నట్లు కనిపిస్తున్నప్పుడు, పబ్లిష్ చేసిన పోర్ట్ ఎలా అందుబాటులో ఉంటుంది?

Rocky Linux మరియు AlmaLinux లలో firewalld డిఫాల్ట్ ఫైర్‌వాల్‌గా ఉంటుంది. అది రన్ అవుతుందో లేదో sudo systemctl is-active firewalld తో తనిఖీ చేయండి. ఇప్పుడు ఒక పోర్ట్‌ను పబ్లిష్ చేసి, firewalld దృష్టిలో ఏవి ఓపెన్‌గా ఉన్నాయో చూడండి:

sudo docker run -d --name web -p 8080:80 nginx:alpine
sudo firewall-cmd --list-ports

firewall-cmd ఖాళీ లైన్‌ను ప్రింట్ చేస్తుంది. మరొక మెషీన్ నుండి, curl -I http://YOUR_SERVER_IP:8080/ అనేది HTTP/1.1 200 OK ను రిటర్న్ చేస్తుంది. పోర్ట్ ఇంటర్నెట్‌కు ఓపెన్‌గా ఉంది, కానీ మీ ఫైర్‌వాల్ ఏమీ చూపడం లేదు.

దీనికి కారణం ప్యాకెట్ ప్రయాణించే మార్గం. Firewalld యొక్క జోన్ రూల్స్ హోస్ట్‌కు వచ్చే ట్రాఫిక్‌ను మాత్రమే ఫిల్టర్ చేస్తాయి. పబ్లిష్ చేసిన పోర్ట్ హోస్ట్‌కు ఉద్దేశించినది కాదు: Docker ఒక డెస్టినేషన్ NAT (network address translation) రూల్‌ను ఇన్‌స్టాల్ చేస్తుంది. ప్యాకెట్ హోస్ట్ యొక్క ఇన్‌పుట్ పాత్‌కు చేరకముందే, అది డెస్టినేషన్‌ను కంటైనర్ అడ్రస్‌కు మారుస్తుంది. కాబట్టి, ప్యాకెట్‌ను లోకల్‌గా డెలివరీ చేయడానికి బదులుగా కెర్నల్ దానిని ఫార్వర్డ్ చేస్తుంది. ఆ తర్వాత Docker తన బ్రిడ్జ్ ఇంటర్‌ఫేస్‌లను docker అనే firewalld జోన్‌లో ఉంచుతుంది, దీని టార్గెట్ ACCEPT గా ఉంటుంది. అలాగే, ఏదైనా జోన్ నుండి docker జోన్‌కు ఫార్వర్డింగ్‌ను అనుమతించే docker-forwarding అనే ఫార్వర్డింగ్ పాలసీని జోడిస్తుంది. మీ జోన్ రూల్స్ ఈ ప్యాకెట్‌ను ఎప్పటికీ చూడలేవు.

దీనికి అత్యంత సరైన పరిష్కారానికి ఎటువంటి ఫైర్‌వాల్ రూల్ అవసరం లేదు. పబ్లిష్ చేసేటప్పుడు హోస్ట్ సైడ్‌ను లూప్‌బ్యాక్ (loopback) కు బైండ్ చేసి, దాని ముందు ఒక రివర్స్ ప్రాక్సీని ఉంచండి:

sudo docker rm -f web
sudo docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
curl -I http://127.0.0.1:8080/

లోకల్ curl అనేది HTTP/1.1 200 OK ను రిటర్న్ చేస్తుంది మరియు మరొక మెషీన్ నుండి వచ్చే అదే అభ్యర్థన ఇకపై కనెక్ట్ అవ్వదు. -p ఆర్గ్యుమెంట్‌లో హోస్ట్ అడ్రస్ లేని ఏదైనా సరే ప్రతి ఇంటర్‌ఫేస్‌పై పబ్లిష్ అవుతుంది. కాబట్టి, కేవలం -p 8080:80 ను మాత్రమే వాడటం అంటే ఆ సేవను బహిరంగంగా ఎక్స్‌పోజ్ చేయడమేనని గుర్తుంచుకోండి.

మీకు ఒక సేవ కొన్ని అడ్రస్‌ల నుండి మాత్రమే అందుబాటులో ఉండాలి అనుకున్నప్పుడు, Docker మీ కోసం ఒక చైన్‌ను రిజర్వ్ చేస్తుంది. Docker యొక్క సొంత accept రూల్స్ కంటే ముందే DOCKER-USER ప్రాసెస్ చేయబడుతుంది. కాబట్టి, మీరు అక్కడ ఉంచిన రూల్ Docker రీస్టార్ట్ అయినా లేదా దాని చైన్స్‌ను రీరైట్ చేసినా చెరిగిపోదు:

sudo iptables -I DOCKER-USER -i enp1s0 ! -s 203.0.113.10 -j DROP
sudo iptables -S DOCKER-USER

eth0 అని ఊహించుకోకుండా, ip route show default నుండి ఇంటర్‌ఫేస్ పేరును తీసుకోండి, ఎందుకంటే ప్రస్తుత EL ఇమేజ్‌లు enp1s0 లేదా ens3 వంటి పేర్లను వాడుతున్నాయి. Rocky మరియు AlmaLinux లలో iptables కమాండ్ అనేది nftables పైన ఒక కంపాటబిలిటీ లేయర్, మరియు Docker చైన్స్ దీని ద్వారా కనిపిస్తాయి. ఈ విధంగా జోడించిన రూల్స్ రీబూట్ తర్వాత ఉండవు, కాబట్టి మీకు నచ్చిన తర్వాత వాటిని ఒక systemd యూనిట్‌లో రాసుకోండి.

2025లో విడుదలైన Docker Engine 28.0, ఒక లోపాన్ని సరిచేసింది: పబ్లిష్ చేయని కంటైనర్ పోర్ట్‌లకు నేరుగా రూట్ చేసిన యాక్సెస్ ఇప్పుడు DOCKER చైన్‌లో బ్లాక్ చేయబడింది. ఆ మార్పు పబ్లిష్ చేసిన పోర్ట్‌లపై ప్రభావం చూపదు, కాబట్టి పైన పేర్కొన్నవన్నీ ప్రస్తుత వెర్షన్‌లకు కూడా వర్తిస్తాయి. ఒక పనిని అలవాటుగా మార్చుకోవడం మంచిది: ఏదైనా sudo firewall-cmd --reload తర్వాత, పబ్లిష్ చేసిన పోర్ట్‌ను మళ్ళీ పరీక్షించండి. అది స్పందించడం ఆగిపోతే, sudo systemctl restart docker ద్వారా Docker రూల్స్‌ను మళ్ళీ ఇన్‌స్టాల్ చేయండి.

Ubuntu అడ్మినిస్ట్రేటర్లు కూడా వేరే టూల్ ద్వారా ఇదే సమస్యను ఎదుర్కొంటారు, దీని గురించి Docker పబ్లిష్ చేసిన పోర్ట్‌లు ufw రూల్స్‌ను ఎందుకు పట్టించుకోవు లో చూడవచ్చు. రెండు సందర్భాల్లోనూ NAT పాత్ కారణం. కేవలం దాని ముందున్న ఫైర్‌వాల్ మాత్రమే మారుతుంది.

docker గ్రూపునకు non-root యూజర్‌ను జోడించడం

ప్రతి docker కమాండ్‌కు ముందు sudo టైప్ చేయడం విసుగు కలిగిస్తుంది, docker గ్రూపును వాడటం వల్ల ఆ అవసరం ఉండదు:

sudo usermod -aG docker $USER
newgrp docker
docker run --rm hello-world

usermod -aG కమాండ్ /etc/group ఫైల్‌ను ఎడిట్ చేస్తుంది, కానీ మీ ప్రస్తుత షెల్ ఇప్పటికే పాత గ్రూప్ జాబితాను కలిగి ఉంటుంది, కాబట్టి మీరు కొత్త షెల్ ఓపెన్ చేసే వరకు ఈ మార్పులు వర్తించవు. newgrp docker కమాండ్ కొత్త గ్రూప్ అనుమతులతో షెల్‌ను ప్రారంభిస్తుంది, తద్వారా మీరు వెంటనే పరీక్షించుకోవచ్చు. కొత్త SSH సెషన్‌లు ఈ మార్పులను ఆటోమేటిక్‌గా గుర్తిస్తాయి.

ఈ గ్రూప్ ద్వారా లభించే అధికారాల గురించి స్పష్టత కలిగి ఉండండి. ఈ గ్రూప్‌లో సభ్యత్వం ఉంటే /var/run/docker.sock కు రైట్ యాక్సెస్ లభిస్తుంది. ఆ సాకెట్‌తో కమ్యూనికేట్ చేయగల ఏదైనా సరే, హోస్ట్ ఫైల్‌సిస్టమ్‌ను మౌంట్ చేసే కంటైనర్‌ను ప్రారంభించమని డెమన్‌ను కోరవచ్చు. ఒకే కమాండ్ దీని అర్థం ఏమిటో చూపిస్తుంది:

docker run --rm -v /:/host alpine wc -l /host/etc/shadow

ఇది కేవలం root మాత్రమే చదవగలిగే ఫైల్‌ను, ఎటువంటి sudo అధికారాలు లేని అకౌంట్ ద్వారా చదువుతుంది. Docker యొక్క పోస్ట్-ఇన్‌స్టాల్ డాక్యుమెంటేషన్ కూడా ఇదే చెబుతోంది: docker గ్రూప్ సభ్యత్వం root తో సమానమైన అధికారాలను ఇస్తుంది. మీరు ఒక అకౌంట్‌కు sudo అధికారాలు ఇవ్వాలనుకుంటేనే ఆ అకౌంట్‌ను ఈ గ్రూప్‌లో చేర్చండి. మీరు కొత్త సర్వర్‌లో అకౌంట్‌లను సెటప్ చేస్తుంటే, దీనిని least-privilege user setup on a VPS లో భాగంగానే నిర్ణయించుకోండి, ఆ తర్వాత కాదు.

Docker లో rootless మోడ్ కూడా ఉంది, ఇది డెమన్‌ను తక్కువ అధికారాలు కలిగిన యూజర్‌గా రన్ చేస్తుంది. ఇది వేరే ఇన్‌స్టాలేషన్ పద్ధతి మరియు ఇది స్టోరేజ్ డ్రైవర్లు మరియు 1024 కంటే తక్కువ ఉన్న పోర్ట్‌ల పనితీరును మారుస్తుంది, కాబట్టి దీనిని తర్వాత జోడించే ఫ్లాగ్‌గా కాకుండా, ఒక ప్రత్యేక ప్రాజెక్ట్‌గా ప్లాన్ చేసుకోండి.

తదుపరి అడుగులు

ఇప్పుడు మీ వద్ద ఇంజిన్, compose ప్లగిన్, రీబూట్ తర్వాత కూడా పనిచేసే సేవ మరియు పైన పేర్కొన్న మూడు EL-నిర్దిష్ట ప్రవర్తనలు సిద్ధంగా ఉన్నాయి. తదుపరి అడుగు ప్రతి సేవకు ఒక compose.yamlని సిద్ధం చేయడం. Compose ఫైల్ నిర్మాణం అనే విభాగం ఫైల్ ఫార్మాట్ మరియు దానిని నియంత్రించే కమాండ్ల గురించి వివరిస్తుంది. ఇది మీరు ఉపయోగిస్తున్న మొదటి కంటైనర్ హోస్ట్ అయితే, VPSలో Docker రన్ చేయడం అనే విభాగం ఈ గైడ్‌లో వదిలివేసిన సైజింగ్, స్టోరేజ్ మరియు ఇమేజ్-హైజీన్ వంటి అంశాలను కవర్ చేస్తుంది.

FAQ

Docker యొక్క CentOS రిపోజిటరీ Rocky Linux మరియు AlmaLinux లపై పనిచేస్తుందా?

అవును. https://download.docker.com/linux/centos/docker-ce.repo ను dnf config-manager తో జోడించండి. ఆ ఫైల్‌లోని baseurl లో $releasever ఉంటుంది. Rocky Linux మరియు AlmaLinux లు దీనిని మేజర్ వెర్షన్ నంబర్‌గా విస్తరిస్తాయి. కాబట్టి EL 9 బాక్స్ CentOS 9 ట్రీకి, EL 10 బాక్స్ CentOS 10 ట్రీకి అనుసంధానించబడతాయి. sudo dnf repoinfo docker-ce-stable తో ఈ విస్తరణను నిర్ధారించుకుని, Repo-baseurl లైన్‌ను చదవండి. dnf మెటాడేటాను పొందుతున్నప్పుడు Status code: 404 వస్తే, ఆ వేరియబుల్ పాయింట్ రిలీజ్ వరకు విస్తరించబడిందని అర్థం. అప్పుడు /etc/yum.repos.d/docker-ce.repo ఫైల్‌ను ఎడిట్ చేసి, కేవలం మేజర్ నంబర్‌ను మాత్రమే ఉంచితే సమస్య పరిష్కారమవుతుంది.

ఒకే సర్వర్‌పై Docker మరియు podman లను ఇన్‌స్టాల్ చేయవచ్చా?

Docker డాక్యుమెంటేషన్ podman మరియు runc లను ఒకదానికొకటి విరుద్ధమైన ప్యాకేజీలుగా పేర్కొంటుంది. Docker Engine ఇన్‌స్టాల్ చేసే ముందు వీటిని తొలగించాలని సూచిస్తుంది. ప్రధాన సమస్య podman-docker ప్యాకేజీ వల్ల వస్తుంది; ఇది /usr/bin/docker ను కలిగి ఉండి, ప్రతి docker కమాండ్‌ను podman కమాండ్‌గా మారుస్తుంది. ఆ పాత్ ఏ ప్యాకేజీకి చెందినదో చూడటానికి rpm -qf "$(command -v docker)" రన్ చేయండి. అవుట్‌పుట్ podman-docker తో మొదలైతే, podman స్పందిస్తోందని అర్థం. రెండు ఇంజిన్‌లను ఉంచడం Docker సపోర్ట్ చేసే పద్ధతి కాదు, కాబట్టి ముఖ్యమైన సర్వర్‌ల విషయంలో ఏదో ఒకదానినే ఎంచుకోండి.

bind mount పై నా కంటైనర్‌కు permission denied అని ఎందుకు వస్తుంది?

Rocky Linux మరియు AlmaLinux లలో SELinux డిఫాల్ట్‌గా ఎన్‌ఫోర్స్ చేయబడి ఉంటుంది. కంటైనర్లు container_t రకంతో రన్ అవుతాయి మరియు అవి కేవలం container_file_t అని లేబుల్ చేయబడిన ఫైళ్లను మాత్రమే తాకగలవు. మీరు సృష్టించిన డైరెక్టరీకి తప్పుడు లేబుల్ ఉండటం వల్ల, దాని ఓనర్ లేదా మోడ్ ఏవైనా సరే యాక్సెస్ నిరాకరించబడుతుంది. హోస్ట్ పాత్‌పై ls -ldZ రన్ చేసి, ఆపై sudo ausearch -m avc -ts recent రన్ చేయడం ద్వారా దీన్ని నిర్ధారించుకోండి; ఇది రెండు సరిపోలని కాంటెక్స్ట్‌లను avc: denied రూపంలో చూపిస్తుంది. కంటైనర్ల మధ్య షేర్ చేసే కంటెంట్ కోసం వాల్యూమ్ ఆర్గ్యుమెంట్‌లో :z ను, లేదా ఒకే కంటైనర్‌కు పరిమితమైన కంటెంట్ కోసం :Z ను జోడించండి. ఎప్పుడూ :Z ను /home లేదా /usr వైపు పాయింట్ చేయకండి, ఎందుకంటే ఈ రీలేబులింగ్ రికర్సివ్‌గా జరిగి హోస్ట్ సిస్టమ్‌ను పాడు చేస్తుంది.

కంటైనర్ పోర్ట్‌ను పబ్లిష్ చేయడానికి firewalld లో పోర్ట్ ఓపెన్ చేయాలా?

అవసరం లేదు, అసలు సమస్య అదే. ప్యాకెట్ హోస్ట్ యొక్క ఇన్‌పుట్ పాత్‌కు చేరకముందే Docker యొక్క NAT రూల్ డెస్టినేషన్ అడ్రస్‌ను మారుస్తుంది, కాబట్టి firewalld జోన్ రూల్స్ దానిని తనిఖీ చేయవు. Docker తన బ్రిడ్జ్‌లను docker అనే firewalld జోన్‌లో ఉంచుతుంది, దీని టార్గెట్ ACCEPT. -p 8080:80 తో ప్రారంభించిన కంటైనర్ ఇంటర్నెట్ నుండి అందుబాటులో ఉంటుంది, కానీ sudo firewall-cmd --list-ports ఏమీ చూపదు. కేవలం హోస్ట్ మాత్రమే సేవను యాక్సెస్ చేయాలనుకుంటే -p 127.0.0.1:8080:80 తో నిర్దిష్ట అడ్రస్‌కు పబ్లిష్ చేయండి, లేదా Docker తన సొంత యాక్సెప్ట్ రూల్స్‌కు ముందు ప్రాసెస్ చేసే DOCKER-USER చైన్‌లో ఫిల్టరింగ్ రూల్స్‌ను చేర్చండి.

నా యూజర్‌ను docker గ్రూప్‌లో చేర్చడం సురక్షితమేనా?

ఇది root యాక్సెస్‌ను ఇస్తుంది. docker గ్రూప్‌లో ఉన్న సభ్యుడు /var/run/docker.sock కు రాయగలడు, మరియు docker run --rm -v /:/host alpine wc -l /host/etc/shadow ద్వారా sudo హక్కులు లేని అకౌంట్ నుండి కూడా root-only ఫైల్‌ను చదవగలడు. Docker యొక్క పోస్ట్-ఇన్‌స్టాల్ డాక్యుమెంటేషన్ కూడా ఇదే విషయాన్ని ధృవీకరిస్తుంది. మీరు ఇప్పటికే sudo తో నమ్మదగిన అకౌంట్లను మాత్రమే ఇందులో చేర్చండి, మరియు షేర్డ్ లేదా సర్వీస్ అకౌంట్ల కోసం sudo docker ను వాడండి. మీకు అన్‌ప్రివిలేజ్డ్ యూజర్ కింద కంటైనర్లు కావాలంటే Rootless మోడ్ ఒక ప్రత్యామ్నాయం, ఇది సెట్టింగ్ కాదు, ఒక ప్రత్యేక ఇన్‌స్టాలేషన్ పద్ధతి.