الخطأ “permission denied while trying to connect to the Docker daemon socket” يعني أن مستخدمك ليس لديه إذن للوصول إلى /var/run/docker.sock. هذا الدليل يوضح لك كيفية إصلاحه وفهم الآثار الأمنية.

الأعراض

تشغيل أي أمر docker يفشل مع:

docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

أو عند بناء أو تشغيل الحاويات:

docker build -t myapp:latest .
Got permission denied...

docker run -it ubuntu bash
Got permission denied...

لماذا يحدث

مرتب حسب الاحتمالية:

  1. المستخدم ليس في مجموعة docker — بشكل افتراضي، فقط root والمستخدمون في مجموعة docker يستطيعون الوصول إلى Docker socket.
  2. وضع Docker بدون جذر نشط — Docker daemon يعمل كمستخدم عادي، إذًا موقع socket ومالكه مختلفان.
  3. ملكية socket غير صحيحة — /var/run/docker.sock مملوك من قبل root أو مستخدم آخر، ليس مستخدمك أو مجموعة docker.
  4. تثبيت Snap من Docker — تقييد Snap قد يمنع الوصول إلى socket.
  5. WSL2 (Windows Subsystem for Linux) تعقيدات — Docker Desktop for Windows يستخدم مسار socket مختلفًا أو طريقة تكامل.
  6. ملف Socket تم حذفه أو إعادة إنشاؤه — بعد تحديث النظام أو إعادة تشغيل Docker، قد يكون socket لديه صلاحيات خاطئة.

الحل

1. المستخدم ليس في مجموعة docker

أضف مستخدمك إلى مجموعة docker:

sudo usermod -aG docker $USER

الرايات aG تعني “append to groups” بحيث تحتفظ بمجموعاتك الموجودة.

طبّق تغيير المجموعة. اختر واحدًا:

الخيار أ: إعادة تحميل عضوية المجموعة (هذه الجلسة فقط):

newgrp docker

الخيار ب: اخرج وسجل الدخول (دائم):

logout
# سجل الدخول مجددًا

تحقق من أنه يعمل:

docker ps
# يجب أن يرجع قائمة الحاويات بدون "permission denied"

تحقق من أنك في مجموعة docker:

id -G
# يجب أن تشمل رقمًا لمجموعة 'docker' (عادة 999)

groups $USER
# يجب أن تظهر: user : user docker ...

2. وضع Docker بدون جذر نشط

Docker بدون جذر يشغل daemon كمستخدم عادي. تحقق إذا كان مفعلًا:

docker run --rm -it alpine cat /proc/self/cgroup | grep docker
# إذا كان بدون جذر، المسار يشمل /user.slice/...

أو تحقق من موقع Docker socket:

# معيار: /var/run/docker.sock
# بدون جذر: ~/.docker/run/docker.sock

ls -la /var/run/docker.sock
ls -la ~/.docker/run/docker.sock

إذا كنت تستخدم Docker بدون جذر، مستخدمك يجب أن يكون لديه وصول بالفعل حيث أن daemon يعمل كمستخدمك. تحقق:

docker ps

إذا حصلت على خطأ إذن مختلف، قد لا يكون daemon قيد التشغيل. شغّله:

# لـ Docker بدون جذر
dockerd-rootless-setuptool.sh install

# أو شغّله يدويًا
start-rootless

للعودة إلى Docker المعياري (مع مجموعة docker):

# أزل البدون جذر
dockerd-rootless-setuptool.sh uninstall

# ثبّت Docker المعياري
# (اتبع دليل تثبيت توزيعتك)

3. ملكية Socket غير صحيحة

تحقق من مالك docker socket:

ls -la /var/run/docker.sock
# المخرجات: srw-rw---- 1 root docker 0 Oct 26 11:00 /var/run/docker.sock

يجب أن يكون مملوكًا من قبل root:docker مع صلاحيات 660. إذا لم يكن:

# أصلح الملكية
sudo chown root:docker /var/run/docker.sock

# أصلح الصلاحيات
sudo chmod 660 /var/run/docker.sock

تحقق:

ls -la /var/run/docker.sock
# الآن يظهر: srw-rw---- 1 root docker ...

docker ps

إذا تم حذف socket (مثلاً، بعد انهيار النظام أو تحديث)، أعد تشغيل Docker:

sudo systemctl restart docker
ls -la /var/run/docker.sock    # يجب أن يظهر مجددًا

4. تثبيت Snap من Docker

تقييد Snap قد يمنع وصول Docker. تحقق إذا تم تثبيت Docker عبر Snap:

which docker
# إذا أظهر: /snap/bin/docker
# إذًا إنه تثبيت Snap

للسماح لـ Snap بالوصول إلى Docker socket، استخدم docker interface:

snap connect docker:docker-daemon

أو أزل إصدار Snap وثبّت Docker بشكل رسمي:

snap remove docker

# اتبع التثبيت الرسمي لـ Docker لتوزيعتك
# مثلاً، لـ Ubuntu:
sudo apt-get install docker.io

# ثم أضف مستخدمك إلى مجموعة docker
sudo usermod -aG docker $USER
newgrp docker

5. WSL2 (Windows Subsystem for Linux) تعقيدات

على Windows مع WSL2، Docker Desktop for Windows يستخدم تكاملاً خاصًا. تحقق من Docker الذي يعمل:

docker version
# إذا اتصل بـ Docker Desktop، السياق قد يكون "desktop-linux"

تحقق من أن Docker يعمل:

docker ps
# إذا فشل الاتصال، Docker Desktop ليس قيد التشغيل على Windows

شغّل Docker Desktop (على Windows):
1. افتح Docker Desktop من قائمة ابدأ
2. انتظر حتى يتهيأ (عادة 30 ثانية)
3. عد إلى محطة WSL2

ثم تحقق:

docker ps

إذا كنت تريد استخدام Docker داخل WSL2 (وليس Docker Desktop for Windows):

# ثبّت Docker مباشرة في WSL2
sudo apt-get install docker.io

# أضف مستخدمك إلى مجموعة docker
sudo usermod -aG docker $USER
newgrp docker

# شغّل Docker daemon
sudo systemctl start docker

6. ملف Socket تم حذفه أو إعادة إنشاؤه

إذا تم حذف socket (مثلاً، /var/run تم تنظيفها على بعض الأنظمة)، أعد تشغيل Docker:

sudo systemctl restart docker
ls -la /var/run/docker.sock    # يجب أن يظهر مجددًا مع الصلاحيات الصحيحة

تأكد من أن socket يستمر عبر الإعادة. تحقق من وحدة Docker systemd:

systemctl status docker
# يجب أن يظهر أنه مفعّل وقيد التشغيل

فعّل Docker للبدء عند الإقلاع:

sudo systemctl enable docker

كيف تتجنبه

  1. أضف مستخدمين إلى مجموعة docker أثناء الإعداد:

    sudo usermod -aG docker myuser
    

  2. اجعل صلاحيات socket دائمة. عادة يتم استعادتها عند إعادة تشغيل Docker، لكن يمكنك أيضًا تكوينها في ملف Docker daemon:

    sudo mkdir -p /etc/docker
    cat <<'EOF' | sudo tee /etc/docker/daemon.json
    {
      "group": "docker"
    }
    EOF
    sudo systemctl restart docker
    

  3. افهم المخاطر الأمنية. أي شخص في مجموعة docker لديه وصول معادل للـ root. أضف فقط المستخدمين الموثوقين.

  4. استخدم Docker بدون جذر للعزل الإضافي إذا كنت تريد إعطاء المستخدمين وصول Docker بدون صلاحيات معادلة للـ root:

    dockerd-rootless-setuptool.sh install
    

  5. تحقق من ملكية socket بعد تحديثات النظام:

    ls -la /var/run/docker.sock
    

ملاحظة أمنية: مجموعة Docker = Root

إضافة مستخدم إلى مجموعة docker تعطيه بفعالية وصول root. إليك السبب:

# أي عضو في مجموعة docker يستطيع تشغيل الحاويات كـ root
docker run -it --rm -v /:/mnt ubuntu bash
# داخل الحاوية، /mnt تشير إلى نظام الملفات المضيف
# وأنت تعمل كـ root داخل الحاوية
# إذًا يمكنك تعديل أي شيء على المضيف

# أو اربط نظام ملفات root من المضيف
docker run -it --rm -v /proc:/host/proc ubuntu bash
# الوصول إلى عمليات المضيف وحالة kernel

# أو اهرب إلى المضيف عبر volumes
docker run -it --rm -v /root/.ssh:/tmp ubuntu bash
# الوصول إلى ملفات حساسة

أفضل الممارسات:
1. أضف فقط المستخدمين الذين تثق فيهم بالكامل إلى مجموعة docker.
2. استخدم Docker بدون جذر إذا كنت تريد تقييد الوصول.
3. استخدم SELinux أو ملفات AppArmor للحد من قدرات الحاوية.
4. في الأنظمة متعددة المستخدمين، فضّل الوصول المركزي إلى Docker (مثلاً، عبر نظام CI/CD يدير الأذونات).

الأسئلة الشائعة

كيف أصلح خطأ ‘permission denied while trying to connect to the Docker daemon socket’؟

أضف مستخدمك إلى مجموعة docker: sudo usermod -aG docker $USER، ثم اخرج وسجل الدخول مجددًا أو شغّل newgrp docker. تحذير: هذا يعطي المستخدم صلاحيات معادلة للـ root.

ماذا يعني ‘docker group = root’؟

أي شخص في مجموعة docker يستطيع تشغيل الحاويات بصلاحيات root. إنها معادلة لوصول sudo. أضف فقط المستخدمين الموثوقين إلى مجموعة docker.

لماذا يتطلب Docker وصول root؟

حاويات Docker تستخدم Linux namespaces و cgroups، التي تتطلب root. يوجد وضع Docker بدون جذر (daemon بدون root) لكنه ليس الافتراضي.

كيف أتحقق من أن مستخدمي في مجموعة docker؟

شغّل groups $USER أو id -G. إذا رأيت ‘docker’ في القائمة، فأنت في المجموعة. تحقق مع docker ps (يجب أن لا يطلب sudo).

كيف تم التحقق من هذا الدليل

كُتب يدويًا من الوثائق الرسمية، وأُعيد فحص كل أمر، ثم رُوجع مرة ثانية قبل النشر. آخر مراجعة في .

المصادر الرسمية التي قُرئت لهذا المقال

شاركها.

التعليقات مغلقة.