Príručka k Docker Compose pre začiatočníkov

Autor článku, ktorého preklad dnes publikujeme, tvrdí, že je určený pre tých vývojárov, ktorí sa chcú naučiť Docker Compose a smerujú k tomu, aby vytvorili svoju prvú klient-server aplikáciu s využitím Dockeru. Predpokladá sa, že čitateľ tohto materiálu ovláda základy Dockeru. Ak nie, môžete sa pozrieť na túto sériu materiálov, na túto publikáciu, kde sú základné pojmy Dockeru spracované spolu so základmi Kubernetes, a na túto článok pre začiatočníkov.

Príručka k Docker Compose pre začiatočníkov

Čo je Docker Compose?

Docker Compose je nástroj, ktorý je súčasťou Dockeru. Je určený na riešenie problémov spojených s nasadzovaním projektov.

Pri učení sa základov Dockeru ste sa mohli stretnúť so vytváraním najjednoduchších aplikácií, ktoré fungujú samostatne, nezávisle od vonkajších zdrojov dát alebo poskytovaných služieb. V praxi sa však takéto aplikácie vyskytujú zriedkavo. Skutočné projekty obyčajne obsahujú celú súpravu aplikácií pracujúcich spoločne.

Ako zistiť, či je pri nasadení projektu potrebné využiť Docker Compose? V skutočnosti je to veľmi jednoduché. Ak pre fungovanie tohto projektu potrebujete viacero služieb, Docker Compose vám môže byť užitočný. Napríklad v situácii, keď vytvárate webovú stránku, ktorá na autentifikáciu používateľov potrebuje pripojiť k databáze. Takýto projekt môže pozostávať z dvoch služieb - jednej, ktorá zabezpečuje fungovanie stránky, a druhej, ktorá zodpovedá za podporu databázy.

Technológia Docker Compose, ak ju zjednodušíme, umožňuje spustiť množstvo služieb pomocou jedného príkazu.

Rozdiel medzi Dockerom a Docker Compose

Docker sa používa na správu jednotlivých kontajnerov (služieb), z ktorých sa aplikácia skladá.

Docker Compose sa používa na súčasnú správu viacerých kontajnerov, ktoré sú súčasťou aplikácie. Tento nástroj ponúka rovnaké možnosti ako Docker, ale umožňuje pracovať s komplexnejšími aplikáciami.

Príručka k Docker Compose pre začiatočníkov
Docker (jednotlivý kontajner) a Docker Compose (viacero kontajnerov)

Typický scenár použitia Docker Compose

Docker Compose je vo zručných rukách veľmi silný nástroj, ktorý umožňuje rýchlo nasadzovať aplikácie s komplexnou architektúrou. Teraz si ukážeme príklad praktického využitia Docker Compose, ktorého rozbor vám umožní oceniť výhody, ktoré vám používanie Docker Compose poskytne.

Predstavte si, že ste vývojár webového projektu, ktorý obsahuje dve webové stránky. Prvá umožňuje podnikateľom vytvárať internetové obchody iba niekoľkými kliknutiami. Druhá je zameraná na podporu zákazníkov. Tieto dve stránky interagujú s jednou a tou istou databázou.

Váš projekt sa stáva čoraz populárnejším a ukazuje sa, že výkon servera, na ktorom beží, už nestačí. Preto sa rozhodnete presunúť celý projekt na iný stroj.

Bohužiaľ, niečo ako Docker Compose ste nepoužívali. Preto musíte prenášať a rekonfigurovať služby jednu po druhej, dúfajúc, že počas tohto procesu na nič nezabudnete.

Ak však používate Docker Compose, presun vášho projektu na nový server je otázka, ktorá sa rieši vykonaním niekoľkých príkazov. Aby ste dokončili presun projektu na nové miesto, musíte len vykonať niekoľko nastavení a nahrať na nový server zálohu databázy.

Vývoj klient-server aplikácie pomocou Docker Compose

Teraz, keď viete, na čo plánujeme použiť Docker Compose, je čas vytvoriť vašu prvú klient-server aplikáciu pomocou tohto nástroja. Ide konkrétne o vývoj malého webového servera v Pythone, ktorý dokáže poskytnúť súbor s úryvkom textu. Tento súbor vyžaduje program (klient), ktorý je tiež napísaný v Pythone. Po získaní súboru zo servera program zobrazí text, ktorý sa v ňom nachádza, na obrazovke.

Všimnite si, že predpokladáme, že ovládate základy Dockeru a že máte už nainštalovanú platformu Docker.

Pustime sa do práce na projekte.

▍1. Vytvorenie projektu

Aby ste mohli postaviť svoju prvú klient-server aplikáciu, navrhujem začať vytvorením priečinka projektu. Mal by obsahovať nasledujúce súbory a priečinky:

  • Súbor docker-compose.ymlToto je súbor Docker Compose, ktorý bude obsahovať pokyny potrebné na spustenie a nastavenie služieb.
  • Priečinok serverTento priečinok bude obsahovať súbory nevyhnutné na prevádzku servera.
  • Priečinok clientTu budú umiestnené súbory klientskej aplikácie.

Výsledkom by mal obsah hlavného priečinka vášho projektu vyzerať takto:

.
├── client/
├── docker-compose.yml
└── server/
2 priečinky, 1 súbor

▍2. Vytvorenie servera

Tu sa pri vytváraní servera dotkneme niektorých základných vecí týkajúcich sa Dockeru.

2a. Vytvorenie súborov

Prejdite do priečinka server a vytvorte v ňom nasledujúce súbory:

  • Súbor server.py. V ňom sa bude nachádzať kód servera.
  • Súbor index.html. V tomto súbore bude umiestnený úryvok textu, ktorý by malo klientské aplikácie vypísať.
  • Súbor Dockerfile. Toto je súbor Docker, ktorý bude obsahovať pokyny potrebné na vytvorenie prostredia servera.

Takto by mal vyzerať obsah vášho priečinka server/:

.
├── Dockerfile
├── index.html
└── server.py
0 priečinkov, 3 súbory

2b. Úprava Python súboru.

Pridáme do súboru server.py nasledujúci kód:

#!/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()

Tento kód umožňuje vytvoriť jednoduchý webový server. Ten bude poskytovať klientom súbor index.html, ktorého obsah sa neskôr zobrazí na webovej stránke.

2c. Úprava HTML súboru

Do súboru index.html pridáme nasledujúci text:

Docker-Compose je mágia!

Tento text bude odosielaný klientovi.

2d. Úprava súboru Dockerfile

Teraz vytvoríme jednoduchý súbor Dockerfile, ktorý sa postará o organizáciu prostredia pre Python server. Ako základ vytvoreného obrazu použijeme oficiálny obraz, určený na spúšťanie programov napísaných v Pythone. Tu je obsah 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/

Teraz sa pustíme do práce na klientovi.

▍3. Vytvorenie klienta

Pri vytváraní klientskej časti nášho projektu si zároveň pripomenieme niektoré základy Dockeru.

3a. Vytvorenie súborov

Prejdite do priečinka vášho projektu client a vytvorte v ňom nasledujúce súbory:

  • Súbor client.py. Tu sa bude nachádzať kód klienta.
  • Súbor Dockerfile. Tento súbor plní rovnakú úlohu ako analogický súbor v priečinku servera. Konkrétne obsahuje pokyn, ktorý popisuje vytvorenie prostredia na vykonávanie klientského kódu.

V dôsledku toho by váš priečinok client/ v tejto fáze práce mal vyzerať takto:

.
├── client.py
└── Dockerfile
0 priečinkov, 2 súbory

3b. Úprava Python súboru

Pridáme do súboru client.py nasledujúci kód:

#!/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()

Vďaka tomuto kódu môže klientská aplikácia načítať údaje zo servera a zobraziť ich na obrazovke.

3c. Úprava súboru Dockerfile

Rovnako ako v prípade servera, aj pre klienta vytvárame jednoduchý Dockerfile, zodpovedný za vytvorenie prostredia, v ktorom bude fungovať klientské Python aplikácie. Tu je kód klienta Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. Docker Compose

Ako ste si mohli všimnúť, vytvorili sme dva rôzne projekty: server a klient. Každý z nich má svoj vlastný súbor Dockerfile. Doteraz sa všetko, čo sa deje, nevybočuje z rámca základov práce s Dockerom. Teraz sa však pustíme do práce s Docker Compose. Za týmto účelom sa pozrieme na súbor docker-compose.yml, ktorý sa nachádza v koreňovej zložke projektu.

Všimnite si, že sa tu nesnažíme prehľadne urobiť všetky príkazy, ktoré je možné použiť v docker-compose.yml. Naším hlavným cieľom je preskúmať praktický príklad, ktorý vám dá základné vedomosti o Docker Compose.

Tu je kód, ktorý treba vložiť do súboru 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. Sestavenie projektu

Po tom, ako boli do docker-compose.yml vložené všetky potrebné inštrukcie, je potrebné projekt zostaviť. Tento krok našej práce pripomína použitie príkazu docker build, ale príslušný príkaz sa týka viacerých služieb:

$ docker-compose build

▍6. Spustenie projektu

Teraz, keď je projekt zostavený, nastal čas ho spustiť. Tento krok našej práce zodpovedá kroku, pri ktorom sa pri práci s jednotlivými kontajnermi vykonáva príkaz docker run:

$ docker-compose up

Po vykonaní tohto príkazu by sa v termináli mal objaviť text, ktorý klient načítal zo servera: Docker-Compose je mágia!.

Ako už bolo povedané, server používa port počítača 1234 na obsluhu požiadaviek klienta. Preto, ak prejdete v prehliadači na adresu http://localhost:1234/, na ňom sa zobrazí stránka s textom Docker-Compose je mágia!.

Užitočné príkazy

Pozrime sa na niektoré príkazy, ktoré by vám mohli byť užitočné pri práci s Docker Compose.

Tento príkaz umožňuje zastaviť a odstrániť kontajnery a ďalšie zdroje vytvorené príkazom docker-compose up:

$ docker-compose down

Tento príkaz vypíše logy služieb:

$ docker-compose logs -f [service name]

Napríklad, v našom projekte ju možno použiť takto: $ docker-compose logs -f [service name].

S pomocou tohto príkazu môžete vypísať zoznam kontajnerov:

$ docker-compose ps

Tento príkaz umožňuje vykonať príkaz v bežiacom kontajneri:

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

Napríklad môže vyzerať takto: docker-compose exec server ls.

Tento príkaz umožňuje zobraziť zoznam obrazov:

$ docker-compose images

Zhrnutie

Prešli sme základmi práce s technológiou Docker Compose, získanie ktorých vám umožní používať túto technológiu a, ak si to prajete, začať sa ňou hlbšie zaoberať. Tu sú repozitár s kódom projektu, ktorý sme tu skúmali.

Vážení čitatelia! Používate Docker Compose vo svojich projektoch?

Príručka k Docker Compose pre začiatočníkov

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster