Autor članka čiji prijevod danas objavljujemo kaže da je namijenjen programerima koji žele naučiti Docker Compose i prave svoje prvo klijentsko-poslužiteljsko aplikaciju koristeći Docker. Pretpostavlja se da je čitatelj ovog materijala upoznat s osnovama Dockera. Ako nije - možete pogledati seriju materijala, na objavu u kojoj su osnovi Dockera obuhvaćeni zajedno s osnovama Kubernetesa, i na članak za početnike.
Što je Docker Compose?
Docker Compose je alat koji je dio Dockera. Namijenjen je rješavanju problema povezanih s implementacijom projekata.
Učeći osnove Dockera, mogli ste se susresti s izradom najjednostavnijih aplikacija koje rade autonomno, ne oslanjajući se, na primjer, na vanjske izvore podataka ili servise. U praksi, međutim, takve aplikacije su rijetkost. Stvarni projekti obično sadrže cijeli niz aplikacija koje rade zajedno.
Kako znati trebate li, prilikom implementacije nekog projekta, koristiti Docker Compose? U stvari — vrlo je jednostavno. Ako za funkcioniranje ovog projekta koristite više servisa, Docker Compose vam može biti od pomoći. Na primjer, u situaciji kada se kreira web stranica koja za autentifikaciju korisnika treba povezivanje s bazom podataka. Takav projekt može se sastojati od dva servisa — onog koji osigurava rad web stranice, i onog koji se brine o bazi podataka.
Tehnologija Docker Compose, u pojednostavljenoj verziji, omogućuje pokretanje mnogih servisa s jednom naredbom.
Razlika između Dockera i Docker Compose
Docker se koristi za upravljanje pojedinačnim kontejnerima (servisima) od kojih se aplikacija sastoji.
Docker Compose se koristi za simultano upravljanje više kontejnera koji čine aplikaciju. Ovaj alat nudi iste mogućnosti kao Docker, ali omogućuje rad s složenijim aplikacijama.

Docker (pojedinačni kontejner) i Docker Compose (više kontejnera)
Tipični scenarij korištenja Docker Compose
Docker Compose — u vještim rukama, vrlo moćan alat koji omogućava brzo raspoređivanje aplikacija složene arhitekture. Sada ćemo razmotriti primjer praktične upotrebe Docker Compose-a, čija analiza će vam pomoći procijeniti prednosti korištenja Docker Compose-a.
Zamislite da ste developer nekog web projekta. Ovaj projekt uključuje dva weba. Prvi omogućava ljudima koji se bave biznisom da kreiraju internetske trgovine u nekoliko klikova. Drugi je usmjeren na podršku korisnicima. Ta dva weba komuniciraju s istom bazom podataka.
Vaš projekt postaje sve popularniji, a snaga servera na kojem radi više nije dovoljna. Zbog toga odlučujete prebaciti cijeli projekt na drugu mašinu.
Nažalost, niste koristili nešto poput Docker Compose-a. Stoga ćete morati premještati i ponovno konfigurirati servise jedan po jedan, nadajući se da ništa nećete zaboraviti tijekom tog postupka.
Ako koristite Docker Compose, premještanje vašeg projekta na novi server pitanje je koje se rješava izvedbom nekoliko komandi. Da biste završili prijenos projekta na novo mjesto, potrebno je samo izvršiti neke postavke i prenijeti sigurnosnu kopiju baze podataka na novi server.
Razvoj klijentsko-server aplikacije uz Docker Compose
Sada, kada znate zašto planiramo koristiti Docker Compose, vrijeme je da kreiramo vašu prvu klijentsko-server aplikaciju koristeći ovaj alat. Naime, riječ je o razvoju male web stranice (servera) na Pythonu, koja može dostaviti datoteku s fragmentom teksta. Ovu datoteku sa servera zahtijeva program (klijent) također napisan na Pythonu. Nakon što klijent primi datoteku sa servera, ispisuje tekst koji se u njoj nalazi na ekran.
Imajte na umu da očekujemo da znate osnove Dockera i da je platforma Docker već instalirana.
Započnimo rad na projektu.
▍1. Kreiranje projekta
Da biste izgradili svoju prvu klijentsko-server aplikaciju, predlažem da započnete s kreiranjem mape projekta. Ona bi trebala sadržavati sljedeće datoteke i mape:
- Datoteka
docker-compose.ymlOvo je Docker Compose datoteka koja će sadržavati upute potrebne za pokretanje i konfiguriranje servisa. - Mapa
PoslužiteljOna će sadržavati datoteke potrebne za rad servera. - Mapa
klijentOvdje će se nalaziti datoteke klijentske aplikacije.
Kao rezultat, sadržaj glavne mape vašeg projekta trebao bi izgledati ovako:
.
├── client/
├── docker-compose.yml
└── server/
2 direktorija, 1 datoteka▍2. Kreiranje servera
Ovdje ćemo, u procesu kreiranja servera, obraditi neke osnovne aspekte vezane uz Docker.
2a. Kreiranje datoteka
Idite u mapu Poslužitelj i u njoj kreirajte sljedeće datoteke:
- Datoteka
server.py. U njoj će se nalaziti kod servera. - Datoteka
index.html. U ovoj datoteci će se nalaziti fragment teksta koji će klijentska aplikacija ispisivati. - Datoteka
Dockerfile. Ovo je Docker datoteka koja će sadržavati upute potrebne za stvaranje okruženja servera.
Ovako bi trebao izgledati sadržaj vaše mape server/:
.
├── Dockerfile
├── index.html
└── server.py
0 direktorija, 3 datoteke2b. Uređivanje Python datoteke.
Dodajmo u datoteku server.py sljedeći kod:
#!/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() Ovaj kod omogućuje kreiranje jednostavnog web servera. On će klijentima slati datoteku index.html, čiji će sadržaj kasnije biti ispisan na web stranici.
2c. Uređivanje HTML datoteke
U datoteku index.html dodajemo sljedeći tekst:
Docker-Compose je čarolija!Ovaj tekst će biti poslan klijentu.
2d. Uređivanje datoteke Dockerfile
Sada ćemo kreirati jednostavnu datoteku Dockerfile, koja će biti odgovorna za organizaciju izvršnog okruženja za Python server. Kao osnovu uzet ćemo , namijenjen za izvršavanje programa napisanih u Pythonu. Evo sadržaja 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/Sada ćemo se posvetiti radu na klijentu.
▍3. Kreiranje klijenta
Kreirajući klijentski dio našeg projekta, prisjetit ćemo se nekih osnova Dockera.
3a. Kreiranje datoteka
Idite u mapu vašeg projekta klijent i u njoj kreirajte sljedeće datoteke:
- Datoteka
client.py. Ovdje će se nalaziti kod klijenta. - Datoteka
Dockerfile. Ova datoteka ima istu ulogu kao i slična datoteka u mapi servera. Naime, sadrži upute koje opisuju kako stvoriti okruženje za izvršavanje klijentskog koda.
Kao rezultat, vaša mapa client/ u ovoj fazi rada trebala bi izgledati ovako:
.
├── client.py
└── Dockerfile
0 direktorija, 2 datoteke3b. Uređivanje Python datoteke
Dodajmo u datoteku client.py sljedeći kod:
#!/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()Zahvaljujući ovom kodu, klijentska aplikacija može preuzeti podatke s servera i prikazati ih na ekranu.
3c. Uređivanje datoteke Dockerfile
Kao i u slučaju servera, kreiramo jednostavnu Dockerfile, odgovoran za formiranje okruženja u kojem će klijentska Python aplikacija raditi. Evo koda klijenta Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Kao što ste mogli primijetiti, stvorili smo dva različita projekta: server i klijent. Svaki od njih ima svoj vlastiti datoteka Dockerfile. Do sada sve što se događalo nije izlazilo iz okvira osnovnog rada s Docker-om. Sada počinjemo raditi s Docker Compose-om. Za to se obratimo datoteci docker-compose.yml, koja se nalazi u korijenskoj mapi projekta.
Obratite pažnju na to da se ovdje ne trudimo razmotriti apsolutno sve naredbe koje se mogu koristiti u docker-compose.yml. Naš glavni cilj je razraditi praktični primjer koji vam daje osnovna znanja o Docker Compose-u.
Evo koda koji treba staviti u datoteku 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. Skupljanje projekta
Nakon što su u docker-compose.yml unesene sve potrebne upute, projekt treba skupiti. Ovaj korak našeg rada podsjeća na korištenje naredbe docker build, ali odgovarajuća naredba odnosi se na više servisa:
$ docker-compose build▍6. Pokretanje projekta
Sada kada je projekt skupljen, došlo je vrijeme za njegovo pokretanje. Ovaj korak našeg rada odgovara koraku u kojem, kada se radi s pojedinačnim kontejnerima, izvršava se naredba docker run:
$ docker-compose up Nakon izvršenja ove naredbe u terminalu se treba pojaviti tekst koji je klijent preuzeo s poslužitelja: Docker-Compose je čarolija!.
Kao što je već rečeno, poslužitelj koristi port računala 1234 za obradu zahtjeva klijenta. Stoga, ako u pregledniku odete na adresu , prikazat će se stranica s tekstom Docker-Compose je čarolija!.
Koristan alati
Razmotrimo neke naredbe koje bi vam mogle biti korisne pri radu s Docker Compose-om.
Ova naredba omogućuje zaustavljanje i uklanjanje kontejnera i drugih resursa stvorenih naredbom docker-compose up:
$ docker-compose downOva naredba prikazuje zapise servisa:
$ docker-compose logs -f [service name] Na primjer, u našem projektu može se koristiti na sljedeći način: $ docker-compose logs -f [service name].
Ovom naredbom možete prikazati popis kontejnera:
$ docker-compose psOva naredba omogućuje izvršavanje naredbe unutar aktivnog kontejnera:
$ docker-compose exec [service name] [command] Na primjer, može izgledati ovako: docker-compose exec server ls.
Ova naredba omogućuje prikaz popisa slika:
$ docker-compose imagesZaključci
Razmotrili smo osnove rada s tehnologijom Docker Compose, čije znanje omogućuje korištenje ove tehnologije i, po želji, početak dubljeg proučavanja. repozitorij s kodom projekta koji smo ovdje razmatrali.
Dragi čitatelji! Koristite li Docker Compose u svojim projektima?
Izvor: habr.com
