Дастур барои шурӯъкунандагон оид ба 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 сухан меронем, ки метавонад файлро бо порчаи матн барорад. Ин файл аз сервер аз ҷониби барнома (мизоҷ), ки дар 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г. Таҳрири файли Docker

Акнун мо як файли оддӣ эҷод мекунем 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()

Бо ин код, барномаи муштарӣ метавонад маълумотро аз сервер зеркашӣ кунад ва дар экран намоиш диҳад.

3c. Таҳрири файли Docker

Тавре ки дар мавриди сервер, мо оддӣ эҷод 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

Манбаъ: will.com

Илова Эзоҳ