SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-09-04

Rocky Linux ve AlmaLinux Docker Kurulumu Rehberi

Rocky Linux ve AlmaLinux sistemlerine Docker Engine kurulumunu dnf ile yapın. Podman çakışmalarını çözün ve SELinux bind mount hatalarını gidermek için gereken adımları öğrenin.

Rocky Linux ve AlmaLinux üzerinde Docker kurulumu

Rocky Linux veya AlmaLinux üzerinde Docker kurmak için Docker'ın kendi dnf deposunu eklemeniz, compose eklentisiyle birlikte motoru kurmanız ve ardından servisi etkinleştirmeniz gerekir. Bu işlem dört komuttan oluşur ve her iki dağıtım da Red Hat Enterprise Linux (RHEL) tabanlı olup paket yapısını paylaştığı için süreç aynıdır. CentOS Stream de aynı şekilde çalışır. Aşağıdaki her şey her iki dağıtım için de geçerlidir; bu nedenle hala bir seçim yapma aşamasındaysanız, karar verici faktörler, her projenin sunduğu uyumluluk sözü ve eski işlemcinizin hala desteklenip desteklenmediğidir.

Kurulum kısa sürdüğü için bu kılavuzun büyük bir kısmı, Enterprise Linux (EL) sistemlerinin Ubuntu'dan farklı olarak nasıl çalıştığını ele alır. İmajınızda docker komutu halihazırda Podman tarafından kullanılıyor olabilir. SELinux, bind-mount edilen dosyaları doğru etiketlere sahip olana kadar engeller. Firewalld, Docker'ın yayınladığı portları filtrelemez; bu nedenle bir container portu internete açık olabilirken firewall-cmd hiçbir portun açık olmadığını rapor edebilir.

get.docker.com adresindeki Docker kolaylık betiğini kullanmayın. Docker'ın kendi dokümantasyonu, bu betiğin üretim ortamları için önerilmediğini belirtir. Betik, depo yapılandırmanızı sormadan yeniden yazar ve yükseltme yapmak için güvenli bir şekilde tekrar çalıştırılamaz. Depoyu manuel olarak eklemek, dnf upgrade aracının Docker'ı sistemdeki diğer tüm paketler gibi yönetmesini sağlar. Bu durum aynı zamanda motoru güvenlik güncellemelerini zamanlanmış şekilde uyguluyorsanız dnf-automatic kapsamına dahil eder; bu nedenle Docker'ın otomatik olarak mı yamalanmasını yoksa bakım penceresi için bekletilmesini mi istediğinize erkenden karar verin. Her iki durumda da bir yükseltme işlemi, paketlenmiş binary dosyasını değiştirirken eski dockerd çalışmaya devam eder ve needs-restarting, yeni değiştirdiğiniz kodu hangi servislerin hala çalıştırdığını size bildiren komuttur.

Podman halihazırda docker komutuna yanıt veriyor mu?

Rocky Linux ve AlmaLinux, varsayılan depolarında podman ile gelir ve birçok VPS imajı bunu sizin yerinize kurar. Bazı imajlar daha ileri giderek podman-docker paketini kurar; bu paket /usr/bin/docker yoluna podman'i çağıran bir kabuk betiği yerleştirir. Yazdığınız her docker komutu bunun sonucunda podman'i çalıştırır; bu nedenle Docker için yazılmış bir kılavuz, beklemediğiniz çıktılar üretmeye başlar.

İlk belirti bir başlıktır. /usr/bin/docker betiği /etc/containers/nodocker dosyasını kontrol eder ve bu dosya mevcut olmadığında, herhangi bir işlem yapmadan önce tek satırlık bir uyarı yazdırır:

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

Birisi bu başlığı susturmak için o dosyayı oluşturmuş olabilir, bu yüzden sadece buna güvenmeyin. Paket veritabanına ikili dosyanın hangi pakete ait olduğunu sorun:

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

podman-docker ile başlayan bir yanıt, podman'in yanıt verdiğini gösterir. docker-ce-cli ile başlayan bir yanıt gerçek Docker'ı gösterir. Eğer rpm -qf dosyanın hiçbir pakete ait olmadığını bildiriyorsa, birisi onu manuel olarak kurmuştur; güvenmeden önce betiği okumalısınız.

Podman aynı OCI imajlarını çalıştırır ve makul bir tercihtir. Eğer onu kullanmak istiyorsanız burada durun. Her ikisi de Linux konteyner motorudur; bu nedenle platform kararı henüz verilmediyse, FreeBSD jail'lerinin bir kayıt defterinden çekilen katmanlı imajları çalıştırmak yerine tam bir kullanıcı alanını izole ettiğini bilmekte fayda vardır. Eğer Docker Engine istiyorsanız, önce çakışan paketleri kaldırın. Bu, Docker'ın RHEL için belgelediği listedir:

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

Onaylamadan önce dnf'in neleri kaldıracağını okuyun. Yeni bir VPS imajında liste kısadır. Bir başkasının halihazırda kullandığı bir sunucuda, podman paketini kaldırmak cockpit-podman paketini veya ona bağlı başka bir aracı sistemden silebilir.

Podman'i Docker ile birlikte tutmak prensipte mümkündür: yalnızca podman-docker paketini kaldırın (böylece docker ismi boşa çıkar) ve containerd.io paketinin yerini aldığı runc paketini kaldırın. Docker belgeleri podman'i çakışan bir paket olarak ele alır, bu nedenle bu yapılandırma Docker tarafından desteklenmez. Kurulum hala bir çakışma bildiriyorsa, yukarıdaki tam kaldırma listesini kullanın.

Docker deposunu dnf config-manager ile ekleme

Docker, Enterprise Linux için RPM paketlerini download.docker.com adresinde yayınlar. Depo dosyası, Rocky Linux ve AlmaLinux'un çözümleme yaptığı CentOS ağacını işaret eder. Bir Rocky sunucusunu CentOS deposuna yönlendirmek, Red Hat'in 2020 yılında CentOS'u Stream'e dönüştürmesinin ardından her iki dağıtımın da CentOS kökeninden nasıl türediğini bilmeyenler için bir hata gibi görünebilir. Ağustos 2026 itibarıyla Docker, bu depoyu CentOS Stream 9 ve CentOS Stream 10 için belgelemektedir.

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

dnf sürüm 5 ile birlikte --add-repo argümanı kaldırılmıştır, bu nedenle ikinci komut daha yeni sürümlerde başarısız olur. Hangi sürüme sahip olduğunuzu kontrol edin ve ardından eşleşen formu seçin:

dnf --version

Eğer çıktı 5.x sürümünü gösteriyorsa, bunun yerine alt komut formunu kullanın:

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

Her iki komut da aynı dosyayı /etc/yum.repos.d/docker-ce.repo konumuna yazar. Yanlış form, sessizce hatalı bir işlem yapmak yerine bilinmeyen argüman hatası verir; bu sayede durumu gözden kaçırmazsınız.

Bu depo dosyası baseurl değerini $releasever içeren bir yola ayarlar ve dnf bu değişkeni release paketinizden genişletir. Rocky Linux ve AlmaLinux bunu ana sürüm numarasına ayarlar; yani EL 9 üzerinde 9 ve EL 10 üzerinde 10 değerini alır. CentOS deposunun bir Rocky sunucusunda doğru şekilde çözümlenmesinin nedeni budur. Kurulumdan önce genişletmeyi doğrulayın:

sudo dnf repoinfo docker-ce-stable

Repo-baseurl satırını okuyun. Satır /9/x86_64/stable veya /10/x86_64/stable ile bitmelidir. Eğer release paketiniz $releasever değerini 9.6 gibi bir ara sürüm numarasına ayarlarsa, dnf meta verileri çekerken bu URL için Status code: 404 hatası bildirir. Bunu düzeltmek için /etc/yum.repos.d/docker-ce.repo dosyasını düzenleyin ve $releasever ifadesini sadece ana sürüm numarasıyla değiştirin.

Motoru ve compose eklentisini kurun

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

Beş paket mevcuttur ve her biri tek bir iş yapar. docker-ce arka plan sürecidir (daemon), dockerd. docker-ce-cli, yazdığınız docker komutudur. containerd.io, arka plan sürecinin yönettiği container çalışma zamanıdır (runtime). docker-buildx-plugin imajları oluşturur. docker-compose-plugin ise docker compose özelliğini bir alt komut olarak sağlar.

Bu paketler tire işareti içeren bir docker-compose ikili dosyası kurmaz. Bu, Temmuz 2023'te kullanım ömrü sona eren Compose v1 sürümüdür. docker-compose komutunu tire işaretiyle çağıran her şeyin, boşluk karakteriyle docker compose komutuna güncellenmesi gerekir.

İlk kurulum, Docker'ın imzalama anahtarını içe aktarmak için durur ve size parmak izini gösterir. Anahtar, az önce eklediğiniz depo dosyasındaki gpgkey=https://download.docker.com/linux/centos/gpg adresinden gelir; bu nedenle kabul etmeden önce dnf tarafından yazdırılan parmak izini bu URL ile karşılaştırın.

Bir hata, isimlendirilecek kadar sık görülür. Eğer dnf, containerd.io paketinin container-selinux gerektirdiğini ancak hiçbir paketin bunu sağlamadığını bildirirse, AppStream deponuz devre dışı bırakılmıştır. dnf repolist komutunu çalıştırın ve appstream öğesinin listelendiğini doğrulayın; çünkü container-selinux, EL 9 ve EL 10 üzerinde bu depodan dağıtılır.

Docker'ı başlatın ve çalıştığını doğrulayın

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

Docker'ın RPM paketleri, kurulum sonrasında daemon'ı durdurulmuş ve devre dışı bırakılmış halde bırakır. Bu adımın Docker'ın Ubuntu sayfasında değil de CentOS sayfasında yer almasının nedeni budur; Ubuntu'da deb paketi servisi sizin yerinize başlatır. enable komutunu atlarsanız Docker bir sonraki yeniden başlatmaya kadar çalışır, ardından durur ve tüm container'ları da beraberinde kapatır.

systemctl status komutu Active: active (running) çıktısını vermelidir. hello-world container'ı This message shows that your installation appears to be working correctly. çıktısını verip sonlanmalıdır. Eğer bunun yerine /var/run/docker.sock üzerinde bir izin hatası veriyorsa, sudo adımını atlamışsınız demektir; bu durum aşağıdaki docker grubu bölümü ile düzeltilir.

Compose eklentisini ayrıca kontrol edin, çünkü bu farklı bir pakettir ve motor düzgün çalışsa bile eksik olabilir:

docker compose version

Sağlıklı bir yanıt Docker Compose version v2.x.x gibi görünmelidir. Servislerinizi yeniden başlatma sonrasında geri getirmek, daemon'ı etkinleştirmekten farklı bir konudur ve yeniden başlatma politikaları, Compose servislerinin sistem açılışında geri gelip gelmeyeceğine karar verir.

Bind mount neden permission denied hatası verir?

Rocky Linux ve AlmaLinux, SELinux (Security-Enhanced Linux) sistemini varsayılan olarak enforcing modunda çalıştırır. Bunu getenforce komutuyla doğrulayabilirsiniz; komut Enforcing çıktısını verir.

Docker container'ları container_t SELinux türü altında çalışır ve bu tür yalnızca container_file_t etiketine sahip dosyaları okuyup yazabilir. Host üzerinde oluşturduğunuz bir dizin, üst dizininin etiketini alır; bu da container_file_t değildir. Host tarafından bakıldığında kullanıcı, grup ve izinler doğru görünse bile container'ın erişimi reddedilir. Bu durumu üç komutla yeniden oluşturabilirsiniz:

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 şu çıktıyı verir:

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

İki komut sorunun nedenini gösterir. ls -ldZ /srv/site, /srv altındaki bir yol için system_u:object_r:var_t:s0 olan (container_file_t olmayan) etiketi yazdırır. Ardından sudo ausearch -m avc -ts recent, çekirdeğin denetim kaydını yazdırır; bu kayıt avc: denied { read }, container_t değerini içeren bir scontext= alanı ve dizin üzerinde az önce gördüğünüz etiketi içeren bir tcontext= alanı barındırır. Bu iki alan arasındaki uyuşmazlık sorunun tamamıdır.

Çözüm, volume argümanına bir sonek eklemektir. Docker, yolu sizin için yeniden etiketler:

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

Küçük harfli :z, içeriği paylaşılan olarak yeniden etiketler; böylece birden fazla container aynı dizini kullanabilir. Büyük harfli :Z ise içeriği özel ve paylaşılmayan olarak, tek bir container'a bağlı şekilde yeniden etiketler; bu durumda aynı yolu okumaya çalışan ikinci bir container'ın erişimi reddedilir. Sidecar veya yedekleme container'larının da eriştiği her şey için :z kullanın. Tek bir container'ın sahip olduğu veritabanı dizini için :Z kullanın.

Docker dokümantasyonu, yeniden etiketleme işlemi özyinelemeli (recursive) olduğu için tekrarlanması gereken bir uyarı içerir. /home veya /usr gibi bir sistem dizinini :Z ile bind mount etmek, "host makinenizi kullanılamaz hale getirir ve host makine dosyalarını elle yeniden etiketlemeniz gerekebilir". Bu sonekleri yalnızca container için oluşturduğunuz dizinlere yönlendirin, asla bir sistem yoluna uygulamayın.

Compose içinde sonek aynı dizgeye eklenir:

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

İki sınıra dikkat etmek gerekir. --mount bayrağı SELinux etiketi atayamaz, bu yüzden etiket gerektiğinde -v kullanın. Adlandırılmış volume'lar (named volumes) soneke ihtiyaç duymaz, çünkü Docker /var/lib/docker/volumes altında oluşturduğu dizinleri kendisi etiketler.

SELinux'u kapatmayın. sudo setenforce 0 komutunu yalnızca bir dakikalık test için kullanın: eğer container bu şekilde çalışıyorsa, sorun bir etiket sorunudur ve çözümü :z kullanmaktır. İşlem biter bitmez sudo setenforce 1 ile sistemi eski haline getirin. Enterprise Linux üzerinde, bind mount kaynaklı permission denied hatasının container içinden aynı görünen iki ayrı nedeni vardır. Biri SELinux etiketidir. Diğeri ise normal sayısal kullanıcı ve grup sahipliğidir; bu sorun PUID ve PGID değişkenlerinin var olma nedenidir. ls -lnZ komutu izinleri, sayısal kullanıcıyı ve etiketi tek satırda gösterir; böylece hangisiyle uğraştığınızı anlayabilirsiniz.

firewalld kapalı görünürken yayınlanan bir port neden erişilebilir durumdadır?

Firewalld, Rocky Linux ve AlmaLinux üzerinde varsayılan güvenlik duvarıdır. sudo systemctl is-active firewalld komutu ile çalışıp çalışmadığını kontrol edin. Eğer bu sunucuda henüz yapılandırma yapmadıysanız, öncelikle firewalld ile SSH ve web portu açma işlemini gerçekleştirin; çünkü aşağıdaki durum ancak karşılaştırma yapabileceğiniz çalışan bir bölge kural kümeniz olduğunda anlam kazanır. Şimdi bir portu yayınlayın ve firewalld'un neyin açık olduğunu düşündüğüne bakın:

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

firewall-cmd boş bir satır yazdırır. Başka bir makineden curl -I http://YOUR_SERVER_IP:8080/ komutu HTTP/1.1 200 OK sonucunu döndürür. Port internete açıktır ancak güvenlik duvarınız hiçbir şey rapor etmez.

Bunun nedeni paketin izlediği yoldur. Firewalld bölge kuralları, doğrudan ana makineye (host) yönlendirilen trafiği filtreler. Yayınlanan bir port ana makineye adreslenmemiştir: Docker, paket ana makinenin giriş yoluna ulaşmadan önce hedefi container adresine yeniden yazan bir hedef NAT (ağ adresi çevirisi) kuralı yükler; bu nedenle çekirdek, paketi yerel olarak teslim etmek yerine iletir (forward). Docker daha sonra köprü arayüzlerini hedefi ACCEPT olan docker adlı bir firewalld bölgesine yerleştirir ve herhangi bir bölgeden docker bölgesine iletime izin veren docker-forwarding adlı bir iletim politikası ekler. Bölge kurallarınız paketi hiçbir zaman görmez.

En temiz çözüm hiçbir güvenlik duvarı kuralı gerektirmez. Yayınlanan portun ana makine tarafını loopback adresine bağlayın ve önüne bir reverse proxy koyun:

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/

Yerel curl komutu HTTP/1.1 200 OK döndürür ve başka bir makineden gelen aynı istek artık bağlanmaz. -p argümanında ana makine adresi bulunmayan her şey tüm arayüzlerde yayınlanır; bu nedenle yalın bir -p 8080:80 ifadesini, o servisi herkese açık hale getirme kararı olarak değerlendirin.

Bir servisin bazı adreslerden erişilebilir, diğerlerinden erişilemez olması gerektiğinde Docker sizin için bir zincir (chain) ayırır. DOCKER-USER, Docker'ın kendi kabul kurallarından önce işlenir; bu nedenle buraya koyduğunuz bir kural, Docker yeniden başlatılıp zincirlerini yeniden yazdığında silinmez:

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

eth0 varsayımında bulunmak yerine arayüz adını ip route show default komutundan alın, çünkü güncel EL imajları enp1s0 veya ens3 gibi isimler kullanır. Rocky ve AlmaLinux üzerinde iptables komutu nftables üzerinde bir uyumluluk katmanıdır ve Docker'ın zincirleri bu komut aracılığıyla görülebilir. Bu şekilde eklenen kurallar, kaydetmediğiniz sürece yeniden başlatma sonrasında silinir; bu nedenle kurallardan memnun kaldığınızda bunları bir systemd birimine yazın.

2025 yılında yayınlanan Docker Engine 28.0, benzer bir açığı kapattı: yayınlanmamış container portlarına doğrudan yönlendirilmiş erişim artık DOCKER zincirinde engellenmektedir. Bu değişiklik yayınlanmış portları etkilemez, bu nedenle yukarıdaki her şey güncel sürümlerde geçerliliğini korur. Bir operasyonel alışkanlık edinmekte fayda vardır: herhangi bir sudo firewall-cmd --reload işleminden sonra yayınlanan bir portu tekrar test edin. Eğer yanıt vermeyi durdurursa, sudo systemctl restart docker komutu Docker'ın kurallarını yeniden yükler.

Ubuntu yöneticileri aynı engelle farklı bir araç üzerinden karşılaşır; bu durum yayınlanan Docker portlarının neden ufw kurallarını görmezden geldiğinin nedenidir. Her iki durumda da neden NAT yoludur. Sadece önündeki güvenlik duvarı değişir.

Docker grubuna root olmayan bir kullanıcı ekleme

Her docker komutundan önce sudo yazmak zamanla zahmetli hale gelir; docker grubu bu ihtiyacı ortadan kaldırır:

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

usermod -aG komutu /etc/group dosyasını düzenler, ancak mevcut kabuğunuz (shell) halihazırda kendi grup listesine sahip olduğundan, değişiklik yeni bir oturum açana kadar geçerli olmaz. newgrp docker komutu, grubu dahil edilmiş yeni bir kabuk başlatır; böylece değişikliği hemen test edebilirsiniz. Yeni SSH oturumları bu değişikliği otomatik olarak algılar.

Bu grubun ne tür yetkiler sağladığı konusunda net olun. Üyelik, /var/run/docker.sock dosyasına yazma erişimi sağlar; bu soketle iletişim kurabilen herhangi bir süreç, daemon'dan ana makinenin dosya sistemini bağlayan bir container başlatmasını isteyebilir. Tek bir komut bunun ne anlama geldiğini gösterir:

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

Bu komut, sudo yetkisi olmayan bir hesaptan, yalnızca root kullanıcısının okuyabildiği bir dosyayı okur. Docker'ın kendi kurulum sonrası belgeleri de aynı noktaya dikkat çeker: docker grubu, root ile eşdeğer ayrıcalıklar sağlar. Bir hesabı bu gruba yalnızca o hesaba sudo yetkisi vermeyi göze alıyorsanız ekleyin. Yeni bir sunucuda hesapları yapılandırıyorsanız, bu kararı sonradan değil, VPS üzerinde en az ayrıcalıklı kullanıcı kurulumu sürecinin bir parçası olarak değerlendirin.

Docker ayrıca daemon'ı ayrıcalıksız bir kullanıcı olarak çalıştıran rootless modunu da sunar. Bu ayrı bir kurulum yoludur ve depolama sürücüleri ile 1024 altındaki portların davranışını değiştirir; bu nedenle bunu sonradan eklenen bir bayrak (flag) olarak değil, başlı başına bir proje olarak planlayın.

Sırada ne var

Artık elinizde bir motor, compose eklentisi, yeniden başlatma sonrasında çalışmaya devam eden bir servis ve yukarıda belgelenen üç EL'ye özgü davranış bulunuyor. Bir sonraki adım servis başına bir compose.yaml oluşturmaktır; Compose dosyasının yapısı başlığı, dosya formatını ve onu yöneten komutları ele almaktadır. Eğer bu sizin ilk container sunucunuz ise, VPS üzerinde Docker çalıştırma rehberi, bu kılavuzun dışında kalan boyutlandırma, depolama ve imaj temizliği konularını kapsamaktadır.

FAQ

Docker'ın CentOS deposu Rocky Linux ve AlmaLinux üzerinde çalışır mı?

Evet. https://download.docker.com/linux/centos/docker-ce.repo dosyasını dnf config-manager ile ekleyin. Bu dosyadaki baseurl, $releasever içerir; Rocky Linux ve AlmaLinux bunu ana sürüm numarasına genişletir. Bu sayede EL 9 bir sistem CentOS 9 ağacına, EL 10 bir sistem ise CentOS 10 ağacına yönlenir. Genişletmeyi sudo dnf repoinfo docker-ce-stable ile doğrulayın ve Repo-baseurl satırını okuyun. Status code: 404 hatası, dnf meta verileri çekerken değişkenin bir ara sürüme genişlediği anlamına gelir; /etc/yum.repos.d/docker-ce.repo dosyasını düzenleyerek değişkeni doğrudan ana sürüm numarasıyla değiştirmek sorunu çözer.

Docker ve podman aynı sunucuya kurulabilir mi?

Docker belgeleri podman ve runc paketlerini çakışan paketler olarak listeler ve Docker Engine kurulumundan önce her ikisinin de kaldırılmasını önerir. Somut çakışma, /usr/bin/docker yoluna sahip olan ve her docker komutunu bir podman komutuna dönüştüren podman-docker paketinden kaynaklanır. Hangi paketin bu yola sahip olduğunu görmek için rpm -qf "$(command -v docker)" komutunu çalıştırın. Çıktı podman-docker ile başlıyorsa, podman yanıt veriyor demektir. Her iki motoru bir arada tutmak Docker tarafından desteklenen bir yapılandırma değildir; bu nedenle kritik bir sunucuda tek birini tercih edin.

Konteynerim bind mount üzerinde neden permission denied hatası alıyor?

Rocky Linux ve AlmaLinux üzerinde SELinux varsayılan olarak zorunlu (enforcing) moddadır. Konteynerler container_t türüyle çalışır ve yalnızca container_file_t etiketli dosyalara erişebilirler. Oluşturduğunuz dizin yanlış etikete sahipse, dosya sahibi veya izinleri ne olursa olsun erişim reddedilir. Bunu ana makine yolunda ls -ldZ ile doğrulayın; sudo ausearch -m avc -ts recent komutu, eşleşmeyen iki bağlamı avc: denied ile gösterecektir. Konteynerler arasında paylaşılan içerik için volume argümanına :z, tek bir konteynere özel içerik için ise :Z ekleyin. :Z yolunu asla /home veya /usr dizinlerine yönlendirmeyin; çünkü yeniden etiketleme işlemi özyinelemelidir (recursive) ve ana makineyi bozabilir.

Konteyner portunu dışarı açmak için firewalld üzerinde port açmam gerekir mi?

Hayır, sorun da tam olarak budur. Docker'ın NAT kuralı, paket ana makinenin giriş yoluna ulaşmadan önce hedef adresi yeniden yazar; bu nedenle firewalld bölge kuralları paketi denetleyemez. Docker ayrıca kendi köprülerini ACCEPT hedefli docker adlı bir firewalld bölgesine yerleştirir. -p 8080:80 ile başlatılan bir konteyner internetten erişilebilir durumdayken sudo firewall-cmd --list-ports hiçbir çıktı vermez. Servise yalnızca ana makineden erişilmesi gerekiyorsa -p 127.0.0.1:8080:80 ile belirli bir adrese yayın yapın veya Docker'ın kendi kabul kurallarından önce işlediği DOCKER-USER zincirine filtreleme kuralları ekleyin.

Kullanıcımı docker grubuna eklemek güvenli midir?

Bu işlem root yetkisi verir. docker grubunun bir üyesi /var/run/docker.sock dosyasına yazabilir ve docker run --rm -v /:/host alpine wc -l /host/etc/shadow, sudo yetkisi olmayan bir hesaptan root'a özel bir dosyayı okuyabilir. Docker'ın kurulum sonrası belgeleri de aynı eşdeğerliği belirtir. Yalnızca sudo yetkisi vermeyi düşündüğünüz hesapları ekleyin; paylaşımlı veya servis hesapları için sudo docker kullanmaya devam edin. Konteynerleri yetkisiz bir kullanıcı altında çalıştırmanız gerektiğinde alternatif, bir ayar değişikliğinden ziyade ayrı bir kurulum yolu olan rootless modudur.