Docker Compose Udhëzues për fillestarët

Autori i artikullit, të cilin po e publikojmë sot, thotë se ai është menduar për ata zhvillues që duan të mësojnë Docker Compose dhe janë në rrugën e tyre 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'i hidhni një sy kjo seri materialesh kjo një postim që mbulon bazat e Docker së bashku me bazat e Kubernetes, dhe kjo artikull për fillestarët.

Docker Compose Udhëzues për fillestarët

Çfarë është Docker Compose?

Docker Compose është një mjet i përfshirë me Docker. Ai është krijuar për të zgjidhur problemet që lidhen me vendosjen e projektit.

Ndërsa mësoni bazat e Docker, mund të keni hasur në krijimin e aplikacioneve më të thjeshta që funksionojnë në mënyrë autonome, pa u varur, për shembull, nga burimet e jashtme të të dhënave ose nga shërbime të caktuara. Në praktikë, aplikime të tilla janë të rralla. Projektet reale zakonisht përfshijnë një grup të tërë aplikacionesh bashkëpunuese.

Si e dini nëse keni nevojë të përdorni Docker Compose kur vendosni një projekt? Në fakt, është shumë e thjeshtë. Nëse përdorni shumë shërbime për ta bërë këtë projekt të funksionojë, atëherë Docker Compose mund të jetë i dobishëm. Për shembull, në një situatë ku ata krijojnë një faqe interneti që duhet të lidhet me një bazë të dhënash në mënyrë që të vërtetojë përdoruesit. Një projekt i tillë mund të përbëhet nga dy shërbime - ai që siguron funksionimin e sitit dhe ai që është përgjegjës për mirëmbajtjen e bazës së të dhënave.

Teknologjia Docker Compose, nëse e përshkruajmë në mënyrë të thjeshtuar, lejon, me ndihmën e një komande, të fillojë shumë shërbime.

Dallimi midis Docker dhe Docker Compose

Docker përdoret për të menaxhuar kontejnerët (shërbimet) individuale që përbëjnë një aplikacion.

Docker Compose përdoret për të menaxhuar kontejnerë të shumtë që janë pjesë e një aplikacioni në të njëjtën kohë. Ky mjet ofron të njëjtat veçori si Docker, por ju lejon të punoni me aplikacione më komplekse.

Docker Compose Udhëzues për fillestarët
Docker (kontejner i vetëm) dhe Docker Compose (kontejnerë të shumtë)

Rasti tipik i përdorimit të Docker Compose

Docker Compose është, në duart e duhura, një mjet shumë i fuqishëm që ju lejon të vendosni shpejt aplikacione me arkitektura komplekse. Tani do të shikojmë një shembull të përdorimit praktik të Docker Compose, analiza e të cilit do t'ju lejojë të vlerësoni përfitimet që do t'ju japë përdorimi i Docker Compose.

Imagjinoni që jeni zhvilluesi i një projekti në internet. Ky projekt përfshin dy faqe interneti. E para i lejon njerëzit e biznesit të krijojnë, vetëm me disa klikime të mausit, dyqane online. E dyta ka për qëllim mbështetjen e klientit. Këto dy faqe ndërveprojnë me të njëjtën bazë të dhënash.

Projekti juaj po bëhet gjithnjë e më popullor dhe rezulton se fuqia e serverit në të cilin funksionon nuk është më e mjaftueshme. Si rezultat, ju vendosni të transferoni të gjithë projektin në një makinë tjetër.

Fatkeqësisht, nuk keni përdorur diçka si Docker Compose. Prandaj, do t'ju duhet të migroni dhe rikonfiguroni shërbimet një nga një, duke shpresuar se nuk do të harroni asgjë në procesin e kësaj pune.

Nëse jeni duke përdorur Docker Compose, atëherë migrimi i projektit tuaj në një server të ri është një problem që mund të zgjidhet duke ekzekutuar disa komanda. Për të përfunduar transferimin e projektit në një vend të ri, ju duhet vetëm të bëni disa cilësime 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ë e dini se për çfarë do të përdorim Docker Compose, është koha për të krijuar aplikacionin tuaj të parë klient/server duke përdorur këtë mjet. Domethënë, po flasim për zhvillimin e një uebsajti të vogël (server) në Python, i cili mund të prodhojë një skedar me një fragment teksti. Ky skedar kërkohet nga serveri nga një program (klient), i shkruar gjithashtu në Python. Pas marrjes së skedarit nga serveri, programi shfaq në ekran tekstin e ruajtur në të.

Ju lutemi vini re se ne po supozojmë se ju keni bazat e Docker dhe se tashmë keni të instaluar platformën Docker.

Le të fillojmë të punojmë për projektin.

▍1. Krijo një projekt

Për të ndërtuar aplikacionin tuaj të parë klient/server, ju sugjeroj të filloni duke krijuar një dosje projekti. Ai duhet të përmbajë skedarët dhe dosjet e mëposhtme:

  • skedar 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.
  • Dosje server. Ai do të përmbajë skedarët e nevojshëm për të funksionuar serverin.
  • Dosje client. Këtu do të vendosen skedarët e aplikacionit të klientit.

Si rezultat, përmbajtja e dosjes kryesore të projektit tuaj duhet të duket si kjo:

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

▍2. Krijimi i serverit

Këtu ne, në procesin e krijimit të një serveri, do të prekim disa gjëra themelore në lidhje me Docker.

2a. Krijimi i skedarëve

Shkoni te dosja server dhe krijoni skedarët e mëposhtëm në të:

  • skedar server.py. Ai do të përmbajë kodin e serverit.
  • skedar index.html. Ky skedar do të përmbajë një pjesë të tekstit që aplikacioni i klientit duhet të shfaqë.
  • skedar Dockerfile. Ky është skedari Docker që do të përmbajë udhëzimet e nevojshme për të krijuar mjedisin e serverit.

Kështu duhet të duket përmbajtja e dosjes suaj server/:

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

2b. Redaktimi i një skedari Python.

Shto në skedar server.py kodin e 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 ju lejon të krijoni një server të thjeshtë në internet. Ai do t'u japë klientëve një dosje index.html, përmbajtja e së cilës do të shfaqet më vonë në faqen e internetit.

2c. Redaktimi i një skedari HTML

Për të paraqitur index.html shtoni tekstin e mëposhtëm:

Docker-Compose is magic!

Ky tekst do t'i dërgohet klientit.

2d. Redaktimi i skedarit Docker

Tani do të krijojmë një skedar të thjeshtë Dockerfile, i cili do të jetë përgjegjës për organizimin e mjedisit të funksionimit për serverin Python. Si bazë e imazhit të krijuar, ne do të përdorim zyrtarisht, i krijuar për të ekzekutuar programe të shkruara në Python. Këtu është 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 le të punojmë me klientin.

▍3. Krijo një klient

Ndërsa krijojmë anën e klientit të projektit tonë, ne do të kujtojmë disa baza të Docker gjatë rrugës.

3a. Krijimi i skedarëve

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

  • skedar client.py. Këtu do të jetë kodi i klientit.
  • skedar Dockerfile. Ky skedar luan të njëjtin rol si një skedar i ngjashëm në dosjen e serverit. Përkatësisht, ai përmban një deklaratë që përshkruan se si të krijohet një mjedis për ekzekutimin e kodit të klientit.

Si rezultat, dosja juaj client/ Në këtë fazë duhet të duket kështu:

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

3b. Redaktimi i një skedari Python

Shto në skedar client.py kodin e 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 i klientit mund të shkarkojë të dhëna nga serveri dhe t'i shfaqë ato në ekran.

3c. Redaktimi i skedarit Docker

Ashtu si në rastin e serverit, ne krijojmë për klientin një të thjeshtë Dockerfile, përgjegjës për formimin e mjedisit në të cilin do të ekzekutohet aplikacioni i klientit 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 ta shihni, ne kemi krijuar dy projekte të ndryshme: server dhe klient. Secila prej tyre ka dosjen e vet Dockerfile. Deri më tani, gjithçka që ndodh nuk shkon përtej bazave të punës me Docker. Tani fillojmë të punojmë me Docker Compose. Për ta bërë këtë, referojuni skedarit docker-compose.ymlndodhet në dosjen rrënjë të projektit.

Ju lutemi vini re se këtu ne nuk synojmë të mbulojmë absolutisht të gjitha komandat që mund të përdoren docker-compose.yml. Qëllimi ynë kryesor është të zbërthejmë një shembull praktik që ju jep njohuri themelore të Docker Compose.

Këtu është kodi për të vendosur në skedar 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 në docker-compose.yml janë bërë të gjitha udhëzimet e nevojshme, projekti duhet të montohet. Ky hap i punës sonë i ngjan përdorimit të komandës docker build, por komanda përkatëse lidhet me disa shërbime:

$ docker-compose build

▍6. Nisja e projektit

Tani që projekti është ndërtuar, është koha për ta ekzekutuar atë. Ky hap i punës sonë korrespondon me hapin në të cilin, kur punoni me kontejnerë individualë, ekzekutohet komanda docker run:

$ docker-compose up

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

Siç është përmendur tashmë, serveri përdor portën e kompjuterit 1234 për të shërbyer kërkesat e klientëve. Prandaj, nëse shkoni në shfletues në adresën http://localhost:1234/, do të shfaqë një faqe me tekst Docker-Compose is magic!.

Komandat e dobishme

Le të hedhim një vështrim në disa nga komandat që mund t'ju duken të dobishme kur punoni me Docker Compose.

Kjo komandë ju lejon të ndaloni dhe fshini kontejnerët dhe burimet e tjera të krijuara nga komanda docker-compose up:

$ docker-compose down

Kjo komandë printon regjistrat e shërbimit:

$ docker-compose logs -f [service name]

Për shembull, në projektin tonë mund të përdoret në këtë formë: $ docker-compose logs -f [service name].

Me këtë komandë, ju mund të shfaqni një listë të kontejnerëve:

$ docker-compose ps

Kjo komandë ju lejon të ekzekutoni një komandë në një kontejner që funksionon:

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

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

Kjo komandë ju lejon të shfaqni një listë të imazheve:

$ docker-compose images

Rezultatet e

Ne kemi mbuluar bazat e punës me teknologjinë Docker Compose, njohja e së cilës do t'ju lejojë të përdorni këtë teknologji dhe, nëse dëshironi, të filloni ta studioni atë më në thellësi. Këtu depo me kodin e projektit, të cilin e kemi shqyrtuar këtu.

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

Docker Compose Udhëzues për fillestarët

Burimi: www.habr.com

Shto një koment