تفعيل Kubernetes في Docker Desktop أشبه بإضافة ملحق إلى شقة تسكنها بالفعل: الأسس (الآلة الافتراضية Linux، ومحرّك Docker، والشبكة نحو localhost) موضوعة سلفاً، ولا يبقى سوى تحديد خانة اختيار وترك التطبيق يُحمّل عشر صور تقريباً، ويُنشئ control plane، ويكتب سطراً في ملفك ~/.kube/config. بعد خمس دقائق، يُجيب kubectl get nodes بـdocker-desktop Ready. في هذا الدرس، تُنجز التثبيت خطوة بخطوة حسب نظامك، وتتحقق من كل خطوة بأمر تعرف مخرجاته المتوقعة، وتخرج بقائمة الأعطال الخمسة التي تُعيق تسعة من كل عشرة طلاب في اليوم الأول، مع الرسالة الدقيقة وعلاجها.
يُشغّل Docker Desktop آلة افتراضية خفيفة تعمل بنظام Linux: على Windows هي توزيعة WSL 2 باسم docker-desktop، وعلى macOS آلة افتراضية Apple Virtualization، وعلى Linux آلة افتراضية QEMU. يعيش محرّك Docker داخلها، وكذلك Kubernetes: عندما تُفعّله، يُحمّل Docker Desktop صور control plane من Docker Hub (docker/desktop-kubernetes، desktop-kubernetes-etcd، desktop-kubernetes-apiserver…)، ويُشغّلها كحاويات ذات صلاحيات موسّعة داخل هذه الآلة الافتراضية، ويُولّد الشهادات، ثم يضيف إلى ~/.kube/config الخاص بك سياقاً (context) باسم docker-desktop يُشير إلى https://kubernetes.docker.internal:6443. كما يُثبّت kubectl (في C:\Program Files\Docker\Docker\resources\bin على Windows، و/usr/local/bin/kubectl على macOS): لا شيء آخر عليك تحميله.
توجد طريقتان لتزويد الكتلة (provisioning) منذ Docker Desktop 4.38. تُنشئ Kubeadm عقدة واحدة فقط، بإصدار Kubernetes الذي يحدّده Docker Desktop (v1.34.1 في النسخة 4.68)؛ وهو الوضع الافتراضي وهو المستخدم في هذه الدورة. أما kind (Kubernetes in Docker) فتُنشئ عدة عقد، كل واحدة عبارة عن حاوية، وتترك لك اختيار الإصدار؛ ويبدأ بشكل أسرع لكنه لا يشارك مخزن صور Docker الكلاسيكي (يجب استخدام وضع «containerd image store»). طالما أنك تتعلّم، تكفي عقدة واحدة: كل ما تفعله الدورة يعمل على docker-desktop.
| النظام | ما تُثبّته | أين تُضبط الذاكرة | Kubernetes مدمج؟ |
|---|---|---|---|
| Windows 10 (21H2+) / 11 | Docker Desktop، محرّك WSL 2 | ملف %UserProfile%\.wslconfig، ثم wsl --shutdown | نعم |
| macOS 13+ (Intel أو Apple Silicon) | Docker Desktop (ملف .dmg حسب معالجك) | Settings → Resources → Memory، ثم «Apply & restart» | نعم |
| Linux (Ubuntu، Debian، Fedora…) | Docker Desktop لنظام Linux (.deb / .rpm) أو Docker Engine وحده | Settings → Resources (Desktop)؛ كل الذاكرة العشوائية (Engine) | نعم مع Docker Desktop؛ لا مع Docker Engine وحده (استخدم عندئذ minikube أو kind) |
| إعداد Kubernetes (Settings → Kubernetes) | ما يفعله | اختيارنا |
|---|---|---|
| Enable Kubernetes | يُثبّت ويُشغّل الكتلة؛ إلغاء تحديده يوقف ويحذف حاويات الكتلة ويزيل kubectl | مُفعّل |
| Cluster provisioning method | Kubeadm (عقدة واحدة، إصدار مفروض) أو kind (عدة عقد، إصدار حسب الاختيار) | Kubeadm |
| Show system containers (advanced) | يُظهر حاويات k8s_… الخاصة بالكتلة في docker ps | مُفعّل (مفيد للفهم، الدرس 01 الخطوة 7) |
| Reset Kubernetes cluster | يحذف كل الكتلة (namespaces، Deployments، الأحجام) ويُعيد إنشاءها فارغة؛ الطريقة الوحيدة لتغيير إصدار Kubernetes | فقط عند استكشاف الأعطال |
يُخزَّن الإعداد في ملف JSON: على Windows في %APPDATA%\Docker\settings-store.json، بمفتاح KubernetesEnabled (true/false) وKubernetesMode (kubeadm/kind). معرفة ذلك مفيد يوم ترفض الواجهة الرسومية الفتح.
Windows: تثبيت WSL 2، ثم Docker Desktop. افتح PowerShell كمسؤول (administrateur) وثبّت WSL إذا لم يكن موجوداً بعد (لا يفعل الأمر شيئاً إذا كان WSL موجوداً بالفعل):
wsl --install
wsl --statusأعد التشغيل إذا طُلب منك ذلك. ثم حمّل «Docker Desktop for Windows» من docs.docker.com/desktop، شغّل المُثبِّت، اترك خيار Use WSL 2 instead of Hyper-V محدَّداً، ثم شغّل Docker Desktop وانتظر توقّف أيقونة الحوت في شريط المهام عن الوميض. ما يجب ملاحظته:
wsl --list --verbose NAME STATE VERSION
* docker-desktop Running 2
…التوزيعة docker-desktop هي الآلة الافتراضية التي سيعمل بداخلها Docker وKubernetes. إذا أظهر VERSION القيمة 1، حوّلها: wsl --set-version docker-desktop 2.
Windows: منح ذاكرة لـ WSL 2. يأخذ WSL افتراضياً نصف ذاكرتك العشوائية؛ غالباً ما يكفي هذا، لكن كي لا تعتمد على الصدفة، ثبّت القيمة. أنشئ الملف %UserProfile%\.wslconfig:
notepad $env:UserProfile\.wslconfigالصق، احفظ، ثم أعد تشغيل الآلة الافتراضية WSL (يُعيد Docker Desktop نفسه التشغيل تلقائياً خلف الكواليس):
[wsl2]
memory=8GB
processors=4wsl --shutdownما يجب ملاحظته، بمجرد عودة Docker Desktop: يُعيد docker info --format '{{.MemTotal}}' رقماً قريباً من 8 000 000 000 (على آلة الدورة، بدون حدّ، يُعيد 33480151040، أي 31 جيجابايت). تعمل الدورة ابتداءً من 4 جيجابايت؛ و8 جيجابايت تمنحك راحة حتى الوحدة 8.
macOS: التثبيت وضبط الذاكرة. حمّل ملف .dmg المطابق لمعالجك (Apple Silicon أو Intel)، اسحب Docker إلى Applications، شغّله. ثم Settings (أيقونة الترس) → Resources → Advanced: ارفع Memory إلى 8 جيجابايت (4 جيجابايت كحد أدنى) وCPUs إلى 4، ثم Apply & restart. ما يجب ملاحظته: يعكس docker info --format '{{.MemTotal}}' قيمتك. سيُثبَّت kubectl في /usr/local/bin/kubectl عند تفعيل Kubernetes؛ إذا كان لديك واحد عبر Homebrew وتنازعا، احذف واحداً من Docker أو من Homebrew، وليس كليهما (الدرس 03).
Linux: Docker Desktop، أو لا. مساران. يمنحك Docker Desktop لنظام Linux (حزمة .deb أو .rpm من docs.docker.com/desktop/setup/install/linux) نفس Kubernetes المدمج تماماً كما على Windows وmacOS؛ ويتطلّب KVM (يجب أن يُدرج lsmod | grep kvm الوحدة) وجلسة رسومية. أما Docker Engine وحده (docker-ce عبر apt/dnf) فلا يتضمّن Kubernetes: إذا كنت على خادم أو تفضّل Engine، ثبّت kind أو minikube؛ ستبقى كل أوامر kubectl في الدورة متطابقة، فقط طريقة الوصول إلى الـ Services ستتغيّر (الدرس 04). على Docker Desktop لنظام Linux، لا يُرفَق kubectl: ثبّته من kubernetes.io/docs/tasks/tools في /usr/local/bin/kubectl.
تفعيل Kubernetes. افتح Docker Desktop → Settings → Kubernetes → حدّد Enable Kubernetes. اترك Cluster provisioning method على Kubeadm (عقدة واحدة)، حدّد Show system containers (advanced)، ثم Apply & restart. في الإصدارات 4.51 وما بعدها، يمكنك أيضاً المرور عبر واجهة Kubernetes من لوحة التحكم (أيقونة في الشريط الجانبي) → Create cluster → نفس الاختيار Kubeadm / kind → Create. عندئذ يُحمّل Docker Desktop صور control plane؛ يمكنك سردها أثناء عمله:
docker desktop kubernetes images listالمخرجات الحقيقية (Docker Desktop 4.68.0):
Mode Repo Name Tag
kind docker desktop-containerd-registry-mirror v0.0.3
kind docker desktop-cloud-provider-kind v0.5.0
kind envoyproxy envoy v1.36.4
kind kindest node
kubeadm docker desktop-kubernetes kubernetes-v1.34.1-cni-v1.7.1-critools-v1.33.0-cri-dockerd-v0.3.20-1-debian
kubeadm docker desktop-storage-provisioner v3.0
kubeadm docker desktop-vpnkit-controller v4.0
kubeadm docker desktop-kubernetes-etcd 3.6.4-0
kubeadm docker desktop-kubernetes-coredns v1.12.1
kubeadm docker desktop-kubernetes-pause 3.10
kubeadm docker desktop-kubernetes-apiserver v1.34.1
kubeadm docker desktop-kubernetes-controller-manager v1.34.1
kubeadm docker desktop-kubernetes-scheduler v1.34.1
kubeadm docker desktop-kubernetes-proxy v1.34.1ما يجب ملاحظته: عشر صور لوضع kubeadm، جميعها موسومة بـv1.34.1 بالنسبة لمكوّنات control plane. تتعرّف على etcd وapiserver وcontroller-manager وscheduler وproxy وcoredns من الدرس 01. يستغرق التحميل من دقيقتين إلى خمس عشرة دقيقة؛ وتتحوّل أيقونة Kubernetes أسفل يسار النافذة من برتقالية (starting) إلى خضراء.
انتبه جيداً لما سيحدث: استجواب Docker Desktop نفسه. يتحدّث الأمر docker desktop (أوامر فرعية kubernetes متاحة منذ الإصدار 4.44) إلى التطبيق، وليس إلى العفريت (daemon). إنه التحقق الأكثر موثوقية، حتى قبل kubectl.
docker desktop status
docker desktop kubernetes statusالمخرجات الحقيقية:
Name Value
Status running
SessionID 5bc01282-499f-4434-b135-f8ecf0a79886
Field Value
ID: 1758e244
State: running
Mode: kubeadm
Node Count: 1
Version: v1.34.1
Started At: 2026-09-10 21:27:23.469 -0400 EDT
Progress Message: Kubernetes is up and running
Error: Noneما يجب ملاحظته: Status running بالنسبة للتطبيق، ثم State: running، وMode: kubeadm، وNode Count: 1، وVersion: v1.34.1، وProgress Message: Kubernetes is up and running، وError: None. أثناء بدء التشغيل، تكون قيمة State هي starting ويصف Progress Message الخطوة الجارية (Pulling images…، Starting control plane…). إذا كان إصدار Docker Desktop لديك أقدم من 4.44، فإن الأمر غير موجود: انتقل مباشرة إلى الخطوة التالية.
التحقق من العقدة باستخدام kubectl. أغلق طرفيتك وأعد فتحها (تغيّر PATH)، ثم:
kubectl get nodes -o wideالمخرجات الحقيقية:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
docker-desktop Ready control-plane 18d v1.34.1 192.168.65.3 <none> Docker Desktop 6.6.87.2-microsoft-standard-WSL2 docker://29.3.1ما يجب ملاحظته: Ready، وv1.34.1، وعنوان IP الداخلي 192.168.65.3 (عنوان الآلة الافتراضية، وليس عنوان جهازك)، ونواة WSL 2 (على macOS ستقرأ نواة linuxkit)، وruntime docker://29.3.1: يُشغّل Kubernetes حاوياته بنفس Docker الذي لديك. عندك سيُحسَب AGE بالثواني أو الدقائق.
اطّلع على السياق الذي كتبه Docker Desktop. كل ما يعرفه kubectl عن كتلتك موجود في ~/.kube/config (C:\Users\<أنت>\.kube\config على Windows).
kubectl config get-contexts
kubectl config view --minifyالمخرجات الحقيقية (تحتفظ آلة الدورة بسياق قديم باسم minikube، مطفأ؛ عندك لن يكون هناك سوى docker-desktop):
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* docker-desktop docker-desktop docker-desktop
minikube minikube minikube default
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://kubernetes.docker.internal:6443
name: docker-desktop
contexts:
- context:
cluster: docker-desktop
user: docker-desktop
name: docker-desktop
current-context: docker-desktop
kind: Config
users:
- name: docker-desktop
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTEDما يجب ملاحظته: النجمة على docker-desktop، والخادم https://kubernetes.docker.internal:6443، ومصادقة بشهادة عميل (client-certificate-data) وُلّدت عند التفعيل. يعود الدرس 03 إلى موضوع السياقات.
Windows: قراءة الإعداد من ملفه. مفيد يوم ترفض الواجهة الرسومية الفتح، أو للتحقق مما فعله زميل.
(Get-Content "$env:APPDATA\Docker\settings-store.json" -Raw | ConvertFrom-Json) | Select-Object KubernetesEnabled, KubernetesMode, ShowKubernetesSystemContainers | Format-Listالمخرجات الحقيقية:
KubernetesEnabled : True
KubernetesMode : kubeadm
ShowKubernetesSystemContainers : Trueما يجب ملاحظته: القيم الثلاث المُحدَّدة في الخطوة 5. لا تُعدّل هذا الملف يدوياً بينما يعمل Docker Desktop؛ مرّ عبر الواجهة. لا شيء لتنظيفه في هذا الدرس: لم تُنشئ شيئاً في الكتلة.
docker desktop kubernetes status القيمة State: starting منذ أكثر من خمس عشرة دقيقة ← لا تُحمَّل صور الخطوة 5. ثلاثة أسباب بالترتيب: لا وصول إلى Docker Hub (شبكة شركة بوكيل proxy: Settings → Resources → Proxies، أو اسأل مسؤول شبكتك عن إعداد KubernetesImagesRepository)، أو القرص ممتلئ (docker system df)، أو حالة فاسدة بعد تحديث. في الحالة الأخيرة: Settings → Kubernetes → Reset Kubernetes cluster، ثم Apply & restart.Unable to connect to the server: dial tcp 127.0.0.1:6443: connectex: No connection could be made because the target machine actively refused it. (على macOS/Linux: connect: connection refused) ← لا أحد يستمع على المنفذ 6443: Docker Desktop متوقف، أو Kubernetes غير مفعّل (أو لم يعد كذلك). شغّل Docker Desktop، تحقّق من docker desktop kubernetes status → State: running، أعد المحاولة. إذا ظهرت Error: … بدلاً من None، اقرأ الرسالة: غالباً ما تكون متعلّقة بالذاكرة.docker desktop kubernetes status بـState: running لكن kubectl get nodes يفشل، أو يُجيب عن كتلة أخرى ← ينظر kubectl لديك إلى مكان آخر (سياق minikube، kind-…، كتلة شركة). يجب أن يقول kubectl config current-context بـdocker-desktop؛ وإلا فـkubectl config use-context docker-desktop. التفاصيل في الدرس 03.WSL 2 installation is incomplete أو فشل wsl --status ← نظام Windows الفرعي لـ Linux غير مثبَّت أو نواة WSL 2 مفقودة. wsl --install في PowerShell كمسؤول، إعادة تشغيل، ثم إعادة تشغيل Docker Desktop. إذا تحدّثت النافذة عن Virtual Machine Platform أو المحاكاة الافتراضية، فعّل Virtualization Technology (VT-x / AMD-V) في BIOS/UEFI: بدونها لن يُقلع لا WSL 2 ولا Docker Desktop.Error: كلمة OOM أو تُعيد حاويات k8s_… التشغيل بشكل متكرر ← ذاكرة غير كافية للآلة الافتراضية. عُد إلى الخطوة 2 (Windows: .wslconfig، wsl --shutdown) أو 3 (macOS: Resources → Memory)، ثم Reset Kubernetes cluster إذا بقيت الحالة غير متّسقة.kubectl الخاص بـ Docker Desktop رغم أن Kubernetes يعمل ← على Windows، يضعه التثبيت «لكل مستخدم» في %LOCALAPPDATA%\Programs\DockerDesktop\resources\bin\kubectl.exe بدلاً من C:\Program Files\Docker\Docker\resources\bin؛ أضف المجلد الصحيح إلى PATH (الدرس 03) وأعد فتح الطرفية.docker-desktop تحت WSL 2)؛ تفعيله = Settings → Kubernetes → Enable Kubernetes → Apply & restart، أو واجهة Kubernetes → Create cluster (4.51+).%UserProfile%\.wslconfig (memory=8GB، processors=4) ثم wsl --shutdown.docker desktop kubernetes status القيم State: running، وNode Count: 1، وVersion: v1.34.1، وProgress Message: Kubernetes is up and running؛ ويجب أن يعرض kubectl get nodes -o wide القيم docker-desktop Ready control-plane.dial tcp 127.0.0.1:6443 … refused أن Docker Desktop متوقف أو Kubernetes معطّل، وليست أبداً مشكلة في ملف YAML الخاص بك.kubectl، جهاز التحكم عن بُعد — الإصدارات، السياقات، تشريح أمر، وأول namespace باسم premiers-pas.لا يُحدّث Docker Desktop كتلة Kubernetes عند تحديث التطبيق نفسه: ستبقى عقدتك على الإصدار v1.34.1 حتى تُنفّذ Reset Kubernetes cluster، الذي يُعيد إنشاء كتلة فارغة بالإصدار المُضمَّن في نسخة Docker Desktop الجديدة. هذا فرق جوهري عن كتلة مُدارة (EKS، GKE، AKS)، حيث يُهاجَر control plane ثم العقد دون فقدان الكائنات. تصف الصفحة الرسمية Deploy on Kubernetes with Docker Desktop طريقتي التزويد، وواجهة Kubernetes من لوحة التحكم، وإعداد KubernetesImagesRepository للشبكات التي لا تصل إلى Docker Hub؛ وفي جانب Kubernetes، تشرح صفحة Install Tools كيفية تثبيت kubectl بشكل منفصل إذا احتجته على آلة أخرى.