دليل إنشاء Docker للمبتدئين

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

دليل إنشاء Docker للمبتدئين

ما هو Docker Compose؟

Docker Compose هي أداة مضمنة في Docker. إنه مصمم لحل المشكلات المتعلقة بنشر المشاريع.

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

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

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

الفرق بين Docker و Docker Compose

يستخدم Docker لإدارة الحاويات الفردية (الخدمات) التي تشكل تطبيقًا.

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

دليل إنشاء Docker للمبتدئين
Docker (حاوية واحدة) و Docker Compose (حاويات متعددة)

حالة استخدام نموذج Docker Compose

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

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

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

لسوء الحظ ، لم تستخدم شيئًا مثل Docker Compose. لذلك ، سيتعين عليك ترحيل الخدمات وإعادة تكوينها واحدة تلو الأخرى ، على أمل ألا تنسى أي شيء في عملية هذا العمل.

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

تطوير تطبيق خادم العميل باستخدام Docker Compose

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

يرجى ملاحظة أننا نفترض أن لديك أساسيات Docker وأن منصة Docker مثبتة لديك بالفعل.

لنبدأ العمل في المشروع.

▍1. أنشئ مشروعًا

من أجل بناء أول تطبيق عميل / خادم ، أقترح أن تبدأ بإنشاء مجلد مشروع. يجب أن تحتوي على الملفات والمجلدات التالية:

  • ملف docker-compose.yml. هذا ملف Docker Compose يحتوي على الإرشادات اللازمة لبدء الخدمات وتكوينها.
  • ملف server. سيحتوي على الملفات اللازمة لجعل الخادم يعمل.
  • ملف client. هذا هو المكان الذي سيتم وضع ملفات تطبيق العميل فيه.

نتيجة لذلك ، يجب أن تبدو محتويات المجلد الرئيسي لمشروعك كما يلي:

.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file

▍2. إنشاء الخادم

نحن هنا ، في عملية إنشاء خادم ، سنتطرق إلى بعض الأشياء الأساسية المتعلقة بـ Docker.

2 أ. إنشاء الملفات

اذهب إلى المجلد server وأنشئ الملفات التالية فيه:

  • ملف server.py. سيحتوي على رمز الخادم.
  • ملف index.html. سيحتوي هذا الملف على جزء من النص يجب أن يعرضه تطبيق العميل.
  • ملف Dockerfile. هذا هو ملف Docker الذي سيحتوي على التعليمات اللازمة لإنشاء بيئة الخادم.

هذا هو الشكل الذي يجب أن تبدو عليه محتويات المجلد الخاص بك server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files

2 ب. تحرير ملف بايثون.

أضف إلى ملف server.py الكود التالي:

#!/usr/bin/env python3

# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.

import http.server
import socketserver

# Эта переменная нужна для обработки запросов клиента к серверу.

handler = http.server.SimpleHTTPRequestHandler

# Тут мы указываем, что сервер мы хотим запустить на порте 1234. 
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.

   httpd.serve_forever()

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

2 ج. تحرير ملف HTML

إلى ملف index.html يضاف النص التالي:

Docker-Compose is magic!

سيتم إرسال هذا النص إلى العميل.

2 د. تحرير Dockerfile

الآن سنقوم بإنشاء ملف بسيط Dockerfile، والتي ستكون مسؤولة عن تنظيم بيئة وقت التشغيل لخادم Python. كأساس للصورة التي تم إنشاؤها ، سوف نستخدم بشكل رسمي، مصمم لتشغيل البرامج المكتوبة بلغة Python. فيما يلي محتويات Dockerfile:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.

FROM python:latest

# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.

ADD server.py /server/
ADD index.html /server/

# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.

WORKDIR /server/

الآن دعنا نعمل على العميل.

▍3. قم بإنشاء عميل

أثناء إنشاء جانب العميل في مشروعنا ، سنتذكر بعض أساسيات Docker على طول الطريق.

3 أ. إنشاء الملفات

انتقل إلى مجلد المشروع الخاص بك client وأنشئ الملفات التالية فيه:

  • ملف client.py. هذا هو المكان الذي سيكون فيه رمز العميل.
  • ملف Dockerfile. يلعب هذا الملف نفس الدور الذي يلعبه ملف مشابه في مجلد الخادم. وهي تحتوي على بيان يصف كيفية إنشاء بيئة لتنفيذ كود العميل.

نتيجة لذلك ، المجلد الخاص بك client/ في هذه المرحلة يجب أن تبدو كما يلي:

.
├── client.py
└── Dockerfile
0 directories, 2 files

3 ب. تحرير ملف بايثون

أضف إلى ملف client.py الكود التالي:

#!/usr/bin/env python3

# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.

import urllib.request

# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Выводим содержимое файла, полученного с сервера ('index.html').

print(decodedContent)

# Закрываем соединение с сервером.

fp.close()

بفضل هذا الرمز ، يمكن لتطبيق العميل تنزيل البيانات من الخادم وعرضها على الشاشة.

3 ج. تحرير Dockerfile

كما في حالة الخادم ، نقوم بإنشاء ملف بسيط للعميل Dockerfile، مسؤول عن تشكيل البيئة التي سيتم فيها تشغيل تطبيق عميل Python. هذا هو رمز العميل Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. عامل الميناء يؤلف

كما ترى ، فقد أنشأنا مشروعين مختلفين: الخادم والعميل. كل واحد منهم لديه ملفه الخاص Dockerfile. حتى الآن ، كل ما يحدث لا يتجاوز أساسيات العمل مع Docker. الآن نبدأ العمل مع Docker Compose. للقيام بذلك ، راجع الملف docker-compose.ymlالموجود في المجلد الجذر للمشروع.

يرجى ملاحظة أننا هنا لا نهدف إلى تغطية جميع الأوامر التي يمكن استخدامها على الإطلاق docker-compose.yml. هدفنا الرئيسي هو تحليل مثال عملي يمنحك المعرفة الأساسية بـ Docker Compose.

هذا هو الكود المطلوب وضعه في الملف docker-compose.yml:

# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.

version: "3"

# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.

services:

  # Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
  # Это означает, что нам нужно два сервиса.
  # Первый сервис (контейнер): сервер.
  # Назвать его можно так, как нужно разработчику.
  # Понятное название сервиса помогает определить его роль.
  # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.

  server:
 
    # Ключевое слово "build" позволяет задать
    # путь к файлу Dockerfile, который нужно использовать для создания образа,
    # который позволит запустить сервис.
    # Здесь 'server/' соответствует пути к папке сервера,
    # которая содержит соответствующий Dockerfile.

    build: server/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./server.py".

    command: python ./server.py

    # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
    # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
    # мы должны организовать перенаправление этого порта на порт компьютера.
    # Сделать это нам поможет ключевое слово 'ports'.
    # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
    # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
    # 1234 контейнера (так как именно на этот порт сервер 
    # ожидает поступления запросов).

    ports:
      - 1234:1234

  # Второй сервис (контейнер): клиент.
  # Этот сервис назван 'client'.

  client:
    # Здесь 'client/ соответствует пути к папке, которая содержит
    # файл Dockerfile для клиентской части системы.

    build: client/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./client.py".
 
    command: python ./client.py

    # Ключевое слово 'network_mode' используется для описания типа сети.
    # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.

    network_mode: host

    # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
 
    depends_on:
      - server

▍5. بناء المشروع

بعد في docker-compose.yml تم إجراء جميع التعليمات اللازمة ، يحتاج المشروع إلى التجميع. هذه الخطوة من عملنا تشبه استخدام الأمر docker build، ولكن الأمر المقابل مرتبط بخدمات عديدة:

$ docker-compose build

▍6. إطلاق المشروع

الآن وقد تم بناء المشروع ، حان الوقت لتشغيله. تتوافق هذه الخطوة من عملنا مع الخطوة التي عند العمل مع الحاويات الفردية ، يتم تنفيذ الأمر docker run:

$ docker-compose up

بعد تنفيذ هذا الأمر ، يجب أن يظهر النص الذي تم تحميله بواسطة العميل من الخادم في الجهاز: Docker-Compose is magic!.

كما ذكرنا سابقًا ، يستخدم الخادم منفذ الكمبيوتر 1234 لخدمة طلبات العملاء. لذلك ، إذا ذهبت في المتصفح إلى العنوان http://localhost:1234/، سيتم عرض صفحة بها نص Docker-Compose is magic!.

أوامر مفيدة

دعنا نلقي نظرة على بعض الأوامر التي قد تجدها مفيدة عند العمل مع Docker Compose.

يتيح لك هذا الأمر إيقاف وحذف الحاويات والموارد الأخرى التي تم إنشاؤها بواسطة الأمر docker-compose up:

$ docker-compose down

يقوم هذا الأمر بطباعة سجلات الخدمة:

$ docker-compose logs -f [service name]

على سبيل المثال ، في مشروعنا يمكن استخدامه في هذا النموذج: $ docker-compose logs -f [service name].

باستخدام هذا الأمر ، يمكنك عرض قائمة الحاويات:

$ docker-compose ps

يتيح لك هذا الأمر تنفيذ أمر في حاوية قيد التشغيل:

$ docker-compose exec [service name] [command]

على سبيل المثال ، قد يبدو كالتالي: docker-compose exec server ls.

يتيح لك هذا الأمر عرض قائمة بالصور:

$ docker-compose images

نتائج

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

القراء الأعزاء! هل تستخدم Docker Compose في مشاريعك؟

دليل إنشاء Docker للمبتدئين

المصدر: www.habr.com

إضافة تعليق