Udhëzuesi për Docker Compose për fillestarët

Autori i artikullit që po botojmë sot thotë se ai është për ata zhvillues që dëshirojnë të studiojnë Docker Compose dhe po shkojnë për të krijuar aplikacionin e tyre të parë klient-server duke përdorur Docker. Supozohet se lexuesi i këtij materiali është i njohur me bazat e Docker. Nëse nuk është kështu — mund të shikoni në artikull. serinë e materialeve, në artikull. publikimin, ku bazat e Docker trajtohen së bashku me bazat e Kubernetes, dhe në artikull. artikullin për fillestarët.

Udhëzuesi për Docker Compose për fillestarët

Çfarë është Docker Compose?

Docker Compose është një mjet që bën pjesë në Docker. Ai është projektuar për të zgjidhur problemet që lidhen me shpërndarjen e projekteve.

Duke studiuar bazat e Docker, keni mundur të përballeni me krijimin e aplikacioneve më të thjeshta, të cilat funksionojnë autonomisht, pa u varur, për shembull, nga burime të jashtme të të dhënave ose nga disa shërbime. Në praktikë, megjithatë, aplikacione të tillë janë të rralla. Projektet reale zakonisht përfshijnë një grup të tërë aplikacionesh që punojnë së bashku.

Si mund ta dini nëse ju nevojitet, në shpërndarjen e një projekti, të përdorni Docker Compose? Në të vërtetë — është shumë e thjeshtë. Nëse për të siguruar funksionimin e këtij projekti përdoren disa shërbime, atëherë Docker Compose mund t'ju vijë në ndihmë. Për shembull, në situatën kur krijohet një faqe interneti, e cila, për të realizuar autenticimin e përdoruesve, duhet të lidhet me një bazë të dhënash. Një projekt i tillë mund të përbëhet nga dy shërbime — ai që siguron funksionimin e faqes dhe ai që merret me mbështetje të bazës së të dhënave.

Technologjia Docker Compose, nëse e përshkruani thjesht, lejon, përmes një komande, të filloni shumë shërbime.

Dallimi midis Docker dhe Docker Compose

Docker përdoret për të menaxhuar konteiner të veçantë (shërbime), nga të cilat përbëhet aplikacioni.

Docker Compose përdoret për menaxhimin e përbashkët të disa konteinerëve që janë pjesë e aplikacionit. Ky mjet ofron të njëjtat mundësi si Docker, por lejon të punoni me aplikacione më të ndërlikuara.

Udhëzuesi për Docker Compose për fillestarët
Docker (konteiner i veçantë) dhe Docker Compose (shumë konteinerë)

Një skenar tipik i përdorimit të Docker Compose

Docker Compose është një mjet shumë i fuqishëm, në duar të zotit, që lejon zhvendosjen e shpejtë të aplikacioneve me arkitekturë komplekse. Tani do të shqyrtojmë një shembull praktik të përdorimit të Docker Compose, një analizë që do t'ju ndihmojë të vlerësoni përfitimet që do t'ju sjellë përdorimi i Docker Compose.

Imagjinoni se jeni një zhvillues i një projekti web. Ky projekt përfshin dy faqe web. E para u lejon individëve të angazhuar në biznes të krijojnë, me disa klikime të thjeshta, dyqane online. E dyta është e fokusuar në mbështetje për klientët. Këto dy faqe ndërveprojnë me të njëjtën bazë të dhënash.

Projekti juaj bëhet gjithnjë e më i njohur, dhe rezulton se kapaciteti i serverit në të cilin po funksionon nuk është më i mjaftueshëm. Si rezultat, vendosni ta transferoni të gjithë projektin në një makinë tjetër.

Fatkeqësisht, nuk e keni përdorur diçka si Docker Compose. Prandaj do t'ju duhet të transferoni dhe konfiguroni shërbimet një nga një, duke shpresuar se gjatë këtij procesi nuk do të harroni asgjë.

Nëse përdorni Docker Compose, atëherë transferimi i projektit tuaj në një server të ri është një çështje që zgjidhet me disa komanda. Për të përfunduar transferimin e projektit në vendin e ri, duhet vetëm të bëni disa konfigurime dhe të ngarkoni një kopje rezervë të bazës së të dhënave në serverin e ri.

Zhvillimi i një aplikacioni klient-server duke përdorur Docker Compose

Tani që dini se për çfarë do të përdorim Docker Compose, ka ardhur koha të krijoni aplikacionin tuaj të parë klient-server duke përdorur këtë mjet. Këtu flasim për zhvillimin e një website të vogël (server) në Python, i cili është në gjendje të ofrojë një skedar me një fragment teksti. Ky skedar kërkohet nga një program (klient), gjithashtu i shkruar në Python. Pasi të merrni skedarin nga serveri, programi shfaq tekstin që përmban ai në ekran.

Kujdes, ne presim që ju të keni njohuri bazike për Docker dhe që platforma Docker është tashmë e instaluar.

Le të fillojmë punën mbi projektin.

▍1. Krijimi i projektit

Për të ndërtuar aplikacionin tuaj të parë klient-server, propozoj të filloni duke krijuar një dosje projekti. Ajo duhet të përmbajë këta skedarë dhe dosje:

  • Skeda docker-compose.yml. Ky është një skedar Docker Compose që do të përmbajë udhëzimet e nevojshme për të nisur dhe konfiguruar shërbimet.
  • Dosja server. Ajo do të përmbajë skedarët e nevojshëm për të siguruar funksionimin e serverit.
  • Dosja client. Këtu do të jenë skedarët e aplikacionit klient.

Si rezultat, përmbajtja e dosjes kryesore të projektit tuaj duhet të duket kështu:

.
├── client/
├── docker-compose.yml
└── server/
2 dosje, 1 skedar

▍2. Krijimi i serverit

Këtu, gjatë procesit të krijimit të serverit, do të përmendim disa gjëra bazike në lidhje me Docker.

2a. Krijimi i skedarëve

dhe nisni aplikacionin me komandën në vazhdim: server dhe krijoni në të skedarët e mëposhtëm:

  • Skeda server.py. Në të do të jetë kodi i serverit.
  • Skeda index.html. Në këtë skedar do të jetë një fragment teksti që aplikacioni klient duhet ta japë.
  • Skeda Dockerfile. Ky është një skedar Docker që do të përmbajë udhëzimet e nevojshme për krijimin e ambientit të serverit.

Ja si duhet të duket përmbajtja e dosjes suaj server/:

.
├── Dockerfile
├── index.html
└── server.py
0 dosje, 3 skedarë

2b. Rregullimi i skedarit Python.

Do të shtojmë në skedarin server.py kodi i mëposhtëm:

#!/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()

Ky kod lejon krijimin e një serveri të thjeshtë në web. Ai do të dorëzojë klientëve skedarin index.html, përmbajtja e të cilit do të shfaqet më vonë në faqen e internetit.

2c. Rregullimi i skedarit HTML

Në skedarin index.html do të shtojmë tekstin e mëposhtëm:

Docker-Compose është magji!

Ky tekst do t'i dërgohet klientit.

2d. Rregullimi i skedarit Dockerfile

Tani do të krijojmë një skedar të thjeshtë Dockerfile, i cili do të kujdeset për organizimin e ambientit ekzekutues për serverin Python. Si bazë për imazhin që do të krijojmë do të përdorim imazhin zyrtar, i destinuar për ekzekutimin e programeve të shkruara në Python. Ja përmbajtja e 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/

Tani do të fillojmë punën mbi klientin.

▍3. Krijimi i klientit

Duke krijuar pjesën klient të projektit tonë, ne do të rikujtojmë disa parime bazike të Docker.

3a. Krijimi i skedarëve

Shkoni në dosjen e projektit tuaj client dhe krijoni në të skedarët e mëposhtëm:

  • Skeda client.py. Këtu do të jetë kodi i klientit.
  • Skeda Dockerfile. Ky skedar kryen të njëjtën rol si skedari i ngjashëm në dosjen e serverit. Në veçanti, ai përmban udhëzimin që përshkruan krijimin e ambientit për ekzekutimin e kodit të klientit.

Si rezultat, dosja juaj client/ në këtë fazë të punës duhet të duket kështu:

.
├── client.py
└── Dockerfile
0 dosje, 2 skedarë

3b. Rregullimi i skedarit Python

Do të shtojmë në skedarin client.py kodi i mëposhtëm:

#!/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()

Me këtë kod, aplikacioni klient mund të ngarkojë të dhëna nga serveri dhe t'i shfaqë ato në ekran.

3c. Rregullimi i skedarit Dockerfile

Si dhe në rastin e serverit, ne krijojmë për klientin një skedar të thjeshtë Dockerfile, përgjegjës për formimin e mjedisit ku do të funksionojë aplikacioni klient Python. Këtu është kodi i klientit Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Siç mund të keni vënë re, ne kemi krijuar dy projekte të ndryshme: serveri dhe klienti. Çdo njëri prej tyre ka skedarin e tij Dockerfile. Deri tani, gjithçka që ka ndodhur përputhet me bazat e punës me Docker. Tani, ne fillojmë të punojmë me Docker Compose. Për këtë, ne do të shohim skedarin docker-compose.yml, i vendosur në dosjen rrënjësore të projektit.

Vini re se këtu ne nuk synojmë të shqyrtojmë absolutisht të gjitha komandat që mund të përdoren në docker-compose.yml. Qëllimi ynë kryesor është të shqyrtojmë një shembull praktik që do t'ju japë njohuri bazike mbi Docker Compose.

Këtu është kodi që duhet të vendosni në skedarin 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. Ndërtimi i projektit

Pas përditësimit të docker-compose.yml me të gjitha udhëzimet e nevojshme, projekti duhet të ndërtohet. Ky hap i punës sonë përngjan me përdorimin e komandës docker build, por komanda përkatëse ka lidhje me disa shërbime:

$ docker-compose build

▍6. Aktivizimi i projektit

Tani që projekti është ndërtuar, është koha për ta aktivizuar. Ky hap i punës sonë përkon me hapin, kur punojmë me konteinerë të veçantë, ku ekzekutohet komanda docker run:

$ docker-compose up

Pas ekzekutimit të kësaj komande, në terminal duhet të shfaqet teksti i ngarkuar nga klienti nga serveri: Docker-Compose është magji!.

Siç është thënë më parë, serveri përdor portin e kompjuterit 1234 për të shërbyer kërkesat e klientit. Prandaj, nëse kaloni në shfletues me adresën http://localhost:1234/, do të shfaqet një faqe me tekstin Docker-Compose është magji!.

Komandat e dobishme

Le të shqyrtojmë disa komanda që mund t'ju nevojiten gjatë punës me Docker Compose.

Kjo komandë lejon ndalimin dhe heqjen e konteinerëve dhe burimeve të tjera të krijuara nga komanda docker-compose up:

$ docker-compose down

Kjo komandë shfaq regjistrat e shërbimeve:

$ docker-compose logs -f [emri i shërbimit]

Për shembull, në projektin tonë mund ta përdorim atë në këtë mënyrë: $ docker-compose logs -f [emri i shërbimit].

Me këtë komandë mund të shfaqim një listë të konteinerëve:

$ docker-compose ps

Kjo komandë lejon ekzekutimin e një komande në një konteiner aktiv:

$ docker-compose exec [emri i shërbimit] [komanda]

Për shembull, ajo mund të duket kështu: docker-compose exec server ls.

Kjo komandë lejon shfaqjen e një liste të imazheve:

$ docker-compose images

Përfundime

Ne shqyrtuam bazat e punës me teknologjinë Docker Compose, njohja e së cilës do t'ju lejojë të shfrytëzoni këtë teknologji dhe, nëse dëshironi, të filloni studimin e saj më të thellë. Ja repo me kodin e projektit që ne kemi shqyrtuar këtu.

Të nderuar lexues! A përdorni Docker Compose në projektet tuaja?

Udhëzuesi për Docker Compose për fillestarët

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster