מדריך למתחילים ל-Docker Compose

מחבר המאמר, שאת תרגומו אנו מפרסמים היום, אומר שהוא מיועד לאותם מפתחים שרוצים ללמוד Docker Compose ומתקדמים לקראת יצירת יישום שרת-לקוח ראשון באמצעות Docker. ההנחה היא שהקורא של חומר זה מכיר את היסודות של Docker. אם זה לא המקרה, אתה יכול להסתכל על זה סדרת חומרים על זה פוסט המכסה את יסודות Docker יחד עם יסודות Kubernetes, ו זה מאמר למתחילים.

מדריך למתחילים ל-Docker Compose

מה זה Docker Compose?

Docker Compose הוא כלי הכלול ב- Docker. הוא נועד לפתור בעיות הקשורות לפריסת הפרויקט.

בזמן שלמדת את היסודות של Docker, ייתכן שנתקלת ביצירה של יישומים פשוטים שפועלים באופן אוטונומי ואינם תלויים, למשל, במקורות נתונים חיצוניים או בשירותים מסוימים. בפועל, יישומים כאלה הם נדירים. פרויקטים אמיתיים כוללים בדרך כלל מערך שלם של יישומים הפועלים יחד.

איך אתה יודע אם אתה צריך להשתמש ב-Docker Compose בעת פריסת פרויקט? זה בעצם מאוד פשוט. אם אתה משתמש במספר שירותים כדי לגרום לפרויקט הזה לעבוד, Docker Compose עשוי להיות שימושי. למשל, במצב שהם יוצרים אתר שצריך להתחבר למסד נתונים על מנת לאמת משתמשים. פרויקט כזה עשוי להיות מורכב משני שירותים - זה המבטיח את תפעול האתר, וזה שאחראי על תחזוקת מאגר המידע.

טכנולוגיית Docker Compose, כדי לתאר אותה בצורה פשוטה, מאפשרת לך להפעיל שירותים רבים בפקודה אחת.

ההבדל בין Docker ל- Docker Compose

Docker משמש לניהול הקונטיינרים (השירותים) הבודדים המרכיבים אפליקציה.

Docker Compose משמש לניהול בו זמנית של קונטיינרים מרובים המרכיבים אפליקציה. כלי זה מציע את אותן יכולות כמו Docker, אך מאפשר לך לעבוד עם יישומים מורכבים יותר.

מדריך למתחילים ל-Docker Compose
Docker (מיכל יחיד) ו-Docker Compose (מיכלים מרובים)

מקרה שימוש טיפוסי עבור Docker Compose

Docker Compose הוא, בידיים הנכונות, כלי חזק מאוד המאפשר לך לפרוס במהירות רבה יישומים עם ארכיטקטורות מורכבות. כעת נסתכל על דוגמה לשימוש מעשי ב- Docker Compose, שניתוחה יאפשר לכם להעריך את היתרונות שהשימוש ב- Docker Compose ייתן לכם.

תאר לעצמך שאתה מפתח של פרויקט אינטרנט. פרויקט זה כולל שני אתרי אינטרנט. הראשון מאפשר לאנשי עסקים ליצור חנויות מקוונות בכמה קליקים בלבד. השני מכוון לתמיכת לקוחות. שני אתרים אלה מקיימים אינטראקציה עם אותו מסד נתונים.

הפרויקט שלכם הופך ליותר ויותר פופולרי, ומסתבר שהכוח של השרת עליו הוא פועל כבר לא מספיק. כתוצאה מכך, אתה מחליט להעביר את כל הפרויקט למכונה אחרת.

למרבה הצער, לא השתמשת במשהו כמו Docker Compose. לכן, תצטרך להעביר ולהגדיר מחדש שירותים אחד בכל פעם, בתקווה שלא תשכח שום דבר בתהליך.

אם אתה משתמש ב-Docker Compose, העברת הפרויקט שלך לשרת חדש היא עניין שניתן לפתור על ידי הפעלת כמה פקודות. על מנת להשלים את העברת הפרויקט למקום חדש, צריך רק לבצע כמה הגדרות ולהעלות עותק גיבוי של מסד הנתונים לשרת החדש.

פיתוח יישום שרת-לקוח באמצעות Docker Compose

עכשיו כשאתה יודע למה אנחנו הולכים להשתמש ב-Docker Compose, הגיע הזמן ליצור את יישום שרת-לקוח הראשון שלך באמצעות הכלי הזה. כלומר, אנחנו מדברים על פיתוח אתר קטן (שרת) ב-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ב. עריכת קובץ Python.

הוסף לקובץ 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ב. עריכת קובץ Python

הוסף לקובץ 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. Docker Compose

כפי שאולי שמתם לב, יצרנו שני פרויקטים שונים: שרת ולקוח. לכל אחד מהם יש קובץ משלו 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 Compose

מקור: www.habr.com

הוספת תגובה