Docker Compose Vodič za početnike

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

Docker Compose Vodič za početnike

Šta je Docker Compose?

Docker Compose je alat uključen u Docker. Dizajniran je za rješavanje problema vezanih za implementaciju projekta.

Dok ste učili osnove Dockera, možda ste naišli na kreiranje jednostavnih aplikacija koje rade autonomno i ne ovise, na primjer, o vanjskim izvorima podataka ili određenim uslugama. U praksi su takve primjene rijetke. Pravi projekti obično uključuju čitav skup aplikacija koje rade zajedno.

Kako znate da li trebate koristiti Docker Compose prilikom postavljanja projekta? Zapravo je vrlo jednostavno. Ako koristite više servisa da bi ovaj projekt funkcionirao, Docker Compose može dobro doći. Na primjer, u situaciji kada kreiraju web stranicu koja se mora povezati s bazom podataka kako bi izvršila autentifikaciju korisnika. Takav projekat može se sastojati od dva servisa – onog koji osigurava rad stranice i onog koji je odgovoran za održavanje baze podataka.

Tehnologija Docker Compose, da je opišem na pojednostavljen način, omogućava vam da pokrenete mnoge usluge jednom komandom.

Razlika između Dockera i Docker Composea

Docker se koristi za upravljanje pojedinačnim kontejnerima (uslugama) koji čine aplikaciju.

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

Docker Compose Vodič za početnike
Docker (jedan kontejner) i Docker Compose (više kontejnera)

Tipičan slučaj upotrebe za Docker Compose

Docker Compose je, u pravim rukama, vrlo moćan alat koji vam omogućava da vrlo brzo implementirate aplikacije sa složenom arhitekturom. Sada ćemo pogledati primjer praktične upotrebe Docker Composea, čija će vam analiza omogućiti da ocijenite prednosti koje će vam donijeti korištenje Docker Compose.

Zamislite da ste programer web projekta. Ovaj projekat uključuje dvije web stranice. Prvi omogućava poslovnim ljudima da kreiraju internet prodavnice sa samo nekoliko klikova. Drugi je usmjeren na korisničku podršku. Ova dva sajta komuniciraju sa istom bazom podataka.

Vaš projekat postaje sve popularniji, a ispostavilo se da snaga servera na kojem radi više nije dovoljna. Kao rezultat toga, odlučujete da premestite ceo projekat na drugu mašinu.

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

Ako koristite Docker Compose, onda je premještanje vašeg projekta na novi server stvar koja se može riješiti pokretanjem nekoliko naredbi. Da biste dovršili prijenos projekta na novu lokaciju, potrebno je samo napraviti neka podešavanja i učitati rezervnu kopiju baze podataka na novi server.

Razvoj klijent-server aplikacije koristeći Docker Compose

Sada kada znate za šta ćemo koristiti Docker Compose, vrijeme je da kreirate svoju prvu klijent-server aplikaciju koristeći ovaj alat. Naime, radi se o razvoju male web stranice (servera) u Python-u koja može da izbaci fajl sa fragmentom teksta. Ovu datoteku traži od servera program (klijent), takođe napisan u Python-u. Nakon što primi datoteku sa servera, program prikazuje tekst pohranjen u njoj na ekranu.

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

Počnimo raditi na projektu.

▍1. Kreiranje projekta

Da biste napravili svoju prvu klijent-server aplikaciju, predlažem da počnete kreiranjem fascikle projekta. Trebao bi sadržavati sljedeće fajlove i foldere:

  • fajl docker-compose.yml. Ovo je datoteka Docker Compose koja će sadržavati upute potrebne za pokretanje i konfiguraciju usluga.
  • fascikla server. Sadržat će datoteke potrebne za održavanje servera.
  • fascikla client. Datoteke klijentske aplikacije će se nalaziti ovdje.

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

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

▍2. Kreiranje servera

Ovdje ćemo se u procesu kreiranja servera dotaknuti nekih osnovnih stvari u vezi s Dockerom.

2a. Kreiranje fajlova

Idite u folder server i kreirajte sljedeće fajlove u njemu:

  • fajl server.py. Sadržat će kod servera.
  • fajl index.html. Ova datoteka će sadržavati dio teksta koji klijentska aplikacija treba da izbaci.
  • fajl Dockerfile. Ovo je Docker datoteka koja će sadržavati upute potrebne za kreiranje serverskog okruženja.

Ovako bi trebao izgledati sadržaj vašeg foldera server/:

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

2b. Uređivanje Python fajla.

Dodaj u fajl 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ćava da kreirate jednostavan web server. On će klijentima dati dosije index.html, čiji će sadržaj kasnije biti prikazan na web stranici.

2c. Uređivanje HTML datoteke

Za fajl index.html dodati sljedeći tekst:

Docker-Compose is magic!

Ovaj tekst će biti poslan klijentu.

2d. Uređivanje Dockerfile-a

Sada ćemo kreirati jednostavnu datoteku Dockerfile, koji će biti odgovoran za organizaciju runtime okruženja za Python server. Kao osnovu za kreiranu sliku koristićemo na službeni način, dizajniran za pokretanje programa napisanih u Python-u. Evo sadržaja Dockerfile-a:

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

▍3. Kreiranje klijenta

Prilikom kreiranja klijentske strane našeg projekta, usput ćemo se sjetiti nekih Dockerovih osnova.

3a. Kreiranje fajlova

Idite u fasciklu svog projekta client i kreirajte sljedeće fajlove u njemu:

  • fajl client.py. Klijentski kod će se nalaziti ovdje.
  • fajl Dockerfile. Ova datoteka igra istu ulogu kao slična datoteka u folderu servera. Naime, sadrži instrukcije koje opisuju kako kreirati okruženje za izvršavanje klijentskog koda.

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

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

3b. Uređivanje Python fajla

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

Sa ovim kodom, klijentska aplikacija može preuzeti podatke sa servera i prikazati ih na ekranu.

3c. Uređivanje Dockerfile-a

Kao iu slučaju servera, kreiramo jednostavan Dockerfile, odgovoran za kreiranje okruženja u kojem će se pokretati 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 možda primijetili, kreirali smo dva različita projekta: server i klijent. Svaki od njih ima svoj fajl Dockerfile. Do sada sve što se dogodilo nije išlo dalje od osnova rada sa Dockerom. Sada počinjemo sa Docker Compose. Da bismo to učinili, idemo na datoteku docker-compose.yml, koji se nalazi u osnovnoj fascikli projekta.

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

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. Izgradnja projekta

Nakon ulaska docker-compose.yml Sva potrebna uputstva su upisana, potrebno je sastaviti projekat. Ovaj korak našeg rada je sličan korištenju naredbe docker build, ali odgovarajuća komanda je relevantna za nekoliko servisa:

$ docker-compose build

▍6. Pokretanje projekta

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

$ docker-compose up

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

Kao što je već pomenuto, server koristi port računara 1234 za servisiranje zahtjeva klijenata. Stoga, ako odete na adresu u vašem pretraživaču http://localhost:1234/, prikazaće stranicu sa tekstom Docker-Compose is magic!.

Korisne komande

Pogledajmo neke komande koje bi vam mogle biti korisne kada radite sa Docker Compose.

Ova komanda vam omogućava da zaustavite i izbrišete kontejnere i druge resurse kreirane naredbom docker-compose up:

$ docker-compose down

Ova komanda 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].

Koristeći ovu naredbu možete prikazati listu kontejnera:

$ docker-compose ps

Ova naredba vam omogućava da izvršite naredbu u pokrenutom kontejneru:

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

Na primjer, to može izgledati ovako: docker-compose exec server ls.

Ova komanda vam omogućava da prikažete listu slika:

$ docker-compose images

Ishodi

Pogledali smo osnove rada s Docker Compose tehnologijom, čije će vam poznavanje omogućiti da koristite ovu tehnologiju i, ako želite, počnete je dublje proučavati. ovdje spremište sa kodom za projekat koji smo pogledali ovde.

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

Docker Compose Vodič za početnike

izvor: www.habr.com

Dodajte komentar