كيفية إعداد نظام Docker ونظام Windows الفرعي لنظام Linux: قصة حب.

هل تشعر أحيانًا أنك أميرة جميلة تحولها ساحر شرير إلى ضفدع؟ مثلك لا تنتمي؟ أنا افعل. أنا شاب من يونيكس خائف من مغادرة سطر الأوامر المريح. بلدي المحطة هي قلعتي. ولكن هناك أوقات أجبرت فيها على استخدام Microsoft Windows وتعلمت بعض الحيل حول كيفية التعامل مع ذلك.

لتلبية احتياجاتي اليومية ، قمت بتثبيت نظام Windows الفرعي لنظام Linux مع توزيع Ubuntu. علاوة على ذلك ، لدي تثبيت Linuxbrew يساعدني في إدارة أي تطبيقات خارجية قد أحتاج إليها. هذا المزيج يعمل بشكل جيد بشكل مدهش! لديّ رابط رمزي أنيق للوصول إلى جميع بياناتي "الخارجية" (أي التي يستضيفها نظام Windows): ln -s ~ / external / mnt / c / Users / DoomHammer ويتم الوفاء بمعظم الاحتياجات بهذه الطريقة. هذا هو ، إلا إذا كنت بحاجة إلى استخدام عامل الميناء.

ما هو خاص جدا حول عامل الميناء؟

على عكس معظم التطبيقات التي أستخدمها عادةً كل يوم ، فإن Docker هو تطبيق نظام. هذا يعني أنه متجذر بعمق في النظام ويتطلب البرنامج الخفي الفعلي لتشغيله على الجهاز المضيف. وعن طريق الجهاز المضيف ، أعني Microsoft Windows الأصلي في هذه الحالة.

هل يعني ذلك أنه لا يمكنك استخدام Docker من داخل WSL؟ ليس بالضرورة. ولكن عليك أن تستعرض عضلاتك أكثر قليلاً للوصول إلى هناك. بادئ ذي بدء ، تحتاج إلى تثبيت Docker لنظام التشغيل Windows. هناك Docker Enterprise Editions لنظام التشغيل Windows Server 2016 (وما فوق) وهناك إصدار مجتمع لـ Windows 10 Professional أو Enterprise. وقد علقت في Windows 10 Home Edition.

الحصول على عامل الميناء على ويندوز 10 الرئيسية

يبدو أن جعل Docker يعمل على Windows 10 Home Edition أكثر صعوبة بعض الشيء. يتطلب Docker Community Edition دعم Hyper-V والذي لا يتوفر في الإصدار Home Edition. هذا يعني أنني بحاجة إلى اكتشاف Docker Toolbox ، وهو توزيع قديم يعتمد على Docker Machine و Virtualbox. ولكن بعد التثبيت ، استقبلني Virtualbox بمطالبة أنه من المستحيل تشغيل المحاكاة الافتراضية.

كما اتضح فيما بعد ، كان إعداد الإعداد الافتراضي في BIOS. على ما يبدو لأسباب أمنية. قمت بتشغيله ، وفتحت Virtualbox مرة أخرى و ... نفس الشيء. هذا جعلني قلقا قليلا. بعد قليل من الزحف على الويب ، وجدت النصيحة للتحقق من systeminfo. حسنًا ، لقد أظهرت بوضوح أن بعض برامج Hypervisor تعمل. ولكن ليس Virtualbox وبالتأكيد ليس Hyper-V ، أليس كذلك؟

لدهشتي ، كان Hyper-V طوال الوقت. يبدو أن الإصدار المنزلي يفتقر إلى أدوات برنامج المستخدم لاستخدام Hyper-V بالفعل ، لكن هذا لا يعني أن Hypervisor نفسها لم تكن تعمل. لحسن الحظ ، كان إيقاف تشغيله مجرد إيقاف تشغيل bcdedit / set hypervisorlaunchtype. بعد أن أعيد تشغيل الجهاز ، كان Virtualbox حريصًا على العمل. بارد ، يسجل بالنسبة لي!

عامل الميناء و WSL ، أفضل أصدقاء للأبد؟

وجود Virtualbox العمل فتحت Docker Quickstart Terminal. على المدى الأول ، تقوم بإنشاء آلة Docker (لهذا السبب تحتاج إلى Virtualbox) لتعمل كمضيف لجميع الحاويات. قمت بكتابة تشغيل docker - rm hello-world وشاهدت شريط التقدم بينما قام Docker بتنزيل الصورة المناسبة لي. نتيجة أخرى!

الآن ، بدلاً من cmd.exe أرغب في استخدام Docker من راحة WSL الخاصة بي. كيف يمكنني فعل ذلك؟ لحسن الحظ ، WSL لديه حق الوصول إلى ثنائيات Windows الأصلية. هذا يعني أنه يمكنني تشغيل docker-machine.exe ls لرؤية الجهاز الذي تم إنشاؤه بواسطة Docker Toolbox. يجب أن يكون هناك حق اسمه ببساطة الافتراضي. إذا كانت الحالة أي شيء آخر غير "Running" ، فيمكنك تشغيله مع بدء docker-machine.exe. في كل مرة تريد فيها تشغيل Docher Machine ، تذكر أنه على عكس cmd.exe ، فإن الملحق (.exe) إلزامي.

عادة ما نسميه docker-machine.exe env لتعيين متغيرات البيئة.

لسوء الحظ ، يقوم بإخراج المتغيرات بتنسيق يفهمه cmd.exe ، وليس بواسطة أي غلاف متوافق مع Bourne مثل bash أو zsh. ولكن يمكننا تغيير هذا السلوك مع docker-machine.exe env --shell sh.

هم ، هناك تقريبا. ولكن هناك شيء واحد معلق. تتم كتابة مسار الشهادة كمسار Windows. كيف تترجم إلى شيء يفهمه WSL؟ لبعض الوقت الآن ، تتميز WSL بأداة مساعدة لطيفة تسمى wslpath. بفضل هذه الأداة ، يمكننا الاتصال بتصدير DOCKER_CERT_PATH = $ (wslpath $ DOCKER_CERT_PATH) ونحن جاهزون تقريبًا.

ما زلنا بحاجة إلى أدوات userland. لذلك ، باستخدام مدير الحزم المفضل لديك ، قم بتثبيت كل من Docker Engine و Docker Compose. هذا يعني بالنسبة لي المشروب تثبيت عامل ميناء عامل الميناء. بعد ذلك ، يجب أن يحقق rm hello-world نفس النتائج تمامًا مثلما حدث في محطة Docker Toolbox. تهانينا!

هل هذا كل شيء؟

لا بالطبع لأ. قد تلاحظ بسرعة أن bind-mount لا يعمل بشكل صحيح. ذلك لأن برنامج Docker الخفي يتوقع مسارات Windows المناسبة ، ولا يمكن ترجمة مسارات WSL للأسف تلقائيًا. ولكن هناك بعض الاختراقات التي يمكننا استخدامها لتحسين الوضع.

الآن ، ما الاختراق الذي تحتاجه يعتمد على الإصدار الذي تقوم بتشغيله. عند ضرب Win + R وكتابة winver ، سترى مربع حوار يوضح شيئًا ما حول الخطوط:

مايكروسوفت ويندوز
الإصدار 18.03 (OS Build 17133.73)

إذا كان الإصدار 18.03 أو أحدث ، فيمكنك تعديل /etc/wsl.conf لتبدو هكذا:

[automount]
الجذر = /
خيارات = "بيانات التعريف"

هذا يعني أن WSL ستقوم بتركيب محرك الأقراص C: تحت / c / بدلاً من المعتاد / mnt / c. لماذا هذا مهم؟ حسنًا ، هذا أمر مهم لأن هذا هو ما يتوقعه برنامج Docker daemon من مسارات Windows. بالمناسبة: بعد حفظ الملف ، ستحتاج إلى إعادة تسجيل الدخول لتصبح التغييرات نافذة المفعول.

تحذير! إذا صادفت استخدام wsl-terminal ، فسيؤدي هذا التغيير إلى كسره. استخدم الطريقة التالية في مثل هذه الحالة.

هناك طريقة أخرى إذا كنت لا ترغب في إعادة تسجيل الدخول أو إذا كنت عالقًا مع إصدار أقدم وهو ربط نقطة تحميل واحدة إلى أخرى مثل هذا:

سودو مقددير / ج
سودو جبل - ربط / كزاز الرضع / ج / ج

أسرع ولكنه متوفر فقط طالما قمت بتسجيل الدخول. يجب عليك تكرار ذلك في المرة التالية التي تقوم فيها بإعادة تشغيل جهازك أو إضافته إلى تهيئة وقت تشغيل shell (مثل ~ / .bashrc أو ~ / .zshrc). هذا لأن / etc / fstab لا يعمل كما هو متوقع في WSL.

كما قد تلاحظ ، هذا يعني أنك الآن قادر على تشغيل Docker مع تصاعد ، ولكن فقط إذا كانت وحدات التخزين الخاصة بك داخل نظام ملفات Windows. نظرًا لأن عامل تشغيل سطر الأوامر يتوقع مسارات مطلقة ، فلن يكون هذا أمرًا كبيرًا ، ولكن مع Docker Compose ، عليك أن تكون حذراً للغاية. يسمح باستخدام المسارات النسبية وبهذه الطريقة كل شيء يبدأ بـ. / لن ينجح.

إذا كنت تصر تمامًا على تثبيت نظام ملفات WSL مع Docker ، فيمكنك محاولة استبدال كل هؤلاء ./ مع / c / Users / $ USERNAME / AppData / Local / lxss مع PWD للمشروع. في هذه الحالة ، لا يعني US $ USERNAME اسم المستخدم الخاص بك في WSL ، ولكن أنت Windows واحد.

اعتقدت أنه سيكون من الذكاء أن تكتب غلافًا حول Docker Compose لجعله يغير دليل العمل إلى ملف lxss ولكن لسوء الحظ ، لا يحق لـ WSL الوصول إليه. وعلى حق ، أعتقد!

واحد آخر الجدار

يمكننا تشغيل Docker ويمكننا ربط أدلة الدلائل. ماذا يمكن أن نريد؟ ربما العمل ميناء الشحن؟ بخلاف الحلول الأصلية ، يتطلب استخدام Docker عبر Docker Machine استدعاء كل خدمة على $ (docker-machine ip): PORT $ بدلاً من المضيف المحلي المعتاد: PORT. هناك طريقة للتغلب عليها ، وإن لم تكن طريقة أنيقة للغاية:

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

آمل أن يجعل هذا عملك مع Docker على WSL أكثر متعة. بالتأكيد فعلت هذا بالنسبة لي!

قائمة المراجع

لم أكن لأكتب هذا المقال لو لم يكن للأفراد الذين تبادلوا معارفهم. في كل مرة تعثرت فيها على بعض العقبات يمكنني البحث عن الحلول الحالية. أدناه ، قائمة بالمقالات والمشاركات التي ساعدتني في كتابة هذا الدليل: