Artikli autor, mille tõlke täna avaldame, ütleb, et see on mõeldud neile arendajatele, kes soovivad õppida Docker Compose'i ja kavatsevad luua oma esimest kliendi-server rakendust Dockerit kasutades. Eeldatakse, et materjali lugeja on tuttav Docker'i põhialustega. Kui see ei ole nii — võite vaadata materjalide seeriat, mis käsitleb publikatsiooni, kus käsitletakse Docker'i aluseid koos Kubernetes'e alustega, ja artiklit algajatele.
Mis on Docker Compose?
Docker Compose on tööriist, mis kuulub Docker'i komplekti. See on mõeldud projektide juurutamisega seotud ülesannete lahendamiseks.
Docker'i põhialuseid uurides võisite kokku puutuda lihtsate rakenduste loomisega, mis töötavad iseseisvalt, sõltumata näiteks välistest andmeallikatest või mõnest teenusest. Praktikas on sellised rakendused haruldased. Tõelised projektid hõlmavad tavaliselt terve komplekti koostööd tegevaid rakendusi.
Kuidas teada saada, kas teil on projekti juurutamisel vaja kasutada Docker Compose'i? Tegelikult on see väga lihtne. Kui projekti toimimiseks on vajalik mitu teenust, võib Docker Compose teile kasulik olla. Näiteks olukorras, kus luuakse veebileht, mis vajab kasutajate autentimiseks andmebaasi ühendust. Taoline projekt võib koosneda kahest teenusest – ühest, mis tagab veebilehe töö, ja teisest, mis vastutab andmebaasi toe eest.
Docker Compose tehnoloogia, kui seda lihtsustatult selgitada, võimaldab ühe käsuga käivitada mitmeid teenuseid.
Erinevus Docker'i ja Docker Compose'i vahel
Dockerit kasutatakse üksikute konteinerite (teenuste) haldamiseks, millest rakendus koosneb.
Docker Compose'i kasutatakse mitme konteineri samaaegseks haldamiseks, mis kuuluvad rakendusse. See tööriist pakub samu võimalusi nagu Docker, kuid võimaldab töötada keerukamate rakendustega.

Docker (erakonteiner) ja Docker Compose (mitu konteinerit)
Tüüpiline Docker Compose'i kasutusstsenaarium
Docker Compose — oskuslikult käsitsetuna väga võimas tööriist, mis võimaldab kiiresti juurutada rakendusi, millel on keeruline arhitektuur. Vaatame nüüd Docker Compose'i praktilise kasutamise näidet, mille analüüs aitab teil mõista selle tööriista pakutavaid eeliseid.
Kujutage ette, et olete arendaja mingisuguses veebiprojektis. See projekt hõlmab kahte veebisaiti. Esimene võimaldab ettevõtjatel vaid mõne hiireklõpsuga luua veebipoode. Teine on suunatud klienditoe pakkumisele. Need kaks veebisaiti suhtlevad sama andmebaasiga.
Teie projekt muutub üha populaarsemaks ja selgub, et serveri võimsus, millel see töötab, on juba ebapiisav. Seetõttu otsustate kogu projekti teisele masinale üle viia.
Kahjuks ei ole te midagi sellist nagu Docker Compose kasutanud. Seetõttu tuleb teil teenuseid üksikult üle viia ja seadistada, lootes, et te ei unusta midagi selle protsessi käigus.
Kui kasutate Docker Compose'i, on teie projekti üleviimine uuele serverile küsimus, mis lahendatakse mõne käsu täitmisega. Projekti uuest kohast edastamiseks peate vaid tegema mõned seadistused ja laadima uuele serverile andmebaasi varukoopia.
Kliendi-serveri rakenduse arendamine Docker Compose'i kasutamisega
Nüüd, kui teate, kuidas me kavatseme Docker Compose'i kasutada, on aeg luua teie esimene kliendi-serveri rakendus selle tööriista abil. Räägime väikese veebisaidi (serveri) arendamisest Pythonis, mis suudab edastada faili tekstilõigu kohta. Seda faili küsib serverilt programm (kliend), mis on samuti kirjutatud Pythonis. Pärast faili saamist serverilt kuvab programm tekst, mis selles on, ekraanile.
Palun märkige, et me eeldame, et teil on alused Dockerist ning et teil on juba Docker platvorm paigaldatud.
Alustame projekti kallale.
▍1. Projekti loomine
Ettevalmistamiseks, et luua oma esimest kliendi-serveri rakendust, soovitan alustada projekti kausta loomisest. See peaks sisaldama järgmisi faile ja kaustu:
- File
docker-compose.ymlSee on Docker Compose fail, mis sisaldab instruktsioone, mis on vajalikud teenuste käivitamiseks ja seadistamiseks. - Kaust
serverSee sisaldab faile, mis on vajalikud serveri toimimise tagamiseks. - Kaust
clientSiin asuvad kliendirakenduse failid.
Seega peaks teie projekti põhikausta sisu välja nägema järgmine:
.
├── client/
├── docker-compose.yml
└── server/
2 kausta, 1 fail▍2. Serveri loomine
Siin käsitleme serveri loomise ajal mõningaid põhiaspekte, mis on seotud Dockeriga.
2a. Failide loomine
Liikuge kausta server ja looge sinna järgmised failid:
- File
server.pySeal on serveri kood. - File
index.htmlSelles failis on tekstifragmendid, mida kliendirakendus peab kuvama. - File
DockerfileSee on Docker fail, mis sisaldab instruktsioone, mis on vajalikud serveri keskkonna loomiseks.
Nii peaks teie kausta sisu välja nägema: server/:
.
├── Dockerfile
├── index.html
└── server.py
0 kausta, 3 faili2b. Python-faili redigeerimine.
Lisame failile server.py järgneva koodi:
#!/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() See kood võimaldab luua lihtsa veebiserveri. See edastab klientidele faili index.html, mille sisu kuvatakse hiljem veebilehel.
2c. HTML-faili redigeerimine
Faili index.html lisa järgmine tekst:
Docker-Compose on maagia!See tekst edastatakse kliendile.
2d. Dockerfile'i redigeerimine
Nüüd loome lihtsa faili Dockerfile, mis vastutab Python-serveri tööks vajalikku keskkonda korraldamise eest. Aluseks võtame , mis on mõeldud Pythonis kirjutatud programmide käitamiseks. Siin on Dockerfile'i sisu:
# На всякий случай напоминаю, что 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/Nüüd hakkame tööle kliendi kallal.
▍3. Kliendi loomine
Kliendi poole loomisel meenutame mõningaid Docker'i aluseid.
3a. Failide loomine
Mine oma projekti kausta client ja looge sinna järgmised failid:
- File
client.py. Siin asub kliendi kood. - File
Dockerfile. See fail mängib samu rolle nagu analoogne fail serverikaustas. Nimelt sisaldab see juhist, mis kirjeldab keskkonna loomist kliendikoodi käitamiseks.
Seega peaks teie kaust client/ selle tööetapi lõpus välja nägema nii:
.
├── client.py
└── Dockerfile
0 katalooge, 2 faili3b. Python-faili redigeerimine
Lisame failile client.py järgneva koodi:
#!/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()Selle koodi abil saab klientrakendus laadida serverist andmeid ja kuvada need ekraanile.
3c. Dockerfile'i redigeerimine
Nii nagu serveri puhul, loome kliendile lihtsa Dockerfile, mis on vastutav keskkonna loomise eest, kus klientrakendus Pythonis töötab. Siin on kood klientrakenduse Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Kuidas olete võinud märgata, oleme loonud kaks erinevat projekti: сервер ja клиент. Igal neist on oma fail Dockerfile. Siiani ei ole kõik toimunud Dockeriga töötamise põhialuste raames. Nüüd hakkame töötama Docker Compose'iga. Selleks vaatame faili, docker-compose.yml, mis asub projekti juurkaustas.
Pange tähele, et me ei püüa käsitleda kõiki käske, mida võib kasutada docker-compose.yml. Meie peamine eesmärk on arutada praktilist näidet, mis annab teile Docker Compose'i põhiteadmised.
Siin on kood, mida tuleb paigutada faili 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. Projekti kogumine
Pärast seda, kui kõik vajalikud juhised on failis docker-compose.yml , peab projekt olema kokku pandud. See samm meie töös sarnaneb käsu kasutamisega docker build, kuid vastav käsk puudutab mitut teenust:
$ docker-compose build▍6. Projekti käivitamine
Nüüd, kui projekt on valmis, on aeg see käivitada. See samm meie töös vastab samale, mis toimub eraldi konteineritega töötades, kui käivitatakse käsk. docker run:
$ docker-compose up Pärast selle käsu täitmist peaks terminalis ilmuma tekst, mille klient serverist laadis: Docker-Compose on maagia!.
Nagu juba mainitud, kasutab server arvuti porti 1234 klientide päringute teenindamiseks. Seega, kui minna brauseriga aadressile , kuvatakse seal tekstiga leht. Docker-Compose on maagia!.
Kasulikud käsud
Vaatame mõningaid käske, mis võivad teile olla kasulikud Docker Compose'i kasutamisel.
See käsk võimaldab peatada ja eemaldada konteinerid ning muud ressursid, mille genereeris käsk docker-compose up:
$ docker-compose downSee käsk väljastab teenuste logid:
$ docker-compose logs -f [teenuse nimi] Näiteks saab seda meie projektis kasutada järgmiselt: $ docker-compose logs -f [teenuse nimi].
Selle käsu abil saab kuvada konteinerite nimekirja:
$ docker-compose psSee käsk võimaldab käivitada käsu töötavas konteineris:
$ docker-compose exec [teenuse nimi] [käsk] Näiteks võib see välja näha järgmine: docker-compose exec server ls.
See käsk võimaldab kuvada saadaval olevaid pilte:
$ docker-compose imagesKokkuvõte
Oleme tutvunud Docker Compose'i töötamise aluspõhimõtetega, teadmised, mis võimaldavad teil seda tehnoloogiat kasutada ja vajadusel alustada selle sügavamate aspektide õppimist. projekti koodihoidla, mida me siin käsitlesime.
Lugupidamisega lugejad! Kas kasutate Docker Compose'i oma projektides?
Allikas: habr.com
