كيفية استكشاف أخطاء "تعذر الاتصال بـ Docker Daemon" وإصلاحها
نشرت: 2022-08-14Docker هي إحدى المنصات الرائدة لبناء وتشغيل حاويات البرامج. يأتي مع كل ما تحتاجه لاستخدام الحاويات على مضيف واحد أو عدة عقد موزعة في وضع 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.