Vodič za početnike za Docker Compose

Autor članka, čiji prijevod danas objavljujemo, kaže da je namijenjen onim programerima koji žele naučiti Docker Compose i kreću prema stvaranju svoje prve klijent-poslužitelj aplikacije koristeći Docker. Pretpostavlja se da je čitatelj ovog materijala upoznat s osnovama Dockera. Ako to nije slučaj, možete pogledati ovo serija materijala na ovo post koji pokriva osnove Dockera zajedno s osnovama Kubernetesa i ovo članak za početnike.

Vodič za početnike za Docker Compose

Što je Docker Compose?

Docker Compose je alat uključen u Docker. Osmišljen je za rješavanje problema povezanih s implementacijom projekta.

Dok ste učili osnove Dockera, možda ste se susreli s izradom jednostavnih aplikacija koje rade autonomno i ne ovise, primjerice, o vanjskim izvorima podataka ili određenim servisima. U praksi su takve primjene rijetke. Pravi projekti obično uključuju cijeli niz aplikacija koje rade zajedno.

Kako ćete znati trebate li koristiti Docker Compose prilikom postavljanja projekta? Zapravo je vrlo jednostavno. Ako koristite više usluga kako bi ovaj projekt funkcionirao, Docker Compose bi vam mogao dobro doći. Na primjer, u situaciji kada kreiraju web stranicu koja se treba povezati s bazom podataka kako bi autentificirala korisnike. Takav projekt može se sastojati od dvije službe - one koja osigurava rad stranice i one koja je odgovorna za održavanje baze podataka.

Tehnologija Docker Compose, da je pojednostavljeno opišemo, omogućuje pokretanje mnogih usluga jednom naredbom.

Razlika između Dockera i Docker Composea

Docker se koristi za upravljanje pojedinačnim spremnicima (servisima) koji čine aplikaciju.

Docker Compose se koristi za istovremeno upravljanje više spremnika koji čine aplikaciju. Ovaj alat nudi iste mogućnosti kao i Docker, ali vam omogućuje rad sa složenijim aplikacijama.

Vodič za početnike za Docker Compose
Docker (jedan spremnik) i Docker Compose (više spremnika)

Tipičan slučaj upotrebe za Docker Compose

Docker Compose je, u pravim rukama, vrlo moćan alat koji vam omogućuje vrlo brzu implementaciju aplikacija sa složenom arhitekturom. Sada ćemo pogledati primjer praktične upotrebe Docker Composea, čija analiza će vam omogućiti da procijenite prednosti koje će vam korištenje Docker Compose dati.

Zamislite da ste programer web projekta. Ovaj projekt uključuje dvije web stranice. Prvi omogućuje poslovnim ljudima stvaranje online trgovina sa samo nekoliko klikova. Drugi je usmjeren na korisničku podršku. Ova dva mjesta komuniciraju s istom bazom podataka.

Vaš projekt postaje sve popularniji, a pokazalo se da snaga poslužitelja na kojem radi više nije dovoljna. Kao rezultat toga, odlučili ste premjestiti cijeli projekt na drugo računalo.

Nažalost, niste koristili nešto poput Docker Composea. Stoga ćete morati prenijeti i rekonfigurirati usluge jednu po jednu, nadajući se da nećete ništa zaboraviti u procesu.

Ako koristite Docker Compose, tada je premještanje vašeg projekta na novi poslužitelj problem koji se može riješiti pokretanjem nekoliko naredbi. Kako biste dovršili prijenos projekta na novu lokaciju, trebate samo napraviti neke postavke i učitati sigurnosnu kopiju baze podataka na novi poslužitelj.

Razvoj aplikacije klijent-poslužitelj pomoću Docker Composea

Sada kada znate za što ćemo koristiti Docker Compose, vrijeme je da izradite svoju prvu aplikaciju klijent-poslužitelj pomoću ovog alata. Naime, govorimo o razvoju male web stranice (poslužitelja) u Pythonu koja može ispisati datoteku s fragmentom teksta. Ovu datoteku od poslužitelja traži program (klijent), također napisan u Pythonu. Nakon što primi datoteku s poslužitelja, program na zaslonu prikazuje tekst koji je u njoj pohranjen.

Imajte na umu da pretpostavljamo da imate osnovno razumijevanje Dockera i da već imate instaliranu Docker platformu.

Počnimo raditi na projektu.

▍1. Izrada projekta

Za izradu vaše prve aplikacije klijent-poslužitelj, predlažem da počnete stvaranjem mape projekta. Treba sadržavati sljedeće datoteke i mape:

  • datoteka docker-compose.yml. Ovo je Docker Compose datoteka koja će sadržavati upute potrebne za pokretanje i konfiguraciju usluga.
  • Mapa server. Sadržavat će datoteke potrebne za rad poslužitelja.
  • Mapa client. Ovdje će se nalaziti datoteke klijentske aplikacije.

Kao rezultat toga, sadržaj glavne mape vašeg projekta trebao bi izgledati ovako:

.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file

▍2. Izrada poslužitelja

Ovdje ćemo se u procesu kreiranja poslužitelja dotaknuti nekih osnovnih stvari vezanih uz Docker.

2a. Stvaranje datoteka

Idite u mapu server i u njemu kreirajte sljedeće datoteke:

  • datoteka server.py. Sadržavat će kod poslužitelja.
  • datoteka index.html. Ova datoteka će sadržavati dio teksta koji bi klijentska aplikacija trebala ispisati.
  • datoteka Dockerfile. Ovo je Docker datoteka koja će sadržavati upute potrebne za stvaranje okruženja poslužitelja.

Ovako bi trebao izgledati sadržaj vaše mape server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files

2b. Uređivanje Python datoteke.

Dodaj 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 vam omogućuje stvaranje jednostavnog web poslužitelja. Dat će klijentima dosje index.html, čiji će sadržaj naknadno biti prikazan na web stranici.

2c. Uređivanje HTML datoteke

Za datoteku index.html dodajte sljedeći tekst:

Docker-Compose is magic!

Ovaj tekst će biti poslan klijentu.

2d. Uređivanje datoteke Docker

Sada ćemo stvoriti jednostavnu datoteku Dockerfile, koji će biti odgovoran za organizaciju runtime okruženja za Python poslužitelj. Kao osnovu za stvorenu sliku koristit ćemo na službeni način, dizajniran za pokretanje programa napisanih u Pythonu. Evo sadržaja Dockerfilea:

# На всякий случай напоминаю, что 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 počnimo raditi na klijentu.

▍3. Stvaranje klijenta

Dok stvaramo klijentsku stranu našeg projekta, usput ćemo se sjetiti nekih osnova Dockera.

3a. Stvaranje datoteka

Idite u mapu svog projekta client i u njemu kreirajte sljedeće datoteke:

  • datoteka client.py. Ovdje će se nalaziti kod klijenta.
  • datoteka Dockerfile. Ova datoteka ima istu ulogu kao slična datoteka u mapi poslužitelja. Naime, sadrži upute koje opisuju kako napraviti okruženje za izvršavanje koda klijenta.

Kao rezultat toga, vaša mapa client/ u ovoj fazi rada to bi trebalo izgledati ovako:

.
├── client.py
└── Dockerfile
0 directories, 2 files

3b. Uređivanje Python datoteke

Dodaj 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()

Pomoću ovog koda klijentska aplikacija može preuzeti podatke s poslužitelja i prikazati ih na ekranu.

3c. Uređivanje datoteke Docker

Kao iu slučaju poslužitelja, stvaramo jednostavan Dockerfile, odgovoran za stvaranje okruženja u kojem će se izvoditi Python klijentska aplikacija. Ovdje je kod 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: poslužitelj i klijent. Svaki od njih ima svoju datoteku Dockerfile. Do sada sve što se događalo nije išlo dalje od osnova rada s Dockerom. Sada počinjemo s Docker Composeom. Da bismo to učinili, idemo na datoteku docker-compose.yml, koji se nalazi u korijenskoj mapi projekta.

Imajte na umu da ovdje ne pokušavamo pokriti apsolutno sve naredbe koje se mogu koristiti u docker-compose.yml. Naš glavni cilj je proći kroz praktičan primjer koji će vam dati osnovno znanje o Docker Composeu.

Ovdje je kod 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. Izgradnja projekta

Nakon u docker-compose.yml Sve potrebne upute su unesene, potrebno je sastaviti projekt. Ovaj korak našeg rada sličan je korištenju naredbe docker build, ali odgovarajuća naredba relevantna je za nekoliko usluga:

$ docker-compose build

▍6. Pokretanje projekta

Sada kada je projekt sastavljen, vrijeme je da ga pokrenemo. Ovaj korak našeg rada odgovara koraku u kojem se pri radu s pojedinačnim spremnicima izvršava naredba docker run:

$ docker-compose up

Nakon izvršenja ove naredbe, tekst koji je klijent preuzeo sa poslužitelja trebao bi se pojaviti u terminalu: Docker-Compose is magic!.

Kao što je već spomenuto, poslužitelj koristi priključak računala 1234 servisirati zahtjeve klijenata. Stoga, ako odete na adresu u svom pregledniku http://localhost:1234/, prikazat će stranicu s tekstom Docker-Compose is magic!.

Korisne naredbe

Pogledajmo neke naredbe koje bi vam mogle biti korisne kada radite s Docker Composeom.

Ova vam naredba omogućuje zaustavljanje i brisanje spremnika i drugih resursa stvorenih naredbom docker-compose up:

$ docker-compose down

Ova naredba ispisuje servisne dnevnike:

$ docker-compose logs -f [service name]

Na primjer, u našem projektu može se koristiti u ovom obliku: $ docker-compose logs -f [service name].

Pomoću ove naredbe možete prikazati popis spremnika:

$ docker-compose ps

Ova naredba vam omogućuje da izvršite naredbu u spremniku koji radi:

$ docker-compose exec [service name] [command]

Na primjer, to bi moglo izgledati ovako: docker-compose exec server ls.

Ova vam naredba omogućuje prikaz popisa slika:

$ docker-compose images

Rezultati

Pogledali smo osnove rada s tehnologijom Docker Compose, čije će vam poznavanje omogućiti korištenje ove tehnologije i, ako želite, početi je dublje proučavati. ovdje je repozitorij s kodom za projekt koji smo ovdje pogledali.

Dragi čitatelji! Koristite li Docker Compose u svojim projektima?

Vodič za početnike za Docker Compose

Izvor: www.habr.com

Dodajte komentar