Docker komutlarında aldığınız "permission denied" hatası, kullanıcınızın Docker daemon'ının Unix soketine (/var/run/docker.sock) erişme yetkisi olmadığı anlamına gelir. Belgelere göre bu soketin sahibi varsayılan olarak root kullanıcısıdır ve diğer kullanıcılar ona yalnızca sudo ile erişebilir. Kalıcı çözüm, kullanıcınızı docker grubuna eklemek ve oturumu kapatıp yeniden açmaktır; ancak bu grubun kullanıcıya root düzeyinde yetki verdiğini bilerek karar vermelisiniz.

Bu yazıda Docker'ın kurulum sonrası adımlar sayfasındaki iki yöntemi (gruba kalıcı ekleme ve parola korumalı, isteğe bağlı grup erişimi) ayrıntılı anlatıyor, ~/.docker dizininde sık görülen izin hatasını ve Docker'ın açılışta başlamasını ele alıyoruz. Linux grup ve kullanıcı yönetiminin temelleri için Linux kullanıcı ve grup yönetimi yazısına bakabilirsiniz.

Hata neden oluşur?

Hata neden oluşur?

Docker daemon'ı bir TCP portuna değil, bir Unix soketine bağlanır. docker komutu yazdığınızda CLI bu soket üzerinden daemon'a istek gönderir. Soketin sahibi root olduğu için sıradan bir kullanıcı sokete yazamaz ve CLI izin hatası verir. Belgelerin vurguladığı ikinci bir nokta da şudur: Docker daemon'ı her zaman root kullanıcısıyla çalışır. Yani aşağıdaki yöntemler daemon'ın yetkisini değiştirmez, yalnızca sizin o sokete kimin erişebileceğini değiştirir.

Daemon başladığında, docker grubunun üyelerinin erişebileceği bir Unix soketi oluşturur. Bazı dağıtımlarda paket yöneticisiyle kurulum sırasında bu grup otomatik oluşturulur. Örneğin Fedora, RHEL ve CentOS kurulum sayfaları, kurulumun docker grubunu oluşturduğunu ama varsayılan olarak hiçbir kullanıcıyı eklemediğini açıkça belirtir.

Bu hatayı "Cannot connect to the Docker daemon" mesajıyla karıştırmayın. O mesaj daemon'ın çalışmadığını veya istemcinin başka bir hosta bağlanmaya çalıştığını gösterir; teşhisi Cannot connect to the Docker daemon hatası yazısında. İzin hatasında ise daemon çalışıyordur, sorun yalnızca soket erişimidir.

Önce bilin: docker grubu root yetkisi demektir

Bunun nedeni Docker güvenlik sayfasında "daemon saldırı yüzeyi" başlığı altında anlatılır. Docker, host ile container arasında bir dizini paylaşmanıza ve bunu container'ın erişim haklarını sınırlamadan yapmanıza izin verir. Örneğin host'un / dizinini container içinde /host olarak bağlayan bir container başlatabilirsiniz ve bu container host dosya sistemini kısıtsız değiştirebilir. Sokete erişebilen herkes böyle bir container başlatabileceği için, belgeler daemon'ı yalnızca güvenilir kullanıcıların kontrol etmesi gerektiğini söyler.

Aynı mantık, Docker soketini bir container'ın içine bağlamak için de geçerlidir. Panel veya otomasyon araçları için soketi container'a vermenin riskini Portainer kurulumu yazısında ele aldık. Daemon'ı root olmadan çalıştırmak istiyorsanız tamamen farklı bir yol olan rootless modu Docker rootless mod yazısında anlatıyoruz.

Yöntem 1: Kullanıcıyı docker grubuna eklemek

Yöntem 1: Kullanıcıyı docker grubuna eklemek

Bu yöntem, oturumunuz boyunca sudo yazmadan Docker kullanmanızı sağlar. Adımlar şunlardır:

bash
sudo groupadd docker
sudo usermod -aG docker $USER

# Oturumu kapatıp yeniden açın ya da mevcut kabukta:
newgrp docker

docker run hello-world

groupadd docker grubu oluşturur; belgelere göre bazı dağıtımlarda grup paket kurulumu sırasında zaten oluşturulduğu için bu adıma gerek kalmaz. usermod -aG docker $USER o anda oturum açmış kullanıcınızı ($USER) docker grubuna ekler; komutu belgelerdeki biçimiyle, -aG bayraklarıyla birlikte yazın. usermod ve grup kavramlarının ayrıntısı için Linux kullanıcı ve grup yönetimi yazısına bakabilirsiniz. Grup üyeliği oturum açılırken değerlendirildiği için oturumu kapatıp yeniden açmanız gerekir. Belgeler Linux'u bir sanal makinede çalıştırıyorsanız değişikliğin etkin olması için sanal makineyi yeniden başlatmanın gerekebileceğini de not eder. Kabuğu kapatmadan denemek isterseniz newgrp docker değişikliği o kabukta etkinleştirir.

Son adımda docker run hello-world komutunu sudo olmadan çalıştırırsınız. Komut bir test imajı indirir, bir container içinde çalıştırır, bir mesaj yazdırır ve çıkar. Bu çalışıyorsa soket erişiminiz tamamdır.

Sık görülen yan etki: ~/.docker/config.json izin hatası

Gruba eklenmeden önce Docker CLI komutlarını sudo ile çalıştırdıysanız şu uyarıyla karşılaşabilirsiniz (belgelerdeki örnek):

text
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

Bunun nedeni, daha önce sudo ile çalışan CLI'nin ~/.docker/ dizinini root sahipliğinde oluşturmuş olmasıdır. İki çözüm vardır. Birincisi dizini silmektir; dizin otomatik yeniden oluşturulur ama içindeki özel ayarlar kaybolur. İkincisi sahipliği ve izinleri düzeltmektir:

bash
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

Yöntem 2: Parola korumalı, isteğe bağlı grup erişimi

Belgelerin anlattığı ikinci yöntem daha az bilinir. Kullanıcınızı gruba kalıcı olarak eklemezsiniz; bunun yerine docker grubuna bir grup parolası koyar ve Docker'a ihtiyaç duyduğunuzda newgrp docker ile parola girerek Docker yetkili bir alt kabuk açarsınız. Grup parolaları eski bir Unix erişim denetimi mekanizmasıdır ama tek kullanıcılı bir iş istasyonunda Docker erişimini bir parola adımının arkasına koymak için işe yarar.

Kalıcı grup üyeliğinin bir sakıncası, oturumunuzdaki her sürecin Docker soketine erişebilmesidir. Bu yöntemde yalnızca Docker yetkili kabuk ve onun alt süreçleri sokete erişir; oturumunuzun başka yerlerinde çalışan uygulamaların "ortam erişimi" azalır. sudo docker kullanmaktan farkı ise CLI'nin sizin kullanıcı kimliğinizle çalışmaya devam etmesidir; erişim kabuğun birincil grubu üzerinden gelir ve CLI yapılandırmasına root olarak erişmez.

bash
command -v gpasswd newgrp

sudo groupadd --force docker
sudo gpasswd --delete "$USER" docker
# Oturumu tamamen kapatıp yeniden açın, sonra docker grubunun listede olmadığını doğrulayın:
id -nG

sudo gpasswd docker
newgrp docker
id -un
id -gn
docker run --rm hello-world
exit

Adımların anlamı şöyledir. command -v ile gpasswd ve newgrp komutlarının kurulu olduğunu doğrularsınız; paket adları dağıtıma göre değişir. groupadd --force grup zaten varsa da başarılı döner. Kullanıcınız gruptaysa gpasswd --delete ile çıkarırsınız. Belgeler burada önemli bir uyarı yapar: grup üyeliği mevcut süreçlerin kimlik bilgilerinde kalır, bu yüzden yeni bir terminal açmak yetmez; masaüstü veya SSH oturumundan tamamen çıkıp yeniden girmeniz gerekir. id -nG çıktısında docker görünmemelidir.

sudo gpasswd docker gruba özel bir parola atar. Kullanıcınızı gruba geri eklemeyin; grup üyeleri newgrp komutunu parola girmeden kullanabilir ve bu, yöntemin amacını boşa çıkarır. newgrp docker parolayı sorar ve docker birincil grup olacak şekilde bir alt kabuk başlatır. id -un hâlâ sizin kullanıcı adınızı, id -gn ise docker değerini göstermelidir. İşiniz bitince exit ile kabuktan çıkarsınız.

Bu kabukta oluşturduğunuz dosya ve dizinler genellikle docker grubunun sahipliğinde olur; belgeler bu kabuğu yalnızca Docker komutları için kullanmanızı ya da oluşturduğunuz dosyaların grup sahipliğini kontrol etmenizi önerir. Parolalı girişi kapatıp yeniden yalnızca grup üyeliğine dönmek için sudo gpasswd --restrict docker komutu kullanılır; bu komut mevcut Docker yetkili kabukları sonlandırmaz, yalnızca yeni yetkilendirme girişimlerini etkiler. gpasswd yerel /etc/group ve /etc/gshadow dosyalarını yönetir; LDAP veya NIS gibi bir kimlik servisi kullanan sistemlerde o servisin grup yönetimi gerekir.

Yöntemlerin karşılaştırması

Yöntemlerin karşılaştırması: sudo docker, docker grubu üyeliği, newgrp ile grup parolası, Rootless mod
YöntemSokete kim erişirParolaUygun olduğu durum
sudo dockerYalnızca sudo ile çalışan komutsudo parolasıDocker'ı nadiren kullanan yöneticiler
docker grubu üyeliğiOturumdaki tüm süreçlerYokDocker'ı sürekli kullanan güvenilir kullanıcı
newgrp ile grup parolasıYalnızca Docker yetkili kabuk ve alt süreçleriPaylaşılan grup parolasıTek kullanıcılı iş istasyonu
Rootless modDaemon zaten kullanıcı olarak çalışırGerekmezDaemon'ın root olmaması gereken ortamlar

Bir production VPS'te pratik bir yaklaşım şudur: Docker'ı yöneten tek bir dağıtım kullanıcısını gruba ekleyin, diğer SSH kullanıcılarını eklemeyin. Gruptaki her hesabın fiilen root olabildiğini hatırlayarak SSH anahtarlarını ve hesapları buna göre koruyun. Genel sertleştirme adımları için VPS güvenlik sertleştirme yazısına bakabilirsiniz. Belgeler ayrıca daha güçlü yalıtım için rootless modu veya Docker'ı bir sanal makinede çalıştırmayı önerir.

Docker'ı açılışta systemd ile başlatmak

Kurulum sonrası adımlar sayfasının bir diğer konusu, Docker'ın açılışta otomatik başlamasıdır. Debian ve Ubuntu'da Docker servisi açılışta varsayılan olarak başlar. systemd kullanan diğer dağıtımlarda Docker ve containerd servislerini şu komutlarla etkinleştirirsiniz:

bash
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

# Geri almak için:
sudo systemctl disable docker.service
sudo systemctl disable containerd.service

Belgeler systemd unit dosyalarıyla Docker servisini başka açılardan da özelleştirebileceğinizi söyler; örneğin bir HTTP proxy eklemek veya Docker çalışma dosyaları için farklı bir dizin ya da bölüm kullanmak. Proxy ve veri dizini ayarları daemon.json yapılandırma yazısında. Container'ların kendisinin açılışta yeniden başlaması ise ayrı bir konudur ve restart policy ile yönetilir: Docker restart policy.

Aynı sayfanın son önerisi log diskini korumaktır: varsayılan json-file log sürücüsü dosyaları zamanla büyür ve disk alanını tüketebilir. Rotasyon ayarları için Docker log boyutunu sınırlama yazısına bakın.

Sık yapılan hatalar

  • Gruba ekleyip oturumu yenilememek: grup üyeliği oturum açılırken değerlendirilir; yeniden giriş yapmadan veya newgrp docker çalıştırmadan değişiklik görünmez.
  • Komutu kendi bildiğiniz biçimde kısaltmak: belgelerdeki komut sudo usermod -aG docker $USER biçimindedir; bayrakları değiştirmeden kullanın ve sonucu id -nG ile kontrol edin.
  • Önce sudo ile CLI kullanıp sonra izin uyarısına şaşırmak: ~/.docker dizini root sahipliğinde kalmışsa yukarıdaki chown ve chmod komutlarıyla düzeltin.
  • Soket izinlerini elle gevşetmek: belgeler soket erişimi için yalnızca grup üyeliğini ve grup parolası yöntemini tarif eder; soketin izinlerini herkese açmak gibi bir yöntem sunmaz.
  • Daemon'ı TCP üzerinden şifresiz açmak: güvenlik sayfasına göre daemon API'sini TLS olmadan HTTP üzerinden açmak artık kabul edilmez ve daemon başlangıçta hata verir. Uzaktan yönetim için SSH veya TLS kullanın: Docker daemon uzak erişim.
  • Grup parolası yöntemini güvenlik sınırı sanmak: belgeler bu yöntemin kötü amaçlı koda karşı koruma olmadığını açıkça söyler.

Sık Sorulan Sorular

docker grubuna eklemek ile rootless mod aynı şey mi?

Hayır. Gruba eklemede daemon yine root olarak çalışır, siz yalnızca soketine erişim kazanırsınız. Rootless modda ise daemon'ın kendisi root olmayan bir kullanıcı olarak çalışır. Belgeler sudo olmadan ve root yetkisi vermeden Docker çalıştırmak isteyenleri rootless moda yönlendirir.

Gruba ekledim ama hâlâ permission denied alıyorum, neden?

En sık neden oturumun yenilenmemesidir. Tamamen çıkış yapıp yeniden girin veya newgrp docker çalıştırın. Sanal makinede çalışıyorsanız belgeler sanal makineyi yeniden başlatmanın gerekebileceğini belirtir. Ardından id -nG çıktısında docker grubunu görmelisiniz.

docker grubundan bir kullanıcıyı nasıl çıkarırım?

Belgelerdeki komut sudo gpasswd --delete "$USER" docker biçimindedir. Grup üyeliği mevcut süreçlerde kalmaya devam ettiği için kullanıcının oturumu tamamen kapatıp açması gerekir.

CI veya deploy betikleri için hangi yöntem uygun?

Belgeler bu konuda ayrı bir öneri vermez. Genel kural, gruba eklenen her hesabın root düzeyinde yetki kazandığıdır; bu yüzden betiklerin çalıştığı hesabı yalnızca bu işe ayırmak ve diğer kullanıcılardan ayrı tutmak mantıklıdır. Uzak bir makineden deploy ediyorsanız Docker context ile uzak sunucu yönetimi yazısı SSH tabanlı bağlantıyı anlatır.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Docker öğrenme rehberi · Docker Ubuntu kurulumu · rootless mod · daemon uzak erişim · daemon bağlantı hatası · Linux kullanıcı ve grup yönetimi · Portainer ve docker.sock