Հոդվածի հեղինակը, որի թարգմանությունը հրապարակում ենք այսօր, ասում է, որ այն նախատեսված է այն ծրագրավորողների համար, ովքեր ցանկանում են սովորել Docker Compose և շարժվում են դեպի Docker-ի միջոցով իրենց առաջին հաճախորդ-սերվեր հավելվածի ստեղծմանը։ Ենթադրվում է, որ այս նյութի ընթերցողը ծանոթ է Docker-ի հիմունքներին։ Եթե դա այդպես չէ, կարող եք դիտել
Ի՞նչ է Docker Compose-ը:
Docker Compose-ը Docker-ի հետ ներառված գործիք է: Այն նախատեսված է ծրագրի տեղակայման հետ կապված խնդիրները լուծելու համար:
Docker-ի հիմունքները սովորելիս դուք կարող եք հանդիպել պարզ հավելվածների ստեղծմանը, որոնք աշխատում են ինքնուրույն և կախված չեն, օրինակ, տվյալների արտաքին աղբյուրներից կամ որոշակի ծառայություններից: Գործնականում նման դիմումները հազվադեպ են: Իրական նախագծերը սովորաբար ներառում են մի ամբողջ շարք հավելվածներ, որոնք աշխատում են միասին:
Ինչպե՞ս գիտեք, որ նախագիծը տեղակայելիս անհրաժեշտ է օգտագործել Docker Compose-ը: Դա իրականում շատ պարզ է: Եթե այս նախագիծն աշխատեցնելու համար օգտագործում եք բազմաթիվ ծառայություններ, ապա Docker Compose-ը կարող է օգտակար լինել: Օրինակ, մի իրավիճակում, երբ նրանք ստեղծում են վեբկայք, որը պետք է միանա տվյալների շտեմարանին՝ օգտատերերի իսկությունը հաստատելու համար: Նման նախագիծը կարող է բաղկացած լինել երկու ծառայություններից՝ այն, որն ապահովում է կայքի աշխատանքը, և այն, որը պատասխանատու է տվյալների բազայի պահպանման համար։
Docker Compose տեխնոլոգիան, այն պարզեցված ձևով նկարագրելու համար, թույլ է տալիս գործարկել բազմաթիվ ծառայություններ մեկ հրամանով:
Տարբերությունը Docker-ի և Docker Compose-ի միջև
Docker-ն օգտագործվում է հավելվածը կազմող առանձին բեռնարկղերի (ծառայությունների) կառավարման համար:
Docker Compose-ն օգտագործվում է հավելվածը կազմող բազմաթիվ կոնտեյներներ միաժամանակ կառավարելու համար: Այս գործիքն առաջարկում է նույն հնարավորությունները, ինչ 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բ. 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
, որի բովանդակությունը հետագայում կցուցադրվի վեբ էջում։
2c. HTML ֆայլի խմբագրում
Ներկայացնելու համար index.html
ավելացնել հետևյալ տեքստը.
Docker-Compose is magic!
Այս տեքստը կուղարկվի հաճախորդին:
2դ. Dockerfile-ի խմբագրում
Այժմ մենք կստեղծենք պարզ ֆայլ Dockerfile
, ով պատասխանատու կլինի Python սերվերի համար գործարկման միջավայրի կազմակերպման համար։ Որպես ստեղծված պատկերի հիմք՝ մենք կօգտագործենք
# На всякий случай напоминаю, что 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()
Այս կոդով հաճախորդի հավելվածը կարող է տվյալներ ներբեռնել սերվերից և ցուցադրել դրանք էկրանին:
3c. 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
սպասարկել հաճախորդների պահանջները: Հետեւաբար, եթե դուք գնում եք ձեր բրաուզերի հասցեին 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-ը ձեր նախագծերում:
Source: www.habr.com