Raksta autors, kura tulkojumu mēs šodien publicējam, saka, ka tas ir paredzēts tiem izstrādātājiem, kuri vēlas apgūt Docker Compose un cenšas izveidot savu pirmo klient-servera lietojumprogrammu, izmantojot Docker. Tiek pieņemts, ka šī materiāla lasītājs ir iepazinies ar Docker pamatiem. Ja tā nav, varat apskatīt materiālu sēriju, kā arī publikāciju, kurā Docker pamati ir aplūkoti kopā ar Kubernetes pamatiem, un rakstu iesācējiem.
Kas ir Docker Compose?
Docker Compose ir rīks, kas ir daļa no Docker. Tas paredzēts projektu izvietošanas uzdevumu risināšanai.
Mācoties Docker pamatus, jūs varējāt saskarties ar vienkāršu lietojumprogrammu izveidi, kas darbojas patstāvīgi, nepaļaujoties, piemēram, uz ārējiem datu avotiem vai pakalpojumiem. Tomēr praksē šādas lietojumprogrammas ir retums. Reāli projekti parasti ietver veselu kopumu savstarpēji sadarbojošos lietojumprogrammu.
Kā noskaidrot, vai jums darba projekta izvietošanā ir nepieciešams izmantot Docker Compose? Patiesībā — tas ir ļoti vienkārši. Ja projekta darbībai tiek izmantoti daudzi pakalpojumi, tad Docker Compose var būt noderīgs. Piemēram, situācijā, kad tiek izveidota tīmekļa vietne, kurai, lai nodrošinātu lietotāju autentifikāciju, nepieciešams pieslēgties datu bāzei. Šāds projekts var sastāvēt no diviem pakalpojumiem — no tā, kas nodrošina vietnes darbību, un no tā, kas atbild par datu bāzes atbalstu.
Docker Compose tehnoloģija, ja vienkārši to apraksta, ļauj ar vienu komandu palaist daudzas pakalpojumu.
Atšķirība starp Docker un Docker Compose
Docker tiek izmantots, lai pārvaldītu atsevišķus konteinerus (pakalpojumus), no kuriem sastāv lietojumprogramma.
Docker Compose tiek izmantots, lai vienlaicīgi pārvaldītu vairākus konteinerus, kas ir daļa no lietojumprogrammas. Šis rīks piedāvā tās pašas iespējas kā Docker, taču ļauj strādāt ar sarežģītākām lietojumprogrammām.

Docker (atsevišķs konteiners) un Docker Compose (vairāki konteineri)
Tipiska Docker Compose lietošanas aina
Docker Compose ir, prasmīgi lietojot, ļoti spēcīgs rīks, kas ļauj ļoti ātri izvērst lietojumprogrammas, kurām ir sarežģīta arhitektūra. Tagad mēs aplūkosim praktiska piemēra izmantošanu Docker Compose, kura analīze ļaus jums novērtēt priekšrocības, ko sniedz Docker Compose izmantošana.
Iedomājieties, ka esat kāda tīmekļa projekta izstrādātājs. Šajā projektā ir divas tīmekļa vietnes. Pirmais ļauj uzņēmējiem, vien dažos klikšķos, izveidot interneta veikalus. Otrais ir vērsts uz klientu atbalsta sniegšanu. Šīs divas vietnes mijiedarbojas ar vienu un to pašu datu bāzi.
Jūsu projekts kļūst arvien populārāks, un izrādās, ka servera jauda, uz kura tas darbojas, ir nepietiekama. Tā rezultātā jūs nolemjat pāriet uz citu mašīnu.
Diemžēl, tādu rīku kā Docker Compose jūs neesat izmantojis. Tādēļ jums nāksies pārnest un pārkonfigurēt pakalpojumus pa vienam, cerot, ka šīs darba gaitā neko neaizmirsīsiet.
Ja jūs izmantojat Docker Compose, tad pārcelšana uz jauno serveri ir jautājums, ko var atrisināt, izpildot dažas komandas. Lai pabeigtu projekta pārvietošanu uz jauno vietu, jums būs nepieciešams veikt dažas iestatīšanas korekcijas un augšupielādēt jauno serveri datu bāzes rezerves kopiju.
Klient-servera lietojumprogrammas izstrāde, izmantojot Docker Compose
Tagad, kad jūs zināt, kādam mērķim mēs plānojam izmantot Docker Compose, ir laiks izveidot jūsu pirmo klient-servera lietojumprogrammu, izmantojot šo rīku. Proti, runa ir par neliela tīmekļa vietnes (servera) izstrādi Python valodā, kas spēj izsniegt failu ar teksta fragmentu. Šo failu serverim pieprasa programma (klients), kas arī uzrakstīta Python valodā. Pēc faila saņemšanas no servera programma attēlo tajā esošo tekstu ekrānā.
Lūdzu, ņemiet vērā, ka mēs ceram, ka jums ir pamatzināšanas par Docker un ka jums jau ir uzstādīta Docker platforma.
Sāksim strādāt pie projekta.
▍1. Projekta izveide
Lai uzbūvētu savu pirmo klient-servera lietojumprogrammu, es iesaku sākt ar projekta mapes izveidi. Tajā jābūt šādiem failiem un mapēm:
- Fails
docker-compose.ymlTas ir Docker Compose fails, kurā būs iekļautas instrukcijas, kas nepieciešamas pakalpojumu palaišanai un konfigurēšanai. - Mappa
serveris. Tajā būs faili, kas nepieciešami servera darbības nodrošināšanai. - Mappa
klients. Šeit atradīsies klienta aplikācijas faili.
Rezultātā galvenās mapperes saturs jūsu projektā jāizskatās šādi:
.
├── klienta/
├── docker-compose.yml
└── serveris/
2 direktorijas, 1 fails▍2. Servera izveide
Šeit mēs servera izveides laikā pieskarsimies dažām pamata lietām, kas saistītas ar Docker.
2a. Failu izveide
Iet uz mapi serveris un izveidojiet tajā šādus failus:
- Fails
server.py. Tā saturēs servera kodu. - Fails
index.html. Šajā failā būs fragments teksta, ko jāizvada klienta aplikācijai. - Fails
Dockerfile. Tas ir Docker fails, kurā būs iekļautas instrukcijas, kas nepieciešamas servera vides izveidei.
Šādi jāizskatās jūsu mapperes saturam serveris/:
.
├── Dockerfile
├── index.html
└── server.py
0 direktorijas, 3 faili2b. Python faila rediģēšana.
Pievienosim failam server.py nākamo kodu:
#!/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() Šis kods ļauj izveidot vienkāršu tīmekļa serveri. Tas piegādās klientiem failu index.html, kura saturs vēlāk tiks ievietots tīmekļa lapā.
2c. HTML faila rediģēšana
Failā index.html pievienosim nākamo tekstu:
Docker-Compose ir burvība!Šis teksts tiks nodots klientam.
2d. Dockerfile faila rediģēšana
Tagad mēs izveidosim vienkāršu failu Dockerfile, kas būs atbildīgs par izpildes vides organizēšanu Python serverim. Pamata tēla izveidei izmantosim , kas paredzēts programmu izpildei, kas uzrakstītas Python. Lūk, Dockerfile saturs:
# На всякий случай напоминаю, что 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/Tagad ķersimies klāt klienta izveidei.
▍3. Klienta izveide
Izveidojot projekta klienta daļu, mēs atkārtoti atcerēsimies dažas Docker pamatiestādes.
3a. Failu izveide
Iet uz jūsu projekta mapi klients un izveidojiet tajā šādus failus:
- Fails
client.py. Te būs klienta koda saturs. - Fails
Dockerfile. Šis fails pilda to pašu lomu, kā līdzīgs fails servera mapē. Precīzāk, tas satur instrukciju, kas apraksta vides izveidi klienta koda izpildei.
Rezultātā jūsu mape klients/ šajā darba posmā jāizskatās šādi:
.
├── client.py
└── Dockerfile
0 direktorijas, 2 faili3b. Python faila rediģēšana
Pievienosim failam client.py nākamo kodu:
#!/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()Pateicoties šim kodam, klienta aplikācija var ielādēt datus no servera un parādīt tos ekrānā.
3c. Dockerfile faila rediģēšana
Tāpat kā servera gadījumā, mēs klientam izveidojam vienkāršu Dockerfile, kas ir atbildīgs par vidi, kurā darbosies klients Python lietotne. Šeit ir klienta kods Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Kā jūs varbesat pamanījuši, mēs esam izveidojuši divus dažādus projektus: serveri un klientu. Katram no tiem ir savs fails Dockerfile. Līdz šim viss, kas notiek, ir saistīts ar pamatiem, strādājot ar Docker. Tagad mēs sākam strādāt ar Docker Compose. Tādēļ pievērsīsimies failam docker-compose.yml, kas atrodas projekta saknes mapē.
Lūdzu, ņemiet vērā, ka šeit mēs necenšamies apsvērt visas komandas, kuras var izmantot docker-compose.yml. Mūsu galvenais mērķis ir izpētīt praktisku piemēru, kas sniegs jums pamatzināšanas par Docker Compose.
Šeit ir kods, kas jāpievieno failam 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. Projekta būvēšana
Pēc tam, kad ir iekļautas visas nepieciešamās instrukcijas, projektu jābūvē. Šis solis mūsu darbā atgādina komandas izmantošanu docker-compose.yml docker build , bet atbilstošā komanda attiecas uz vairākiem pakalpojumiem:$ docker-compose build
▍6. Projekta palaišanaTagad, kad projekts ir uzbūvēts, ir pienācis laiks to palaist. Šis solis mūsu darbā atbilst solim, kurā, strādājot ar atsevišķiem konteineriem, izpildās komanda
docker run $ docker-compose up:
Pēc šīs komandas izpildes terminālī jāparādās tekstam, ko klients ir ieguvis no servera: Kā jau minēts, serveris izmanto datora portu Docker-Compose ir burvība!.
lai apkalpotu klienta pieprasījumus. Tādēļ, ja pāriet pārlūkā uz adresi 1234 , tajā tiks attēlots lapa ar tekstu Noderīgas komandas Docker-Compose ir burvība!.
Apskatīsim dažas komandas, kas var noderēt, strādājot ar Docker Compose.
Šī komanda ļauj apturēt un dzēst konteinerus un citus resursus, kurus izveidojusi komanda
docker-compose up $ docker-compose down:
Šī komanda raksta pakalpojumu žurnālus:$ docker-compose logs -f [service name]
Piemēram, mūsu projektā to var izmantot šādā veidā: Ar šādu komandu var iegūt konteineru sarakstu: Piemēram, mūsu projektā to var izmantot šādā veidā:.
$ docker-compose ps
Šī komanda ļauj izpildīt komandu darbojošajā konteinerā:$ docker-compose exec [service name] [command]
Piemēram, tā var izskatīties šādi: docker-compose exec server ls Šāda komanda ļauj iegūt attēlu sarakstu:.
$ docker-compose images
KopsavilkumsSecinājumi
Mēs apskatījām Docker Compose tehnoloģijas pamatus, kuru zināšanas ļaus jums izmantot šo tehnoloģiju un, ja vēlaties, sākt tās padziļinātu apgūšanu. ir projekta koda repozitorijs, ko mēs šeit apskatījām.
Cienījamie lasītāji! Vai jūs izmantojat Docker Compose savos projektos?
Avots: habr.com
