زيادة مهاراتك مع هذا البرنامج التعليمي لـ Docker Compose

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

هل أنت مستعد؟ لنبدأ!

المتطلبات الأساسية

إذا كنت ترغب في المتابعة خطوة بخطوة في هذا البرنامج التعليمي، تأكد من توفر ما يلي:

  1. A fresh install of Ubuntu Server LTS with SSH Enabled. This guide will use Ubuntu Server LTS 20.04.1 as the Docker host machine.
  2. A computer with VS Code installed (optional). This guide will use Visual Studio Code 1.52.1 to SSH to the Docker host and run commands.
  3. تثبيت الامتداد الرسمي لـ VS Code SSH والاتصال بهاست Docker. (اختياري)

ما هو Docker Compose؟

يمكن أن تصبح الأوامر الفردية طويلة جدًا في Docker. انظر إلى المثال التالي. يقوم هذا المثال بإنشاء حاوية لتطبيق برمجي يسمى bookstack.

docker create \
   --name=bookstack \
   -e PUID # معرف المستخدم الذي سيتم تولي ملكية التطبيق / الملفات 
   -e PGID # معرف GID للمستخدم الذي سيتم تولي ملكية التطبيق / الملفات 
   -e DB_USER # مستخدم قاعدة البيانات 
   -e DB_PASS # كلمة مرور قاعدة البيانات 
   -e DB_HOST # مضيف قاعدة البيانات 
   -e DB_DATABASE # قاعدة البيانات المستخدمة 
   -e APP_URL # عنوان URL الذي سيتم الوصول إليه التطبيق عبره (مطلوب لعملية عكس البروكسي بشكل صحيح) 
   -v /host/path/to/config:/config # موقع البيانات المحملة 
   -p 80:80/tcp # منفذ واجهة المستخدم الويب 
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

مع تزايد تعقيد بيئة دوكر ، يزداد عدد العلامات والشروط المطلوبة لإعداد حاوية عملية. يصبح سطر الأوامر الخاص بدوكر معقدًا وصعبًا لإصلاح الأخطاء ، خاصةً عندما يبدأ الإعداد المتعدد للحاويات في الدخول في الصورة.

دوكر كومبوز هو طريقة لإنشاء حاويات دوكر قابلة لإعادة التكرار باستخدام ملف تكوين بدلاً من أوامر دوكر الطويلة للغاية. من خلال استخدام ملف تكوين منظم ، يصبح من الأسهل اكتشاف الأخطاء وتعريف تفاعلات الحاويات.

يصبح دوكر كومبوز لا غنى عنه بسرعة عند التعامل مع تبعيات الحاويات أو بيئات متعددة الحاويات.

دوكر كومبوز هو وسيلة رائعة للانتقال إلى “البنية التحتية كشفرة” بدون تعقيد الأنظمة الموزعة مثل “كوبرنيتيز”.

يستخدم دوكر كومبوز هيكل ملف إعداد يسمى “يامل”. يتشابه يامل مع JSON أو HTML في أنه لغة منظمة يمكن قراءتها بواسطة الآلة. يركز يامل على قابلية القراءة من قبل الإنسان بقدر الإمكان مع الحفاظ على هذا القدر الهيكلي.

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

تثبيت دوكر كومبوز

دعنا نبدأ الآن بالتعامل مع الأمور. بفرض أنك متصل بمضيف Docker الخاص بك ، حان الوقت لتثبيت دوكر كومبوز.

دوكر كومبوز هو حزمة منفصلة عن وقت التشغيل لـ دوكر. ولكن تثبيت دوكر كومبوز سيؤدي أيضًا إلى تثبيت وقت التشغيل لـ دوكر ، لذا ستقضي على طائرين بحجر واحد!

لتثبيت دوكر كومبوز ووقت التشغيل لـ دوكر ، قم بتشغيل الأمرين التاليين.

# تحديث قائمة البرامج (المعروفة أيضاً بالمستودع) ثم تثبيت Docker Compose
# مع أي تبعيات مطلوبة. يتم استخدام العلم -y لتجاوز التأكيد
sudo apt update -y
sudo apt install docker-compose -y
The installation command for Docker Compose

بمجرد التثبيت، يجب عليك الآن إنشاء هيكل مجلد لتخزين الحاويات.

إنشاء هيكل المجلدات لـ Docker Compose

قبل أن تتمكن من إنشاء حاوية باستخدام Docker Compose، يجب عليك أولاً إنشاء مجلد لتخزين الحاويات. يجب ألا تقوم فقط بإنشاء هيكل المجلدات لتخزين الحاويات ولكن ستجد أن العديد من أوامر Docker حساسة لموقع ملفات التكوين المختلفة؛ و Docker Compose ليست استثناءً عن ذلك.

العنصر الأهم في Docker Compose هو ملف التكوين الخاص به والذي يسمى docker-compose.yaml. هذا الملف التكوين، كما تم شرحه أعلاه، يحدد كيفية بناء حاوية Docker.

عند تشغيل Docker Compose، ستبحث الأمر عن ملف التكوين في نفس المجلد الذي يتم تشغيل الأمر فيه. نظرًا لهذا المتطلب، فمن الأفضل دائمًا إنشاء مجلد منفصل عند تشغيل Docker Compose.

قد يكون هناك ملف تكوين واحد فقط لـ Docker Compose في المجلد.

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

كادي هو خادم ملفات، مشابه لـ apache httpd أو nginx، ولكنه مكتوب بلغة Go. تم تصميم كادي خصيصًا لسهولة الاستخدام (وسوف يقوم تلقائيًا بإنشاء أو تقديم ملف index.html) بدون تكوين. هذا المزيج يجعل كادي خيارًا جيدًا للمبتدئين.

بفرض أنك مسجل الدخول إلى مضيف Docker الخاص بك، قم بإنشاء هيكل المجلدات على النحو التالي:

  1. في دليل المستخدم الخاص بك، قم بإنشاء مجلد يسمى الحاويات. سيكون هذا المجلد مكانًا جيدًا لهذا الحاوية وغيرها.
  2. داخل مجلد الحاويات، قم بإنشاء مجلد فرعي يسمى كادي. سيحتوي هذا المجلد على ملف تكوين Docker Compose وحاوية كادي نفسها.
  3. أخيرًا، داخل مجلد الحاوية كادي، قم بإنشاء ملف نصي فارغ يسمى docker-compose.yaml الذي سيصبح ملف تكوين Docker Compose.

بعد إنشاء هيكل المجلدات وملف تكوين Docker Compose، يمكنك الآن البدء في ملء ذلك الملف بتكوين Docker Compose.

إنشاء ملف تكوين Docker Compose

في شكله الأبسط، يبدو ملف docker-compose.yaml للحاوية كادي كما يلي. في محرر النصوص المفضل لديك في Linux أو باستخدام VS Code، قم بنسخ ولصق الشفرة أدناه إلى ملف تكوين Docker Compose الذي تم إنشاؤه سابقًا.

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

لنقم بتفصيل كل الخيارات المعروضة:

  • version تحدد إصدار ملف docker-compose. كل تعريف جديد لـ Docker Compose يتضمن تغييرات كبيرة في المواصفات. لذلك فإن الإصدار مهم حتى يتمكن Docker Compose من معرفة الميزات التي يحتاج إلى استخدامها. الإصدار 3.7 هو أحدث إصدار يدعمه Ubuntu 20.04.1 LTS.

يمكن العثور على المواصفة الكاملة لـ Docker Compose 3.x هنا. يذكر وثائق الرابط كل خيار يمكنك استخدامه داخل Docker Compose.

  • services تحتوي على المواصفات الخاصة بالحاويات الفعلية. يمكنك تعريف عدة حاويات في هذا القسم.
  • caddy هو اسم الحاوية الأولى (هذا للإشارة فقط).
  • container_name يحدد الاسم الفعلي الذي تعطى للحاوية من قِبل Docker ويجب أن يكون فريدًا.
  • image هو اسم الصورة. في هذه الحالة، يتم تعريف caddy من Docker Hub. الاسم أو الرقم بعد العلامة المفصولة بواسطة النقطتين هو الإصدار.

تعيين المنفذ

يتطلب ذكرًا خاصًا لهذا الخيار الأخير:

ports:
  - "80:80"

في Docker Compose، تمكنك التوجيهة ports من تعيين واحد أو أكثر من التطابقات من المضيف إلى الحاوية. على سبيل المثال، في الأعلى قمت بتعيين المنفذ 80 على المضيف إلى المنفذ 80 على الحاوية. ومع ذلك، ليس عليك أن تطابق رقم المنفذ. المثال أدناه يقوم بتعيين المنفذ 8800 على المضيف إلى المنفذ 80 في الحاوية.

ports:
  - "8800:80"

يمكنك أيضًا تعريف عدة منافذ كما هو موضح أدناه.

ports:
  - "80:80"
  - "443:443"

بذلك، ستتم مطابقة كل من المنفذ 80 و 443 إلى المضيف (وهي تكون تكوينًا شائعًا لخوادم الويب لخدمة كل من HTTP و HTTPS).

يحدد مُنشئ صور Docker المنافذ المتاحة في وقت الإنشاء. تأكد من التحقق من وثائق الصورة التي تعمل عليها على Docker Hub أو موقع المُحافظ للحصول على المنافذ التي يمكن التطابق عليها. ليس هناك فائدة في تطابق منفذ إذا لم يتم استخدامه!

مع ذلك في الاعتبار، دعنا ننظر في تشغيل الحاوية بالفعل.

تشغيل الحاوية

حتى الآن يجب أن يكون لديك ملف docker-compose.yaml داخل مجلد ~\containers\caddy. الآن هو الوقت المناسب لإنشاء وتشغيل حاوية Caddy.

قم بتشغيل الأمر التالي في الطرفية الخاصة بك والذي سيقوم بتشغيل حاويات Docker المعرفة في ملف docker-compose.yaml.

# يجب تشغيل هذا الأمر في نفس المجلد الذي يحتوي على الملف. العلامة -d تشغيل
# الأمر *منفصل*، مما يعني أن الحاوية ستعمل في الخلفية
sudo docker-compose up -d

قد تلاحظ أنه لم يكن عليك تحديد موقع ملف docker-compose.yaml عند تشغيل الأمر sudo docker-compose up -d. يتوقع من Docker Compose تشغيل جميع الأوامر داخل المجلد الذي يحتوي على ملف docker-compose.yaml ، حيث أن العديد من الأوامر متعلقة بذلك المجلد.

الآن تحقق من أن الحاوية قد تم تشغيلها وتعمل عن طريق الانتقال إلى http://<عنوان IP الخاص بك>. يستخدم هذا الدليل http://homelab-docker كمرجع.

يمكنك رؤية هذه العملية وقد تحدث في VS Code أثناء الاتصال بـ SSH في المضيف Docker في الرسم المتحرك أدناه:

Demonstrating a container created with Docker Compose

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

أوامر لإدارة الحاويات المنفصلة

في القسم السابق ، قمت بتشغيل حاوية caddy باستخدام علامة -d. عند القيام بذلك ، تعمل الحاوية في حالة مفصولة. عندما تكون الحاوية في حالة منفصلة ، فإن الحاوية ستستمر في العمل في الخلفية. ولكن ، هذا يشكل مشكلة: كيف يمكنك إدارة تلك الحاوية إذا فقدت السيطرة المباشرة؟

لحل هذه المشكلة ، يتوفر لـ Docker Compose سلسلة من الأوامر التي ستدير الحاويات التي تم بدء تشغيلها باستخدام ملف docker-compose.yaml:

  • docker-compose restart يُستخدم لإعادة تشغيل حاوية تعمل حاليًا. يختلف هذا الأمر عن تشغيل docker-compose up -d بالفعل. سيعيد الأمر إعادة تشغيل الحاوية الموجودة، ويعيد تشغيل الأمر docker-compose up -d، ويعيد إنشاء الحاوية من البداية (إذا تم تغيير ملف التكوين).
  • docker-compose stop سيتوقف عن تشغيل حاوية تعمل بدون تدمير الحاوية. بالمثل، docker-compose start سيبدأ تشغيل الحاوية مرة أخرى.
  • docker-compose down سيتوقف عن تشغيل الحاويات وسيدمرها أيضًا. هنا يأتي دور تثبيتات مجلدات التجزئة (اقرأ المزيد أدناه).
  • docker-compose pull سيستلم الإصدار الحالي لصورة دوكر (أو الصور) من المستودع. إذا كنت تستخدم وسم latest، يمكنك أن تتبعه بـ docker-compose down && sudo docker-compose up -d لاستبدال الحاوية بالإصدار الأحدث. استخدام docker-compose pull هو وسيلة ملائمة لتحديث الحاويات بسرعة مع الحد الأدنى من وقت التوقف.
  • docker-compose logs سيعرض سجلات الحاوية التي تعمل (أو تم إيقافها). يمكنك أيضًا تحديد الحاويات الفردية (إذا كانت هناك عدة حاويات محددة في ملف الاكتظاه) باستخدام docker-compose logs <اسم الحاوية>.

A full list of docker-compose commands can be seen by running docker-compose with no additional arguments or referenced here in the documentation.

الآن بعد أن لديك حاوية تعمل، دعنا نلقي نظرة على استخدام المحتوى المحفوظ محليًا على جهازك.

إنشاء تثبيتات مجلدات التجزئة في دوكر كومبوز

المسارات المرتبطة هي كيفية ربط دوكر لبيانات المستخدم الهامة بالتخزين المحلي على الخادم الخاص بك. للبدء، قم بإنشاء بعض المحتوى للحاوية لتستضيفه:

  1. على خادم دوكر، داخل مجلد ~/containers/caddy، قم بإنشاء مجلد جديد يسمى files.

2. قم بإنشاء ملف جديد يسمى index.html داخل مجلد ~/containers/caddy بالشكل التالي. سيكون هذا هو الصفحة الرئيسية التي ستخدمها خادم الويب Caddy.

<body><h2>hello world!</h2></body>

3. قم بتعديل ملف تكوين Docker Compose الخاص بك ليكون كما يلي. المثال أدناه يضيف قسم volumes ويشير إلى المسار المرتبط الذي تم إنشاؤه للتو إلى المجلد files لجعله متاحًا للحاوية.

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #الـ ./ يشير إلى مجلد نسبي لملف docker-compose - "./files:/usr/share/caddy"

4. قم بتشغيل docker-compose up -d مرة أخرى. سيتعرف Docker Compose الآن على أن الملف تم تغييره وسيقوم بإعادة إنشاء الحاوية الخاصة بك.

5. انتقل إلى صفحة الحاوية باستخدام المتصفح ويجب أن ترى الآن أنها تخدم صفحة “مرحبًا بالعالم!”.

يمكنك رؤية ما يلي في الرسم المتحرك أدناه:

Creating a bind mount using Docker Compose

أنت الآن تستضيف المحتوى المخزن محليًا على جهازك! ومع ذلك، ماذا لو كان محتواك على مصدر خارجي مثل مشاركة الشبكة؟

استخدام Docker Compose مع Docker Volumes

بمجرد إنشاء حاوية بسيطة باستخدام Docker Compose ، ربما تحتاج إلى أن تتمكن تلك الحاوية من الوصول إلى ملفات في مكان آخر ربما على حصة شبكة. إذا كان الأمر كذلك ، يمكنك تكوين الحاوية لاستخدام Docker volumes مباشرةً في ملف تكوين Docker Compose.

لأغراض العرض ، سيتم إنشاء خادم Network File Share (NFS) على مضيف Docker. تقديم المحتوى المحلي كـ NFS mount ليس له هدف عملي خارج إطار العرض. إذا كنت ترغب في تحميل حجم NFS ، فعادةً ما يكون من مصدر خارجي مثل NAS أو خادم عن بُعد.

إعداد حصة NFS

إذا لم يكن لديك حصة NFS معدة بالفعل ، قم بإنشاء واحدة الآن على مضيف Docker لهذا البرنامج التعليمي. للقيام بذلك ، يمكنك:

  1. تثبيت حزمة خادم NFS عن طريق تشغيل apt install nfs-kernel-server -y.

2. إضافة الحاوية كتصدير NFS (مشابه لحصة CIFS في Windows) عن طريق تشغيل الأمر التالي.

# أضف سطرًا إلى ملف التكوين /etc/exports لإنشاء حصة NFS لـ # /home/homelab/containers. هذه الحصة تكون مكشوفة فقط لـ localhost (لمنع أجهزة الكمبيوتر الأخرى من الوصول) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # أعد تشغيل خادم NFS باستخدام التكوين الجديد sudo systemctl restart nfs-kernel-server

3. قم الآن بالتحقق مما إذا كان المضيف يكشف مشاركة NFS عن طريق تشغيل الأمر showmount -e localhost. سيعرض هذا الأمر أي مشاركات NFS المكشوفة حاليًا ومن لهم الوصول إليها.

في الصورة أدناه ، يمكنك أن ترى أن /home/homelab/containers مكشوفة ، ولكن فقط لجهاز الكمبيوتر المضيف المحلي (وهو نفس الخادم الذي يعمل عليه مضيف Docker).

Creating a NFS share in Ubuntu 20.04

إذا رأيت المجلد /home/<اسم المستخدم>/containers في الناتج ، فإن مشاركة NFS مكونة.

تعريف وحدة تخزين مسماة لـ Docker

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

A named volume is a way for Docker to abstract network-based file shares. Network file sharing comes in all sorts of shapes and sizes these days: CIFS (windows) shares, NFS (Linux) shares, AWS S3 Buckets, and more. By creating a Named Volume, Docker does the hard part of figuring out how to talk to the network share and lets the container just treat the share as if it is local storage.

لإنشاء وحدة تخزين مسماة:

  1. افتح ملف تكوين Docker Compose (docker-compose.yaml). إذا كنت تتابع ، يجب أن يكون الملف موجودًا في المجلد ~/containers/caddy.

2. في داخل ملف تكوين Docker Compose ، أضف قسم volumes بعد قسم services. يجب أن يكون ملف التكوين الخاص بك كما هو موضح أدناه. ينشئ قسم volumes وحدة تخزين مسماة تسمى MyWebsite. داخل تلك الوحدة تخزين المسماة ، يتم تحديد المعلمات المطلوبة (مثل عنوان IP وإعدادات NFS والمسار). يتم أيضًا تعديل المعلمة volumes في قسم services ، للإشارة إلى وحدة التخزين المسماة بدلاً من المجلد المحلي.

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. بمجرد تعريف الحجم المسمى الذي يشير إلى مشاركة NFS في ملف تكوين Docker Compose ، قم بتشغيل docker-compose up -d لإنشاء وتشغيل الحاوية. إذا تم كل شيء بشكل صحيح ، يجب أن تعود الحاوية والموقع إلى العمل.

Setting NFS client settings within Docker Compose in VS Code

4. انتقل إلى صفحة الحاوية مرة أخرى. يجب أن يظهر محتوى index.html تمامًا كما لو كان الملف يتم تعليقه محليًا. ومع ذلك ، يتم تعليق ذلك الملف من خلال خادم NFS المعد على الشبكة.

Demonstrating access to the index.html file through an NFS share in Docker

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

لن يتم استخدام حاوية caddy في هذا البرنامج التعليمي بعد الآن ، لذا يمكنك إزالة الحاوية باستخدام docker-compose down.

تعريف حاويات متعددة في Docker Compose

معظم حاويات Docker لا تعمل في فراغ. عادةً ما تحتوي حاويات Docker على تبعيات الخدمة مثل قواعد البيانات أو خدمات الويب المنفصلة التي تتحدث عبر واجهة برمجة تطبيقات.

باستخدام Docker Compose ، يمكنك تجميع الحاويات معًا المحددة في ملف واحد. من خلال تعريف حاويات متعددة في ملف واحد ، يمكن للحاويات التواصل بين الخدمات المعتمدة وتبسيط تنظيم تخطيطات الحاويات المعقدة.

لتوضيح مثل هذا السيناريو ، دعنا نقوم بإعداد تطبيق ويكي شعبي يسمى BookStack.

يعتبر BookStack برنامج ويكي شهير بسبب سهولة استخدامه وتصميمه التسلسلي (على عكس التصميم الأفقي، مثل mediawiki).

يتطلب BookStack، مثل العديد من تطبيقات الويب الأخرى، قاعدة بيانات منفصلة للعمل بشكل صحيح، بالإضافة إلى المعلومات المطلوبة للتواصل مع قاعدة البيانات. يبرز Docker Compose في إعداد مثل هذا السيناريو.

إنشاء ملف تكوين Docker Compose

لا يحتوي BookStack على صورة Docker مُدارة داخليًا، ولكن linuxserver.io يُدير صورة موثوقة في مستودع Docker Hub نيابةً عن BookStack. بينما يحتوي الوثائق على مستودع Docker Hub على ملف تكوين Docker Compose الموصى به، ستقوم هذه الدروس التعليمية بإنشاء ملف تكوين جديد وشرح المفاهيم.

على مضيف Docker:

  1. أولاً، أنشئ مجلدًا لـ BookStack. إذا قمت بمتابعة دروس الجزء السابق، يجب أن يكون لديك مجلد ~/containers. قم بإنشاء مجلد يسمى bookstack فيه.

2. ثم أنشئ ملف تكوين فارغ لـ Docker Compose يسمى docker-compose.yaml داخل مجلد bookstack.

Creating the folder structure for Bookstack in VS Code

3. الآن افتح ملف تكوين Docker Compose وحدد حاويتين: حاوية bookstack وحاوية bookstack_db (mariadb).

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

حتى الآن، يستخدم ملف docker-compose.yaml مفاهيم تم تقديمها بالفعل: لديك خدمتين (bookstack و bookstack_db)، كلاهما مع صور وربطات مقيدة. يحتوي حاوية bookstack على تعيين تعيين المنفذ من منفذ المضيف 8080 إلى المنفذ الداخلي 80.

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

الخيار الجديد الذي يمكنك رؤيته في الملف أعلاه هو أمر depends_on. يخبر هذا الأمر Docker بالترتيب الذي يجب أن تبدأ به الحاويات. تحديد أمر depends_on يخبر Docker أن الحاوية bookstack_db يجب أن تبدأ أولاً.

إعداد التواصل بين الحاويات باستخدام المتغيرات البيئية

لم يكتمل هذا الملف التكوين الذي تم إنشاؤه في القسم السابق بعد. بينما قمت بتعريف حاويتين (حاويات)، فإنهما لا يتحدثان مع بعضهما البعض! ليس لدى حاوية bookstack أي فكرة عن كيفية التواصل مع حاوية bookstack_db. دعنا نحل ذلك باستخدام المتغيرات البيئية.

المتغيرات البيئية هي الطريقة الأكثر شيوعًا لتوفير المتغيرات لحاويات Docker. هذه المتغيرات تُعطى أثناء التشغيل (أو يتم تعريفها في ملف تكوين docker-compose.yaml) لتوفير معلومات حول ما يحتاج الحاوية إلى القيام به.

تعرف المتغيرات البيئية من قبل الشخص الذي ينشئ صورة Docker. ستكون مختلفة اعتمادًا على صورة Docker التي تستخدمها، ويجب عليك الرجوع إلى وثائق المنشئ بخصوص المتغيرات البيئية المستخدمة.

هناك طريقتان لتعريف المتغيرات البيئية؛ مباشرة في ملف docker-compose.yaml نفسه أو كملف منفصل.

A separate file is, typically, the recommended method, especially if variables contain sensitive data such as passwords. A docker-compose.yaml file is designed to be shared or even uploaded to a public-facing GitHub repo. Having a separate file for sensitive data reduces the chance of an accidental security breach.

على المضيف Docker، قم الآن بإنشاء متغيرين بيئيين؛ واحد لحاوية bookstack وواحد لحاوية bookstack_db.

  1. قم بإنشاء ملف جديد في المجلد ~/containers/bookstack بعنوان bookstack.env بالمحتوى التالي:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. قم بإنشاء ملف جديد في المجلد ~/containers/bookstack بعنوان bookstack_db.env وقم بتضمين المحتوى التالي:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3. كممارسة جيدة، تأكد الآن من أن كلا ملفي env غير قابلين للقراءة بواسطة مستخدمين آخرين.

chmod 600 bookstack.env bookstack_db.env

يجب تغيير صلاحية القراءة لأن كلاً من ملفي bookstack.env و bookstack_db.env يحتويان على بيانات حساسة.

4. قم بتحديث ملف Docker Compose ~/containers/bookstack/docker-compose.yaml للإشارة إلى هاتين الملفتين البيئيتين الموضحتين أدناه.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5. قم الآن بتشغيل حاويات bookstack و bookstack_db باستخدام Docker Compose.

sudo docker-compose up -d

يمكنك رؤية كل خطوة من الخطوات المذكورة أعلاه في هذا القسم المنفذ في VS Code أدناه.

Setting up environment variables and the Docker Compose file with VS Code

مراقبة سجلات Docker Compose

تعمل محرك Docker مع Docker Compose لأداء العديد من المهام المختلفة في الخلفية. يكون القدرة على مراقبة ما يحدث ، خاصة عند العمل مع عدة حاويات في وقت واحد ، مفيدة.

لمراقبة حاوية bookstack ، على سبيل المثال ، استخدم الأمر logs. في هذا البرنامج التعليمي ، بمجرد رؤية السجلات تظهر [services.d] done ، يمكنك الانتقال إلى عنوان URL الخاص بـ bookstack.

sudo docker-compose logs bookstack
Using the docker-compose logs command
The bookstack welcome screen. Default login is [email protected]/password

في هذه المرحلة ، يجب أن يكون لديك ويكي يعمل بشكل كامل داخل حاويته الخاصة ، مع قاعدة بياناته الخاصة ، تمامًا داخل Docker!

طالما لديك مجلدات bookstack و bookstack_db ، يمكنك إعادة إنشاء بيئة bookstack الخاصة بك من البداية.

Docker Compose و Networking

حتى هذه النقطة ، لم تتعلم الكثير عن جانب الاتصال والشبكة لكيفية عمل الحاويات معًا. دعنا نغير ذلك.

عند إنشاء عدة حاويات داخل ملف docker-compose.yaml واحد كما فعلت في الأقسام السابقة ، يتم تعيينها جميعًا في نفس الشبكة (عادة ما يُطلق عليها اسم-المجلد-الأصلي_default ).

يمكنك رؤية الشبكة التي تم إنشاؤها للحاويات عند تشغيل docker-compose up -d كما هو موضح أدناه.

The default network created with docker-compose comes up

عندما تتم تعيين جميع الحاويات في نفس الشبكة ، يقوم Docker بإنشاء إدخالات DNS لها داخليًا. لهذا السبب في المثال السابق ، تشير إلى قاعدة البيانات الخاصة بك باسم bookstack_db في متغيرات البيئة. هذا الاسم bookstack_db هو في الواقع إدخال DNS يشير إلى عنوان IP لحاوية قاعدة البيانات.

أنت أيضًا لست مضطرًا إلى الاعتماد على Docker Compose لتوليد الشبكات تلقائيًا بالنسبة لك. يمكنك تعريف الشبكات الداخلية أو الخارجية يدويًا. تعريف الشبكات يدويًا يكون رائعًا عندما يكون لديك حاوية تحتاج إلى التواصل مع حاوية أخرى في ملف docker-compose.yaml منفصل. يمكنك تعريض المنافذ، أو يمكنك إنشاء شبكة يمكن لكل منهما الانضمام إليها!

يرجى ملاحظة أنه عندما تبدأ في تعريف الشبكات صراحةً، يجب عليك أيضًا تعريف الشبكة الافتراضية بشكل صريح. سيتوقف Docker Compose عن إنشاء تلك الشبكة تلقائيًا بمجرد بدء تعريف الشبكات

الآن قم بتعديل ملف docker-compose.yaml الخاص بـ bookstack لتضمين شبكة تم إنشاؤها خارجيًا.

  1. قم بإنشاء الشبكة الخارجية باستخدام docker network create my_external_network.

2. قم بتعريف الشبكة الخارجية في docker-compose.yaml:

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. قم بتشغيل docker-compose up -d لإعادة إنشاء الحاويات. الحاويتين الخاصتين بك متصلتين الآن بشبكتين كما هو موضح أدناه.

A highlight of the networks defined within a docker-compose file

تم الآن انضمام حاوية bookstack أيضًا إلى شبكة معرفة خارجيًا. هذا يتيح لك إنشاء حاوية أخرى تحوّل حركة مرور bookstack HTTP إلى HTTPS قبل مغادرة Docker (يشار إليها بـ reverse-proxy).

تعيين مستخدم محدد لتشغيل حاوية

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

المشكلة الأخرى في التشغيل كمستخدم جذر هي أذونات الملفات. قد تلاحظ أنه إذا حاولت حذف المجلد db داخل مجلد bookstack ، فلن تتمكن فعليًا من ذلك. المحتوى مملوك للمستخدم الجذر.

على الرغم من أن معظم الصور لا تقدر تشغيلها كمستخدم غير جذر ، linuxserver.io الصور بشكل خاص توفر متغير بيئة لتعيين المستخدم الذي يعمل داخل الحاوية. يمكنك القيام بذلك عن طريق إضافة UID=1000 و GID=1000 داخل تكوين bookstack.env.

1000: 1000 هو معرف المستخدم ومجموعة المستخدم الافتراضية لأول مستخدم في أوبونتو (الذي قد لا تكون أنت عليه). يمكنك قراءة المزيد حول معرفات المستخدمين ومعرفات المجموعات في ذات الصلة: رجل ويندوز في عالم لينكس: المستخدمين وأذونات الملفات)

يمكنك أيضًا إجبار المعرف ومعرف المجموعة باستخدام معلمة user في docker-compose ، ولكن لا يُوصى بهذا لأن معظم الحاويات لا تتصرف بشكل جيد عند إجبارها على مستخدم مختلف

ضبط سياسة إعادة التشغيل

إذا كنت ترغب في إعادة تشغيل حاويات بنيت باستخدام Docker Compose في حالة فشلها، استخدم سياسة إعادة التشغيل عن طريق إضافة معلمة restart تحت إعدادات الحاوية في docker-compose.yaml.

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

إضافة هذه المعلمة ستؤدي إلى إعادة تشغيل الحاويات تلقائياً في حالة الفشل للمساعدة في الحفاظ على الوقت الفعلي في حالة حدوث مشاكل غير متوقعة في الطاقة.

تعيين إدخالات DNS يدوياً للحاويات

مثلما هو الحال مع نظامي التشغيل ويندوز ولينكس، لديكر أيضاً “ملف المضيفين”. من خلال استخدام المعلمة extra_hosts في ملف تكوين، يمكنك إجبار المضيف على حل إلى عنوان IP محدد. يمكن أن يكون ذلك مفيداً عندما تواجه قيود DNS، مثل DNS المنقسم أو خادم اختبار ترغب في التفاعل معه مؤقتاً.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

تشغيل الأوامر

بمجرد تشغيل الحاوية، يمكنك تشغيل الأوامر داخل الحاوية باستخدام docker-compose run. على سبيل المثال، ربما ترغب في بدء واجهة سطر الأوامر باستخدام Bash داخل حاويتك bookstack. للقيام بذلك، قم بتشغيل الأمر التالي.

docker-compose run web bash

الاستنتاج

في هذه المرحلة، يجب أن تكون لديك معلومات كافية لمتابعة غالبية دروس docker-compose الموجودة على الويب. وبهذا المعرفة، يمكنك توسيع قدرتك على الانتقال إلى عالم Docker وبناء تطبيقات الويب في بنية الأكواد التحتية.

Source:
https://adamtheautomator.com/docker-compose-tutorial/