Docker Compose Guide pre začiatočníkov

Autor článku, ktorého preklad dnes uverejňujeme, hovorí, že je určený pre tých vývojárov, ktorí sa chcú naučiť Docker Compose a smerujú k vytvoreniu svojej prvej klient-server aplikácie pomocou Dockera. Predpokladá sa, že čitateľ tohto materiálu pozná základy Dockera. Ak to tak nie je, môžete sa pozrieť na toto séria materiálov na toto príspevok pokrývajúci základy Docker spolu so základmi Kubernetes a toto článok pre začiatočníkov.

Docker Compose Guide pre začiatočníkov

Čo je to Docker Compose?

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

Pri učení základov Dockeru ste sa mohli stretnúť s tvorbou jednoduchých aplikácií, ktoré fungujú autonómne a nezávisia napríklad od externých zdrojov dát alebo od určitých služieb. V praxi sú takéto aplikácie zriedkavé. Skutočné projekty zvyčajne zahŕňajú celý súbor aplikácií, ktoré spolupracujú.

Ako zistíte, že pri nasadzovaní projektu potrebujete použiť Docker Compose? Je to vlastne veľmi jednoduché. Ak na fungovanie tohto projektu používate viacero služieb, môže sa vám hodiť Docker Compose. Napríklad v situácii, keď vytvoria webovú stránku, ktorá sa potrebuje pripojiť k databáze, aby mohla autentifikovať používateľov. Takýto projekt môže pozostávať z dvoch služieb – tej, ktorá zabezpečuje chod stránky, a tej, ktorá je zodpovedná za údržbu databázy.

Technológia Docker Compose, aby sme ju opísali zjednodušeným spôsobom, vám umožňuje spustiť mnoho služieb jedným príkazom.

Rozdiel medzi Docker a Docker Compose

Docker sa používa na správu jednotlivých kontajnerov (služieb), ktoré tvoria aplikáciu.

Docker Compose sa používa na súčasné spravovanie viacerých kontajnerov, ktoré tvoria aplikáciu. Tento nástroj ponúka rovnaké možnosti ako Docker, no umožňuje vám pracovať so zložitejšími aplikáciami.

Docker Compose Guide pre začiatočníkov
Docker (jeden kontajner) a Docker Compose (viac kontajnerov)

Typický prípad použitia pre Docker Compose

Docker Compose je v správnych rukách veľmi výkonný nástroj, ktorý vám umožní veľmi rýchlo nasadiť aplikácie so zložitými architektúrami. Teraz sa pozrieme na príklad praktického použitia Docker Compose, ktorého analýza vám umožní vyhodnotiť výhody, ktoré vám používanie Docker Compose prinesie.

Predstavte si, že ste vývojárom webového projektu. Tento projekt zahŕňa dve webové stránky. Prvý umožňuje podnikateľom vytvárať online obchody len niekoľkými kliknutiami. Druhá je zameraná na zákaznícku podporu. Tieto dve lokality spolupracujú s rovnakou databázou.

Váš projekt je čoraz populárnejší a ukazuje sa, že výkon servera, na ktorom beží, už nestačí. V dôsledku toho sa rozhodnete presunúť celý projekt na iný stroj.

Bohužiaľ ste nepoužili niečo ako Docker Compose. Preto budete musieť preniesť a prekonfigurovať služby jednu po druhej a dúfať, že v tomto procese na nič nezabudnete.

Ak používate Docker Compose, presun projektu na nový server je záležitosť, ktorú možno vyriešiť spustením niekoľkých príkazov. Na dokončenie prenosu projektu na nové miesto je potrebné vykonať iba niektoré nastavenia a nahrať záložnú kópiu databázy na nový server.

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

Teraz, keď už viete, na čo budeme Docker Compose používať, je čas na vytvorenie vašej prvej klient-server aplikácie pomocou tohto nástroja. Konkrétne hovoríme o vývoji malej webovej stránky (serveru) v Pythone, ktorá dokáže vygenerovať súbor s fragmentom textu. Tento súbor vyžaduje zo servera program (klient), tiež napísaný v Pythone. Po prijatí súboru zo servera program zobrazí text v ňom uložený na obrazovke.

Upozorňujeme, že predpokladáme, že máte základné znalosti o Docker a že už máte nainštalovanú platformu Docker.

Začnime pracovať na projekte.

▍1. Vytvorenie projektu

Ak chcete vytvoriť svoju prvú aplikáciu klient-server, odporúčame vám začať vytvorením priečinka projektu. Mal by obsahovať nasledujúce súbory a priečinky:

  • súbor docker-compose.yml. Toto je súbor Docker Compose, ktorý bude obsahovať pokyny potrebné na spustenie a konfiguráciu služieb.
  • Dosky server. Bude obsahovať súbory potrebné na udržanie chodu servera.
  • Dosky client. Tu budú umiestnené súbory klientskej aplikácie.

V dôsledku toho by obsah hlavného priečinka vášho projektu mal vyzerať takto:

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

▍2. Vytvorenie servera

Tu sa v procese vytvárania servera dotkneme niektorých základných vecí týkajúcich sa Dockera.

2a. Vytváranie súborov

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

  • súbor server.py. Bude obsahovať kód servera.
  • súbor index.html. Tento súbor bude obsahovať časť textu, ktorý by mala klientska aplikácia vypísať.
  • súbor Dockerfile. Toto je súbor Docker, ktorý bude obsahovať pokyny potrebné na vytvorenie serverového prostredia.

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

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

2b. Úprava súboru Python.

Pridať 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 vám umožňuje vytvoriť jednoduchý webový server. Klientom odovzdá spis index.html, ktorej obsah sa neskôr zobrazí na webovej stránke.

2c. Úprava súboru HTML

Vyplniť index.html pridajte nasledujúci text:

Docker-Compose is magic!

Tento text bude odoslaný klientovi.

2d. Úprava súboru Dockerfile

Teraz vytvoríme jednoduchý súbor Dockerfile, ktorý bude zodpovedný za organizáciu runtime prostredia pre Python server. Ako základ pre vytvorený obrázok použijeme oficiálnym spôsobom, určený na spustenie programov napísaných v Pythone. Tu je obsah súboru 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 začnime pracovať na klientovi.

▍3. Vytvorenie klienta

Pri vytváraní klientskej strany nášho projektu si zapamätáme niektoré základy Dockera.

3a. Vytváranie súborov

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

  • súbor client.py. Klientsky kód sa bude nachádzať tu.
  • súbor Dockerfile. Tento súbor hrá rovnakú úlohu ako podobný súbor v priečinku servera. Konkrétne obsahuje inštrukcie, ktoré popisujú, ako vytvoriť prostredie na vykonávanie klientskeho kódu.

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

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

3b. Úprava súboru Python

Pridať 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()

Pomocou tohto kódu môže klientska aplikácia stiahnuť dáta zo servera a zobraziť ich na obrazovke.

3c. Úprava súboru Dockerfile

Rovnako ako v prípade servera, vytvoríme jednoduchý Dockerfile, zodpovedný za vytvorenie prostredia, v ktorom bude bežať klientska aplikácia Python. 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. Zatiaľ všetko, čo sa stalo, neprekročilo základy práce s Dockerom. Teraz začíname s Docker Compose. Ak to chcete urobiť, poďme do súboru docker-compose.yml, ktorý sa nachádza v koreňovom priečinku projektu.

Upozorňujeme, že sa tu nesnažíme pokryť úplne všetky príkazy, ktoré je možné použiť docker-compose.yml. Naším hlavným cieľom je prejsť si praktický príklad, ktorý vám poskytne základné znalosti Docker Compose.

Tu je kód, ktorý sa má 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. Budovanie projektu

Po dnu docker-compose.yml Všetky potrebné pokyny boli zadané, projekt je potrebné zostaviť. Tento krok našej práce je podobný ako pri použití príkazu docker build, ale príslušný príkaz je relevantný pre niekoľko služieb:

$ docker-compose build

▍6. Spustenie projektu

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

$ docker-compose up

Po vykonaní tohto príkazu by sa mal v termináli objaviť text stiahnutý klientom zo servera: Docker-Compose is magic!.

Ako už bolo spomenuté, server používa port počítača 1234 obsluhovať požiadavky klientov. Ak teda prejdete na adresu vo svojom prehliadači http://localhost:1234/, zobrazí sa stránka s textom Docker-Compose is magic!.

Užitočné príkazy

Pozrime sa na niektoré príkazy, ktoré by sa vám mohli hodiť pri práci s Docker Compose.

Tento príkaz vám umožňuje zastaviť a odstrániť kontajnery a iné prostriedky vytvorené príkazom docker-compose up:

$ docker-compose down

Tento príkaz vytlačí denníky služieb:

$ docker-compose logs -f [service name]

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

Pomocou tohto príkazu môžete zobraziť zoznam kontajnerov:

$ docker-compose ps

Tento príkaz vám umožňuje vykonať príkaz v spustenom kontajneri:

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

Môže to vyzerať napríklad takto: docker-compose exec server ls.

Tento príkaz vám umožňuje zobraziť zoznam obrázkov:

$ docker-compose images

Výsledky

Pozreli sme sa na základy práce s technológiou Docker Compose, ktorej znalosť vám umožní túto technológiu využiť a v prípade potreby ju začať hlbšie študovať. Tu úložisko s kódom pre projekt, na ktorý sme sa pozreli tu.

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

Docker Compose Guide pre začiatočníkov

Zdroj: hab.com

Pridať komentár