كيفية استكشاف أخطاء "تعذر الاتصال بـ Docker Daemon" وإصلاحها

نشرت: 2022-08-14

رسم يظهر شعار Docker

Docker هي إحدى المنصات الرائدة لبناء وتشغيل حاويات البرامج. يأتي مع كل ما تحتاجه لاستخدام الحاويات على مضيف واحد أو عدة عقد موزعة في وضع Swarm.

Docker لديه بنية قائمة على الخفي. البرنامج المسؤول عن إنشاء الحاويات وبدء تشغيلها مستقل عن عملية CLI التي تقبل أوامرك. هذا يعني أنك سترى أخطاء في CLI إذا حاولت تشغيل أوامر بدون اتصال خفي نشط. في هذه المقالة ، سنشارك بعض الطرق لاستكشاف هذه الرسائل المحبطة وإصلاحها.

أعراض المشكلة

يعتمد Docker CLI على توفر اتصال خفي. يتفاعل مع البرنامج الخفي باستخدام استدعاءات API. عندما يتعذر الوصول إلى البرنامج الخفي الذي تم تكوينه ، ستعرض أوامر docker الإرساء مثل docker ps و docker run و docker build رسالة خطأ مشابهة لهذه الرسالة:

 $ docker run hello-world: الأحدث
لا يمكن الاتصال بـ Docker daemon على unix: ///var/run/docker.sock
هل برنامج Docker daemon يعمل؟

يكشف هذا أن CLI حاول التواصل مع Docker daemon باستخدام /var/run/docker.sock مقبس Unix. المقبس غير مفتوح لذا فشل الاتصال.

1. تحقق من تشغيل خدمة Docker Daemon

تتم إدارة Docker daemon عادةً بواسطة خدمة systemd تبدأ تشغيل Docker تلقائيًا بعد إعادة تشغيل مضيفك. يمكنك البدء في استكشاف الأخطاء وإصلاحها عن طريق التحقق مما إذا كانت هذه الخدمة قيد التشغيل أم لا:

 sudo systemctl status docker
docker.service - محرك حاوية تطبيق Docker
     مُحمَّل: مُحمَّل (/lib/systemd/system/docker.service ؛ مُمكّن ؛ الإعداد المسبق للمورد: ممكّن)
     نشط: غير نشط (ميت)

يجب أن تبلغ الخدمة عن Active: active (running) إذا كان البرنامج الخفي قيد التشغيل. يوضح المثال أعلاه inactive (dead) مما يعني أن البرنامج الخفي قد توقف.

ابدأ تشغيل Docker باستخدام الأمر التالي:

 sudo systemctl بدء عامل الإرساء

الآن يجب أن تكون قادرًا على تشغيل أوامر docker CLI بنجاح.

قد تجد أن Docker يبقى في حالة الإيقاف بعد إعادة تشغيل جهازك. يمكنك حل هذه المشكلة عن طريق تمكين الخدمة والسماح لـ systemd ببدء تشغيلها تلقائيًا:

 sudo systemctl يقوم بتمكين عامل الإرساء
sudo systemctl الخفي-إعادة التحميل

يوجه الأمر daemon-reload systemd لإعادة تحميل التكوين الخاص به لتطبيق التغيير.

2. ابدأ برنامج Daemon يدويًا

قد تستخدم أحيانًا نظامًا لم يتم تثبيت خدمة Docker عليه. يمكنك بدء تشغيل Docker daemon يدويًا باستخدام أمر dockerd . هذا عادة ما يحتاج إلى تشغيله root .

 $ sudo dockerd
INFO [2022-06-29T15: 12: 49.303428726 + 01: 00] بدء التشغيل

سيظل Docker متاحًا طوال فترة تشغيل الأمر. استخدم Ctrl + C لإيقاف البرنامج الخفي.

3. التحقق من CLI يستهدف البرنامج الخفي الصحيح

يمكن أن تحدث المشكلات عندما يحاول CLI الاتصال بمثيل Docker daemon البعيد. عادة ما يكون هذا هو السبب عندما تظهر رسالة الخطأ عنوان TCP:

 $ docker run hello-world: الأحدث
لا يمكن الاتصال بـ Docker daemon على tcp: ///0.0.0.0: 2375

في هذا المثال ، يحاول docker CLI الاتصال بـ Docker daemon على 0.0.0.0:2375 باستخدام TCP ، بدلاً من مقبس Unix Docker المحلي. سيفشل هذا إذا تم تعطيل دعم TCP لبرنامج Docker daemon أو كان المضيف المحدد لا يمكن الوصول إليه على الشبكة.

يمكنك عادةً حل هذه المشكلة بالتبديل إلى سياق Docker CLI الصحيح للاتصال الخفي الذي تريد استخدامه:

 يستخدم سياق docker $ الافتراضي

يمكنك سرد جميع السياقات المتاحة ونقاط النهاية الخفية التي تتصل بها بأمر context ls :

 سياق عامل الإرساء ls
الاسم الوصف DOCKER ENDPOINT             
افتراضي * التكوين الحالي المستند إلى DOCKER_HOST يونيكس: ///var/run/docker.sock

يتم تمييز السياق المحدد حاليًا بعلامة النجمة.

عادةً ما تكون القيم غير المتوقعة في عمود DOCKER ENDPOINT ناتجة عن متغير البيئة DOCKER_HOST الذي يتم تعيينه. سترى تحذيرًا عندما يكون هذا هو الحال:

 تصدير $ DOCKER_HOST = 1.2.3.4
سياق عامل الإرساء ls
الاسم الوصف DOCKER ENDPOINT
افتراضي * التكوين الحالي القائم على DOCKER_HOST tcp: //1.2.3.4: 2375
تحذير: يتجاوز متغير البيئة DOCKER_HOST السياق النشط. لاستخدام سياق ، قم بتعيين علامة النص العامة العامة ، أو قم بإلغاء تعيين متغير البيئة DOCKER_HOST.

يؤدي وجود متغير البيئة DOCKER_HOST في قشرتك إلى تجاوز نقطة النهاية المحددة بواسطة السياق المحدد. في هذا المثال ، ستستهدف أوامر docker دائمًا مثيل البرنامج الخفي في tcp://1.2.3.4:2375 .

يمكن حل هذه المشكلة عن طريق مسح متغير DOCKER_HOST :

 تصدير $ DOCKER_HOST =

سيستخدم Docker الآن نقطة النهاية التي تم تكوينها بواسطة السياق النشط الخاص بك. سيكون هذا هو مقبس Unix المحلي الافتراضي في /var/run/docker.sock إلا إذا قمت بإعداد سياق مخصص يدويًا.

 سياق عامل الإرساء ls
الاسم الوصف DOCKER ENDPOINT             
افتراضي * التكوين الحالي المستند إلى DOCKER_HOST يونيكس: ///var/run/docker.sock

4. قضايا الأذونات

أذونات المستخدم غير الصحيحة على مقبس Docker هي سبب شائع آخر لمشكلات الاتصال الخفي. عادةً ما يظهر هذا النوع من المشكلات رسالة خطأ مختلفة قليلاً:

 $ docker run hello-world: الأحدث
تم رفض الإذن أثناء محاولة الاتصال بمقبس Docker daemon على unix: ///var/run/docker.sock

يحدث هذا عندما يفتقر حساب مستخدم Unix الخاص بك إلى إذن للتفاعل مع المقبس الذي يعرض Docker API. تعد إضافة نفسك إلى مجموعة docker أفضل طريقة لحل هذه المشكلة:

 $ sudo usermod -aG docker $ USER

ستحتاج إلى فتح نافذة shell جديدة أو تسجيل الخروج والعودة مرة أخرى حتى يسري هذا التغيير. يجب أن تكون الآن قادرًا على تشغيل أوامر docker دون التعرض لمشاكل الأذونات.

ملخص

يظهر "يتعذر الاتصال بـ Docker daemon" عندما يتعذر على Docker CLI الاتصال بمثيل Docker الخفي باستخدام التكوين الحالي. هذا غالبًا بسبب إيقاف خدمة Docker daemon أو تعطيلها. قد تحاول أيضًا الاتصال بمضيف Docker بعيد أصبح غير متصل بالإنترنت.

يجب أن تكون الآن على دراية بالأسباب المحتملة لهذه المشكلة والطرق الشائعة لحلها. قم باستكشاف الأخطاء وإصلاحها عن طريق التحقق من إعدادات Docker daemon الخاصة بك ، وإعادة تشغيل خدمة Docker ، والتأكد من أن حساب المستخدم الخاص بك لديه إذن للتفاعل مع مقبس Docker.