SSD Nodes Learn Hosting plans →
मार्गदर्शक Matt Connorद्वारे Matt Connor · अपडेटेड 2026-09-04

Rocky Linux किंवा AlmaLinux वर Docker कसे स्थापित करावे

dnf वापरून Docker Engine आणि Compose plugin स्थापित करा. Ubuntu मार्गदर्शकांमध्ये वगळलेले Podman चा docker command ताब्यात असणे आणि bind mount साठी SELinux labels दुरुस्त करा.

Rocky Linux आणि AlmaLinux वर Docker स्थापित करा

Rocky Linux किंवा AlmaLinux वर Docker स्थापित करण्यासाठी Docker चे स्वतःचे dnf repository जोडा, Compose plugin सह engine स्थापित करा आणि त्यानंतर सेवा enable करा. यासाठी चार commands लागतात. दोन्ही distributions मध्ये ही प्रक्रिया समान आहे, कारण दोन्ही Red Hat Enterprise Linux (RHEL) चे rebuilds आहेत आणि त्यांची package layout समान आहे. CentOS Stream मध्येही हीच पद्धत आहे. खालील सर्व माहिती दोन्ही distributions साठी लागू आहे. त्यामुळे अजून कोणता distribution निवडायचा हे ठरवत असाल, तर प्रत्येक project देत असलेले compatibility promise आणि तुमचा जुना CPU अजून supported आहे का हे निर्णायक घटक आहेत.

स्थापना प्रक्रिया लहान आहे. त्यामुळे या मार्गदर्शकाचा मोठा भाग Ubuntu पेक्षा Enterprise Linux (EL) मध्ये काय वेगळे आहे हे स्पष्ट करतो. तुमच्या image मध्ये Podman कडे docker command आधीपासून असू शकतो. Bind-mounted files वर योग्य label नसतील, तर SELinux त्यांना block करते. Firewalld Docker ने publish केलेले ports filter करत नाही. त्यामुळे firewall-cmd काहीही open नसल्याचे दाखवत असतानाही container port इंटरनेटसाठी open असू शकतो.

get.docker.com मधील Docker चे convenience script वापरू नका. Production साठी ते recommended नाही, असे Docker च्या अधिकृत documentation मध्ये सांगितले आहे. ते तुमची repository configuration विचारणा न करता बदलते आणि upgrade करण्यासाठी ते सुरक्षितपणे पुन्हा चालवता येत नाही. Repository स्वतः हाताने जोडल्यास dnf upgrade Docker ला system वरील इतर packages प्रमाणेच हाताळते. तुमच्याकडे security updates timer वर लागू करणारे dnf-automatic असल्यास, engine त्याच्या कक्षेत येतो. त्यामुळे Docker unattended पद्धतीने patched ठेवायचा की maintenance window पर्यंत मागे ठेवायचा, हे सुरुवातीलाच ठरवा. दोन्ही परिस्थितींमध्ये upgrade केल्यावर packaged binary बदलते; मात्र जुना dockerd चालू राहतो. तुम्ही नुकताच बदललेला code अजून कोणत्या services चालवत आहेत हे सांगणारा command needs-restarting आहे.

podman आधीपासून docker command ला प्रतिसाद देत आहे का?

Rocky Linux आणि AlmaLinux त्यांच्या default repositories मध्ये podman उपलब्ध करून देतात. अनेक VPS images ते तुमच्यासाठी install करतात. काही images पुढे जाऊन podman-docker देखील install करतात. ते /usr/bin/docker येथे podman ला call करणारी shell script ठेवते. त्यानंतर तुम्ही टाइप केलेली प्रत्येक docker command प्रत्यक्षात podman चालवते. त्यामुळे Docker साठी लिहिलेल्या guide मधून अपेक्षित नसलेला output मिळू लागतो.

याचा पहिला संकेत banner असतो. /usr/bin/docker script /etc/containers/nodocker ही file तपासते. ती file नसल्यास, काहीही चालवण्यापूर्वी script एक ओळ print करते:

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

Banner लपवण्यासाठी कोणीतरी ती file तयार केलेली असू शकते. त्यामुळे केवळ त्यावर अवलंबून राहू नका. कोणत्या package च्या मालकीची binary आहे हे package database ला विचारा:

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

podman-docker ने सुरू होणारे उत्तर मिळाल्यास podman प्रतिसाद देत आहे. docker-ce-cli ने सुरू होणारे उत्तर मिळाल्यास खरे Docker वापरले जात आहे. rpm -qf ने file कोणत्याही package च्या मालकीची नसल्याचे कळवल्यास ती कोणीतरी manually install केलेली आहे. अशा वेळी script वर विश्वास ठेवण्यापूर्वी तिचा मजकूर वाचा.

podman समान OCI images चालवते आणि तो योग्य पर्याय आहे. तुम्हाला podman वापरायचे असल्यास येथेच थांबा. दोन्ही Linux container engines आहेत. त्यामुळे platform बाबतचा निर्णय अजून झालेला नसल्यास, FreeBSD jails registry मधून आणलेल्या layered images चालवण्याऐवजी पूर्ण userland वेगळे isolate करतात हे जाणून घेणे उपयुक्त ठरेल. तुम्हाला Docker Engine हवे असल्यास आधी conflicting packages काढून टाका. RHEL साठी Docker ने ही list दिली आहे:

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

Confirm करण्यापूर्वी dnf कोणते packages काढण्याची योजना करत आहे ते वाचा. नवीन VPS image वर ही list लहान असते. आधीपासून वापरलेल्या server वर podman काढल्यामुळे cockpit-podman किंवा त्यावर अवलंबून असलेले दुसरे tool देखील काढले जाऊ शकते.

तत्त्वतः podman आणि Docker एकत्र ठेवणे शक्य आहे. फक्त podman-docker काढा, जेणेकरून docker हे नाव मोकळे होईल, तसेच runc काढा, ज्याची जागा containerd.io package घेते. Docker च्या documentation मध्ये podman ला conflicting package मानले आहे. त्यामुळे Docker या layout ला support करत नाही. Install करताना conflict कायम राहिल्यास, वरील संपूर्ण removal list वापरा.

dnf config-manager वापरून Docker चे repository जोडा

Docker Enterprise Linux साठी RPMs download.docker.com येथे प्रकाशित करते. Repository file CentOS tree कडे निर्देश करते. Rocky Linux आणि AlmaLinux याच tree विरुद्ध resolve होतात. 2020 मध्ये Red Hat ने CentOS चे रूपांतर Stream मध्ये केल्यानंतर दोन्ही distributions CentOS lineage मधून विकसित झाल्या, हे दोन्ही distributions CentOS lineage मधून कशा विकसित झाल्या माहीत नसल्यास Rocky box ला CentOS repository कडे निर्देश करणे चूक वाटू शकते. August 2026 मध्ये तपासलेल्या माहितीनुसार, Docker हे repository CentOS Stream 9 आणि CentOS Stream 10 साठी document करते.

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

dnf च्या Version 5 मध्ये --add-repo argument काढून टाकण्यात आला. त्यामुळे नवीन releases वर दुसरी command fail होते. तुमच्याकडे कोणती version आहे ते तपासा आणि त्यानुसार योग्य form निवडा:

dnf --version

जर 5.x version दिसली, तर त्याऐवजी subcommand form वापरा:

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

दोन्ही commands /etc/yum.repos.d/docker-ce.repo येथे समान file लिहितात. चुकीच्या form मुळे unknown-argument error येतो; ती शांतपणे चुकीचे काम करत नाही. त्यामुळे हा फरक तुमच्या लक्षात येईल.

ही repo file baseurl ला $releasever असलेला path देते. dnf ही variable तुमच्या release package मधून expand करते. Rocky Linux आणि AlmaLinux तिची value major version number म्हणून सेट करतात. त्यामुळे EL 9 वर 9 आणि EL 10 वर 10 असते. यामुळे Rocky box वर CentOS repository योग्यरित्या resolve होते. Install करण्यापूर्वी expansion ची खात्री करा:

sudo dnf repoinfo docker-ce-stable

Repo-baseurl line वाचा. ती /9/x86_64/stable किंवा /10/x86_64/stable ने समाप्त झाली पाहिजे. तुमच्या release ने $releasever ची value 9.6 सारखी point version म्हणून सेट केली असल्यास, metadata fetch करताना dnf त्या URL साठी Status code: 404 दाखवते. /etc/yum.repos.d/docker-ce.repo संपादित करून $releasever ऐवजी फक्त major number लिहून ही समस्या दुरुस्त करा.

Engine आणि compose plugin स्थापित करा

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

पाच packages आहेत आणि प्रत्येक package एक विशिष्ट काम करते. docker-ce हा daemon आहे; dockerd. docker-ce-cli ही तुम्ही टाइप करणारी docker command आहे. containerd.io हा daemon नियंत्रित करत असलेला container runtime आहे. docker-buildx-plugin images तयार करतो. docker-compose-plugin हा docker compose subcommand उपलब्ध करून देतो.

हे packages hyphen असलेली docker-compose binary install करत नाहीत. ती Compose v1 होती आणि तिचे जीवनचक्र July 2023 मध्ये संपले. hyphen असलेल्या docker-compose ला call करणारे सर्व काही space असलेल्या docker compose मध्ये अपडेट करणे आवश्यक आहे.

पहिली install प्रक्रिया थांबून Docker ची signing key import करते आणि तिचा fingerprint दाखवते. ही key तुम्ही नुकत्याच जोडलेल्या repo file मधील gpgkey=https://download.docker.com/linux/centos/gpg मधून येते. त्यामुळे ती स्वीकारण्यापूर्वी dnf दाखवत असलेला fingerprint त्या URL शी जुळतो का ते तपासा.

एक failure इतका वारंवार दिसतो की त्याचा स्वतंत्र उल्लेख करणे आवश्यक आहे. dnf ने containerd.io साठी container-selinux आवश्यक असल्याचे सांगितले आणि ते पुरवणारे काहीही उपलब्ध नसल्याचे दाखवले, तर तुमचे AppStream repository disabled आहे. dnf repolist चालवा आणि appstream सूचीमध्ये आहे याची खात्री करा, कारण EL 9 आणि EL 10 वर container-selinux याच repository मधून उपलब्ध होते.

Docker सुरू करा आणि ते चालू आहे याची खात्री करा

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

Docker ची RPM पॅकेजेस install केल्यानंतर daemon थांबवलेला आणि disabled ठेवतात. म्हणून ही पायरी Docker च्या CentOS पेजवर आहे, पण Ubuntu पेजवर नाही. Ubuntu मध्ये deb पॅकेज तुमच्यासाठी service सुरू करते. enable वगळल्यास Docker पुढील reboot पर्यंत चालू राहतो. त्यानंतर तो बंद राहतो आणि त्याच्यासोबत प्रत्येक container देखील बंद राहतो.

systemctl status मध्ये Active: active (running) दिसले पाहिजे. hello-world container ने This message shows that your installation appears to be working correctly. print करून exit केले पाहिजे. त्याऐवजी /var/run/docker.sock वर permission error print होत असल्यास, तुम्ही sudo वगळले आहे. खालील docker group विभागात त्याचे निराकरण केले आहे.

compose plugin स्वतंत्रपणे तपासा, कारण ते वेगळे package आहे. Engine योग्य असतानाही ते missing असू शकते:

docker compose version

योग्य output असे दिसते: Docker Compose version v2.x.x. Reboot नंतर तुमच्या services पुन्हा सुरू होणे हा daemon enable करण्यापेक्षा वेगळा विषय आहे. Compose services boot वेळी पुन्हा सुरू होतात की नाही हे restart policies ठरवतात.

bind mount मुळे permission denied का मिळतो?

Rocky Linux आणि AlmaLinux मध्ये SELinux (Security-Enhanced Linux) default म्हणून enforcing mode मध्ये चालते. getenforce वापरून याची खात्री करा. हे Enforcing दाखवते.

Docker containers container_t या SELinux type अंतर्गत चालतात. हा type फक्त container_file_t label असलेल्या files वाचू आणि लिहू शकतो. Host वर तुम्ही तयार केलेल्या directory ला तिच्या parent path कडून मिळालेला label असतो. तो label container_file_t नसतो. Host कडून owner, group आणि mode योग्य दिसत असले तरी container ला प्रवेश नाकारला जातो. हे तीन commands वापरून पुन्हा पाहा:

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

Container हे दाखवते:

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

दोन commands मुळे कारण स्पष्ट होते. ls -ldZ /srv/site label दाखवते. /srv अंतर्गत असलेल्या path साठी तो label system_u:object_r:var_t:s0 असतो, container_file_t नाही. त्यानंतर sudo ausearch -m avc -ts recent kernel चा audit record दाखवते. त्यात avc: denied { read } असते. हे scontext= field container_t चे नाव देते. तसेच tcontext= field directory वर दिसलेल्या label चे नाव देते. या दोन fields मधील mismatch हेच संपूर्ण कारण आहे.

Volume argument ला suffix जोडणे हा उपाय आहे. Docker path ला तुमच्यासाठी relabel करते:

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

लहान अक्षरातील :z content ला shared म्हणून relabel करते. त्यामुळे अनेक containers तीच directory वापरू शकतात. मोठ्या अक्षरातील :Z content ला private आणि unshared म्हणून relabel करते. ते एका container शी जोडलेले असते. त्यामुळे त्याच path वाचणाऱ्या दुसऱ्या container ला प्रवेश नाकारला जातो. Sidecar किंवा backup container देखील वापरत असलेल्या कोणत्याही directory साठी :z वापरा. एका container च्या मालकीच्या database directory साठी :Z वापरा.

Docker च्या documentation मधील एक इशारा लक्षात ठेवणे आवश्यक आहे, कारण relabel recursive असते. :Z सह /home किंवा /usr सारखी system directory bind-mount केल्यास "तुमचा host machine वापरण्यायोग्य राहणार नाही आणि host machine वरील files तुम्हाला हाताने relabel कराव्या लागू शकतात". हे suffixes फक्त container साठी तयार केलेल्या directories कडे निर्देशित करा. ते system path वर कधीही वापरू नका.

Compose मध्ये suffix त्याच string च्या शेवटी द्या:

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

दोन मर्यादा सहज लक्षात येत नाहीत. --mount flag SELinux label सेट करू शकत नाही. त्यामुळे label आवश्यक असल्यास -v वापरा. Named volumes साठी suffix आवश्यक नाही, कारण Docker स्वतः /var/lib/docker/volumes अंतर्गत तयार केलेल्या directories ला label देते.

SELinux बंद करू नका. फक्त एक मिनिटाची चाचणी म्हणून sudo setenforce 0 वापरा. त्यानंतर container चालू झाले, तर समस्या label ची आहे आणि :z हा उपाय आहे. लगेच sudo setenforce 1 वापरून ते पुन्हा पूर्ववत करा. Enterprise Linux मध्ये bind mount वरील permission denied ला दोन स्वतंत्र कारणे असू शकतात. Container च्या आतून ती दोन्ही सारखीच दिसतात. एक कारण SELinux label आहे. दुसरे कारण म्हणजे numeric user आणि group ownership. PUID आणि PGID variables सोडवण्यासाठीच अस्तित्वात असलेली ही समस्या यामुळे होते. ls -lnZ mode, numeric owner आणि label एकाच line मध्ये दाखवते. त्यामुळे तुम्ही नेमक्या कोणत्या समस्येचा सामना करत आहात हे ओळखता येते.

प्रकाशित केलेला पोर्ट firewalld बंद दिसत असतानाही का पोहोचण्यायोग्य असतो?

Rocky Linux आणि AlmaLinux वरील default firewall म्हणजे firewalld आहे. sudo systemctl is-active firewalld वापरून ते चालू आहे का ते तपासा. या मशीनवर firewalld अद्याप configure केलेले नसेल, तर firewalld वापरून SSH आणि web पोर्ट उघडणे हे आधी करा. कारण खालील आश्चर्यकारक वर्तन समजण्यासाठी तुलना करण्याकरिता कार्यरत zone ruleset आवश्यक आहे. आता एक पोर्ट publish करा आणि firewalld ला कोणते पोर्ट open दिसते ते पाहा:

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 मिळते. पोर्ट इंटरनेटसाठी open आहे, परंतु तुमचा firewall काहीही दाखवत नाही.

याचे कारण packet ज्या मार्गाने जातो तो आहे. Firewalld चे zone rules host स्वतःकडे निर्देशित केलेले traffic filter करतात. Published port हा host कडे निर्देशित केलेला नसतो. Packet host च्या input path पर्यंत पोहोचण्यापूर्वी Docker destination NAT (network address translation) rule लावून destination चे container च्या address मध्ये रूपांतर करते. त्यामुळे kernel packet स्थानिक पातळीवर deliver न करता forward करतो. त्यानंतर Docker bridge interfaces ला docker नावाच्या firewalld zone मध्ये ठेवते. या zone चे target ACCEPT असते. तसेच Docker docker-forwarding नावाची forwarding policy जोडते. ही policy कोणत्याही zone मधून docker zone मध्ये forwarding अनुमत करते. त्यामुळे तुमचे zone rules हा packet पाहतच नाहीत.

सर्वात स्वच्छ उपाय म्हणजे firewall rule ची आवश्यकता नसणे. Publish केलेल्या port च्या host बाजूला loopback शी bind करा आणि त्यासमोर reverse proxy ठेवा:

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 मिळते आणि दुसऱ्या मशीनवरून केलेली तीच request आता connect होत नाही. -p argument मध्ये host address नसलेली कोणतीही मांडणी प्रत्येक interface वर publish केली जाते. त्यामुळे साधा -p 8080:80 म्हणजे ती service सार्वजनिकरीत्या expose करण्याचा निर्णय असे समजा.

काही address वरून service पोहोचण्यायोग्य आणि इतर address वरून अनुपलब्ध ठेवायची असल्यास Docker तुमच्यासाठी एक chain राखून ठेवते. DOCKER-USER ही Docker च्या स्वतःच्या accept rules आधी process केली जाते. त्यामुळे तिथे जोडलेला rule Docker restart करून त्याच्या chains पुन्हा लिहिल्या तरी टिकून राहतो:

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

ip route show default मधून interface चे नाव घ्या. eth0 असे गृहीत धरू नका, कारण सध्याच्या EL images मध्ये enp1s0 किंवा ens3 यांसारखी नावे वापरली जातात. Rocky आणि AlmaLinux वर iptables command हा nftables वरील compatibility layer आहे आणि Docker च्या chains त्यातून दिसतात. अशा प्रकारे जोडलेले rules reboot नंतर नाहीसे होतात, जोपर्यंत तुम्ही ते save करत नाही. त्यामुळे rules योग्य असल्याची खात्री झाल्यावर ते systemd unit मध्ये लिहा.

2025 मध्ये released झालेल्या Docker Engine 28.0 ने याच्याशी संबंधित आणखी एक त्रुटी दूर केली. यापूर्वी publish न केलेल्या container ports वर direct routed access उपलब्ध होऊ शकत होता. आता DOCKER chain मध्ये असा access block केला जातो. या बदलाचा published ports वर परिणाम होत नाही. त्यामुळे वरील सर्व माहिती सध्याच्या versions वरही लागू आहे. एक operational सवय अंगीकारणे उपयुक्त ठरेल: कोणत्याही sudo firewall-cmd --reload नंतर published port पुन्हा तपासा. तो प्रतिसाद देणे थांबवला असल्यास sudo systemctl restart docker Docker चे rules पुन्हा install करते.

Ubuntu administrators याच अडथळ्याला वेगळ्या tool द्वारे सामोरे जातात. त्यासाठी published Docker ports ufw rules कशा दुर्लक्षित करतात हे पाहा. दोन्ही बाबतीत NAT path हेच कारण आहे. फक्त त्यापूर्वी असलेला firewall बदलतो.

Docker group मध्ये root नसलेला वापरकर्ता जोडा

प्रत्येक docker command च्या आधी sudo टाइप करणे कंटाळवाणे होते. Docker group ही गरज दूर करते:

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

usermod -aG मुळे /etc/group मध्ये बदल होतो. मात्र, तुमच्या सध्याच्या shell मध्ये group list आधीच लोड झालेली असते. त्यामुळे नवीन shell सुरू करेपर्यंत हा बदल लागू होत नाही. newgrp docker संबंधित group जोडलेला shell सुरू करते, त्यामुळे तुम्ही लगेच चाचणी करू शकता. नवीन SSH sessions मध्ये हा बदल आपोआप लागू होतो.

हा group नेमके कोणते अधिकार देतो, हे स्पष्टपणे समजून घ्या. या group चे membership /var/run/docker.sock वर write access देते. त्या socket शी संवाद साधू शकणारी कोणतीही गोष्ट daemon ला host filesystem mount करणारा container सुरू करण्यास सांगू शकते. त्याचा परिणाम एक command दाखवते:

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

या command मुळे sudo अधिकार नसलेल्या account मधून केवळ root वाचू शकणारी file वाचली जाते. Docker च्या post-install documentation मध्येही हेच नमूद केले आहे: docker group मुळे root-समान privileges मिळतात. एखाद्या account ला sudo देण्याची तुमची तयारी असेल, तेव्हाच त्या account ला या group मध्ये जोडा. नवीन server वर accounts configure करत असाल, तर नंतर विचार करण्याऐवजी हा निर्णय VPS वरील least-privilege user setup च्या इतर भागांसोबत घ्या.

Docker मध्ये rootless mode देखील उपलब्ध आहे. या mode मध्ये daemon unprivileged user म्हणून चालतो. ही स्वतंत्र install path आहे. तसेच, storage drivers आणि 1024 पेक्षा कमी ports कसे कार्य करतात, हे त्यात बदलते. त्यामुळे नंतर जोडता येणारा flag म्हणून नव्हे, तर स्वतंत्र project म्हणून त्याचे नियोजन करा.

पुढे कुठे जावे

आता तुमच्याकडे engine, compose plugin, reboot नंतरही सुरू राहणारी सेवा आणि वर दस्तऐवजीकरण केलेले EL-specific तीन व्यवहार आहेत. पुढील पायरी म्हणजे प्रत्येक सेवेसाठी compose.yaml. Compose file ची रचना या file format चे आणि ते चालवणाऱ्या commands चे स्पष्टीकरण देते. हा तुमचा पहिला container host असल्यास, VPS वर Docker चालवणे या मार्गदर्शकात समाविष्ट नसलेले sizing, storage आणि image-hygiene संबंधी प्रश्न स्पष्ट करते.

FAQ

Docker चे CentOS repository Rocky Linux आणि AlmaLinux वर कार्य करते का?

होय. `https://download.docker.com/linux/centos/docker-ce.repo ला dnf config-manager सह जोडा. त्या फाइलमधील baseurl मध्ये $releasever असते. Rocky Linux आणि AlmaLinux त्याचा विस्तार major version number मध्ये करतात. त्यामुळे EL 9 प्रणालीसाठी CentOS 9 tree आणि EL 10 प्रणालीसाठी CentOS 10 tree resolve होते. sudo dnf repoinfo docker-ce-stable वापरून हा विस्तार तपासा आणि Repo-baseurl ओळ वाचा. dnf metadata fetch करताना Status code: 404 दिसल्यास variable चा विस्तार point release मध्ये झाला आहे. /etc/yum.repos.d/docker-ce.repo` संपादित करून त्यात फक्त major number वापरल्यास ही समस्या दूर होते.

Docker आणि podman एकाच server वर install करता येतात का?

Docker च्या documentation मध्ये `podman आणि runc हे conflicting packages म्हणून नमूद केले आहेत. Docker Engine install करण्यापूर्वी दोन्ही काढून टाकण्यास त्यात सांगितले आहे. प्रत्यक्ष conflict podman-docker package मुळे होतो. हे package /usr/bin/docker चे ownership घेते आणि प्रत्येक docker command चे रूपांतर podman command मध्ये करते. त्या path चे ownership कोणत्या package कडे आहे हे पाहण्यासाठी rpm -qf "$(command -v docker)" चालवा. Output podman-docker` ने सुरू होत असल्यास podman प्रतिसाद देत आहे. दोन्ही engines ठेवणे ही Docker समर्थित रचना नाही. त्यामुळे महत्त्वाच्या server वर त्यापैकी एक निवडा.

Bind mount वर माझ्या container ला permission denied का मिळते?

Rocky Linux आणि AlmaLinux वर SELinux default ने enforcing mode मध्ये असते. Containers `container_t type म्हणून चालतात आणि त्यांना container_file_t label असलेल्या files वरच प्रवेश करता येतो. त्यामुळे तुम्ही तयार केलेल्या directory ला चुकीचा label असल्यास तिचा owner आणि mode योग्य असला तरी access denied मिळतो. Host path वर ls -ldZ आणि sudo ausearch -m avc -ts recent चालवून हे तपासा. sudo ausearch -m avc -ts recent mismatched contexts सह avc: denied print करते. Containers मध्ये shared असलेल्या content साठी volume argument मध्ये :z जोडा. फक्त एका container साठी private असलेल्या content साठी :Z वापरा. :Z कधीही /home किंवा /usr` वर लागू करू नका. Relabel recursive असल्यामुळे host बिघडू शकतो.

Container port publish करण्यासाठी firewalld मध्ये port उघडणे आवश्यक आहे का?

नाही. आणि हीच समस्या आहे. Packet host च्या input path वर पोहोचण्यापूर्वी Docker चा NAT rule destination address बदलतो. त्यामुळे firewalld चे zone rules त्या packet ची तपासणी करत नाहीत. Docker त्याचे bridges `docker नावाच्या firewalld zone मध्ये ACCEPT target सह ठेवते. -p 8080:80 सह सुरू केलेला container internet वरून reachable असतो, तर sudo firewall-cmd --list-ports काहीही print करत नाही. फक्त host ने service पर्यंत पोहोचावे असे असल्यास -p 127.0.0.1:8080:80 वापरून specific address वर publish करा. किंवा DOCKER-USER` chain मध्ये filtering rules घाला. Docker स्वतःच्या accept rules आधी या chain वर प्रक्रिया करते.

माझ्या user ला docker group मध्ये जोडणे सुरक्षित आहे का?

यामुळे root access मिळतो. docker group मधील member `/var/run/docker.sock मध्ये write करू शकतो. त्यानंतर docker run --rm -v /:/host alpine wc -l /host/etc/shadow sudo rights नसलेल्या account मधून root-only file वाचू शकते. Docker च्या post-install documentation मध्येही हीच equivalence नमूद आहे. sudo वापरण्याचा अधिकार तुम्ही आधीपासून ज्यांच्यावर विश्वास ठेवता अशाच accounts ना द्या. Shared किंवा service accounts साठी sudo docker` वापरत राहा. Unprivileged user अंतर्गत containers चालवायचे असल्यास rootless mode हा पर्याय आहे. तो setting नसून स्वतंत्र install path आहे.