Docker للمبتدئين: وداعاً لكوابيس النشر!

Docker للمبتدئين: وداعاً لكوابيس النشر!

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

Docker، المبني على لغة Go والمفتوح المصدر تحت ترخيص Apache 2.0، هو محرك حاويات للتطبيقات. هذه التقنية للحاويات تمكن المطورين من حزم تطبيقاتهم وتبعياتهم في حاويات خفيفة الوزن وقابلة للنقل. يمكن نشر هذه الحاويات على أي جهاز Linux شائع دون القلق بشأن الاختلافات البيئية.

Docker مقابل الآلات الافتراضية (VMs)

كما ذكرنا، يستخدم Docker المحاكاة الافتراضية. عند الحديث عن المحاكاة الافتراضية، لا بد أن تظهر الآلات الافتراضية (VMs) على الساحة. بما أن كلاهما يعتمد على المحاكاة الافتراضية، فمن الطبيعي أن نتساءل عن الاختلافات بينهما. دعنا نتعمق في ذلك. أولاً، لنلقي نظرة على رسم تخطيطي لبنية الآلة الافتراضية النموذجية. فوق البنية التحتية (التي تمثل الأجهزة الأساسية)، يوجد برنامج مراقبة الأجهزة الافتراضية (hypervisor). يعمل كوسيط بين الخادم الفعلي وأنظمة التشغيل، مما يسمح لأنظمة تشغيل وتطبيقات متعددة بمشاركة الأجهزة الأساسية. تقوم الآلات الافتراضية بتشغيل أنظمة تشغيل متميزة متعددة فوق نظام التشغيل المضيف وتستخدم برنامج المراقبة للوصول إلى الأجهزة الأساسية. إذا كنت بحاجة إلى تشغيل ثلاثة تطبيقات معزولة، فستقوم بإنشاء ثلاث آلات افتراضية. وهذا يعني تشغيل ثلاثة أنظمة تشغيل فوق برنامج المراقبة، مما يؤدي إلى استهلاك كبير للموارد.

رسم تخطيطي لبنية آلة افتراضية نموذجية

(ملاحظة: يجب أن يظهر في الرسم التخطيطي نظام تشغيل مضيف (Host Operating System) فوق برنامج المراقبة)

على النقيض من ذلك، فإن Docker خفيف الوزن بشكل ملحوظ. يستبدل Daemon الخاص به (Docker Daemon) برنامج المراقبة، حيث يعمل مباشرة على نظام التشغيل. يتم حزم الكود المصدري للتطبيق وتبعياته في صورة Docker. ثم يستخدم محرك Docker هذه الصورة لإنشاء حاوية. تعمل التطبيقات المختلفة في حاويات معزولة. علاوة على ذلك، يتواصل Daemon الخاص بـ Docker مباشرة مع نظام التشغيل لتخصيص الموارد لحاويات Docker. بدون تحميل نظام تشغيل كامل، يتقلص وقت بدء تشغيل الحاوية من دقائق للآلات الافتراضية إلى أجزاء من الثانية فقط لحاويات Docker، مما يعزز الكفاءة بشكل كبير ويوفر مساحة كبيرة على القرص وموارد النظام الأخرى.

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

كيفية استخدام Docker

تثبيت Docker (مثال CentOS 7)

  1. تثبيت أدوات النظام الأساسية:
yum install -y yum-utils device-mapper-persistent-data lvm2 
  1. تحديث نواة النظام وذاكرة التخزين المؤقت لـ yum:
yum update
yum makecache fast
  1. تثبيت Docker وبدء تشغيله:
yum -y install docker-ce
systemctl start docker 
  1. اختبار إذا تم تثبيت Docker بنجاح:
docker run hello-world 

إذا رأيت رسالة “Hello from Docker” على شاشتك، فتهانينا! اكتمل التثبيت.

المفاهيم

قبل التعمق أكثر في Docker، دعنا نغطي بعض المفاهيم الأساسية لتجربة تعلم أكثر سلاسة.

  1. صور Docker: صورة Docker هي قالب يُستخدم لإنشاء حاويات Docker
  2. حاوية Docker: ينشئ Docker حاويات من خلال الصور لتشغيل مجموعة من التطبيقات المستقلة
  3. سجل Docker: مستودع الأكواد لحفظ الصور

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

أمثلة

دعنا نربط هذه المفاهيم من خلال مثالين شائعين لتوضيح كيفية استخدام Docker.

تثبيت Python باستخدام Docker

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

  • الغرض: البحث عن صورة معينة في مستودع الصور.
  • الصيغة: docker search [OPTIONS] TERM
  • مثال: docker search python
  • الشرح: البحث عن صور متعلقة بـ Python في المستودع.
[root@novita ~]# docker search pythonINDEX       NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/python                           Python is an interpreted, interactive, obj...   4356      [OK]
docker.io   docker.io/django                           Django is a free web application framework...   856       [OK]
docker.io   docker.io/pypy                             PyPy is a fast, compliant alternative impl...   196       [OK]
docker.io   docker.io/kaggle/python                    Docker image for Python scripts run on Kaggle   125                  [OK]
docker.io   docker.io/arm32v7/python                   Python is an interpreted, interactive, obj...   38
docker.io   docker.io/centos/python-35-centos7         Platform for building and running Python 3...   36

سنختار الصورة الرسمية ذات العلامة (الإصدار) 3.7.

docker pull

  • الغرض: سحب أو تحديث صورة محددة من مستودع الصور.
  • الصيغة: docker pull [OPTIONS] NAME:TAG
  • مثال: docker pull python:3.7
  • الشرح: تنزيل صورة Python ذات العلامة 3.7 من المستودع.
[root@novita ~]# docker pull python:3.7
Trying to pull repository docker.io/library/python ...3.7: Pulling from docker.io/library/python
5ae19949497e: Downloading [=============>                                     ] 13.72 MB/50.38 MB
ed3d96a2798e: Download complete
f12136850781: Downloading [============================================>      ] 8.789 MB/9.978 MB
1a9ad5d5550b: Downloading [==>                                                ] 2.628 MB/51.77 MB
6f18049a0455: Waiting
ce39fa9d79d1: Waiting
Digest: sha256:d8718f4c8f28360c88d2d8b53681edb3c95e6a7bacedabd32eb5b1d120a75dc5
Status: Downloaded newer image for docker.io/python:3.7

لقد قام Docker الآن بتنزيل الصورة المحددة. لعرض صور Docker الموجودة:

docker images

  • الغرض: سرد الصور المحلية.
  • الصيغة: docker images [OPTIONS] [REPOSITORY[:TAG]]
  • مثال: docker images
  • الشرح: عرض جميع صور Docker المحلية.
[root@novita ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/python        3.7                 42d620af35be        6 days ago          918 MB
docker.io/rabbitmq      3-management        7aae48fa6ef6        7 days ago          179 MB
docker.io/golang        latest              f50db16df5da        9 days ago          774 MB

صورة python3.7 موجودة. لنقم بإنشاء حاوية باستخدامها.

docker run

قبل إنشاء الحاوية، دعنا نتطرق بإيجاز إلى المعرفات. في Docker، تحدد المعرفات الصور أو الحاويات بشكل فريد. نتفاعل معها باستخدام “command + ID”. على سبيل المثال، في الكود السابق، المعرف الفريد لصورة python3.7 هو 42d620af35be.

  • الغرض: إنشاء حاوية جديدة.
  • الصيغة: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

لاختبار بيئة Python، لنقم بإنشاء ملف hello.py محليًا:

#!/usr/bin/python 
import sys 

print("Hello, Docker!") 
print(sys.version)  # طباعة رقم إصدار Python 

بافتراض أن هذا الكود محفوظ في /root/code/python:

[root@novita python]# docker run  -v $PWD:/usr/src/code  -w /usr/src/code python:3.7 python hello.py 
Hello, Docker! 
3.7.4 (default, Jul 13 2019, 14:04:11) [GCC 8.3.0] 

دعنا نفسر هذا الأمر:

  • docker run: إنشاء حاوية.
  • -v $PWD:/usr/src/code: ربط الدليل المحلي بحاوية Docker. هنا، يتم ربط الدليل الذي يُنفذ منه الأمر بـ /usr/src/code داخل الحاوية. يفصل النقطتان المسار المحلي عن مسار الحاوية. يمكنك استخدام مسارات مطلقة بدلاً من $PWD.
  • -w /usr/src/code: تعيين دليل العمل للحاوية. نظرًا لأن دليل كود Python مربوط بـ /usr/src/code، فقد قمنا بتعيينه كدليل عمل.
  • python:3.7: تحديد الصورة. يمكنك استخدام معرف الصورة بدلاً من ذلك.
  • python hello.py: تنفيذ هذا الأمر داخل الحاوية.

تأمل ذهني: إذا كان لديك ملف hello.go في /root/data/ وتريد تشغيله باستخدام حاوية Golang ذات معرف الصورة f50db16df5da، فما هو الأمر؟ (تلميح: الأمر لتشغيل كود Go هو go run FILENAME)

تثبيت MariaDB باستخدام Docker

بافتراض أنه يمكنك الآن البحث عن صورة MariaDB وتنزيلها، دعنا نركز على تشغيلها. تتطلب الخدمات مثل قواعد البيانات فتح المنافذ المقابلة على المضيف. كيف نحقق ذلك باستخدام Docker؟ سنستخدم تعيين المنافذ، المشابه لربط الدلائل.

[root@novita python]# docker run -d -v /data/mysql/:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  --restart unless-stopped 3a2ef06682ac 
  • -d: تشغيل الحاوية في الخلفية.
  • -p 3306:3306: تعيين المنفذ 3306 في الحاوية إلى المنفذ 3306 على المضيف.
  • -e MYSQL_ROOT_PASSWORD=123456: تعيين كلمة مرور الجذر لـ MariaDB إلى 123456.
  • --restart unless-stopped: إعادة تشغيل الحاوية تلقائيًا إذا توقفت بشكل غير متوقع.
  • 3a2ef06682ac: معرف الصورة لإنشاء الحاوية.

الآن، دعنا نتحقق مما إذا كانت خدمة قاعدة البيانات قيد التشغيل:

docker ps

  • الغرض: سرد الحاويات.
  • الصيغة: docker ps [OPTIONS]
[root@novita ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
107b52416c13        3a2ef06682ac        "docker-entrypoint..."   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp                                                                       quizzical_mcnulty 

بعد ذلك، سنصل إلى البيئة الداخلية للحاوية.

docker exec

  • الغرض: تنفيذ أمر في حاوية قيد التشغيل.
  • الصيغة: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • مثال: docker exec -it 107b52416c13 bash
  • الشرح: الوصول إلى الحاوية ذات المعرف 107b52416c13 وتنفيذ الأمر bash.

داخل الحاوية، يمكنك التفاعل معها مثل أي بيئة Linux عادية. باستخدام بيانات الاعتماد التي تم تعيينها مسبقًا، يمكنك الوصول إلى MariaDB.

[root@novita ~]# docker exec -it 107b52416c13 bash 
root@107b52416c13:/# mysql -u root -p123456 
Welcome to the MariaDB monitor.  Commands end with ; or \g. 
Your MariaDB connection id is 11 
Server version: 10.4.6-MariaDB-1:10.4.6+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
MariaDB [(none)]> 

حتى الآن، تعلمت أساسيات Docker. حاول استكشاف المزيد.

Novita AI هي المنصة السحابية الشاملة التي تمكّن طموحاتك في الذكاء الاصطناعي. من خلال واجهات برمجة تطبيقات متكاملة بسلاسة، وحوسبة بدون خادم، وتسريع GPU، نقدم لك الأدوات الفعالة من حيث التكلفة التي تحتاجها لبناء وتوسيع نطاق أعمالك المعتمدة على الذكاء الاصطناعي بسرعة. تخلص من متاعب البنية التحتية وابدأ مجانًا - Novita AI تحقق أحلامك في الذكاء الاصطناعي.