Autor článku, jehož překlad dnes publikujeme, říká, že je určen pro ty vývojáře, kteří chtějí pochopit Docker Compose a snaží se vytvořit svou první klient-server aplikaci pomocí Dockeru. Předpokládá se, že čtenář tohoto materiálu je obeznámen se základy Dockeru. Pokud tomu tak není — můžete se podívat na sérii materiálů, na publikaci, kde jsou základy Dockeru podrobně rozebrány spolu se základy Kubernetes, a na článek pro začátečníky.
Co je Docker Compose?
Docker Compose je nástroj, který je součástí Dockeru. Je určen k řešení problémů souvisejících s nasazením projektů.
Při studiu základů Dockeru jste se mohli setkat s vytvářením jednoduchých aplikací, které fungují samostatně, nezávisle například na externích zdrojích dat nebo nějakých službách. V praxi však podobné aplikace — vzácnost. Skutečné projekty obvykle zahrnují celou řadu aplikací, které spolupracují.
Jak zjistit, zda potřebujete při nasazování nějakého projektu využít Docker Compose? Ve skutečnosti — je to velmi jednoduché. Pokud k zajištění fungování tohoto projektu využíváte několik služeb, Docker Compose vám může přijít vhod. Například v situaci, kdy vytváříte webovou stránku, která pro provádění autentizace uživatelů potřebuje připojit se k databázi. Takový projekt může sestávat ze dvou služeb — jedné, která zajišťuje provoz webu, a druhé, která odpovídá za podporu databáze.
Technologie Docker Compose, zjednodušeně řečeno, umožňuje spustit několik služeb pomocí jednoho příkazu.
Rozdíl mezi Dockerem a Docker Compose
Docker se používá pro správu jednotlivých kontejnerů (služeb), ze kterých se aplikace skládá.
Docker Compose se používá pro současnou správu několika kontejnerů, které jsou součástí aplikace. Tento nástroj nabízí stejné možnosti jako Docker, ale umožňuje pracovat se složitějšími aplikacemi.

Docker (jednotlivý kontejner) a Docker Compose (více kontejnerů)
Typický scénář použití Docker Compose
Docker Compose je ve schopných rukou velmi mocný nástroj, který umožňuje velmi rychle nasazovat aplikace s komplexní architekturou. Nyní si ukážeme příklad praktického použití Docker Compose, jehož analýza vám umožní ocenit výhody, které vám používání Docker Compose přinese.
Představte si, že jste vývojář nějakého webového projektu. Tento projekt zahrnuje dva webové stránky. První umožňuje podnikatelům během několika kliknutí vytvořit internetový obchod. Druhý je zaměřen na podporu zákazníků. Tyto dvě stránky komunikují se stejnou databází.
Váš projekt se stává stále populárnějším a zjišťujete, že výkon serveru, na kterém běží, už nestačí. Rozhodnete se tedy převést celý projekt na jiný server.
Bohužel jste nic jako Docker Compose nepoužívali. Budete tedy muset přesouvat a přenastavovat služby jednu po druhé, doufaje, že na nic během této práce nezapomenete.
Pokud však používáte Docker Compose, pak je přesun vašeho projektu na nový server otázkou, která se řeší provedením několika příkazů. Abyste dokončili přesun projektu na nové místo, musíte provést jen několik nastavení a nahrát na nový server zálohu databáze.
Vývoj klient-server aplikace pomocí Docker Compose
Teď, když víte, k čemu máme v úmyslu použít Docker Compose, přišel čas vytvořit vaši první klient-server aplikaci pomocí tohoto nástroje. Konkrétně se jedná o vývoj malé webové stránky (serveru) v Pythonu, která umí vydat soubor s fragmentem textu. Tento soubor žádá o program (klient), také napsaný v Pythonu. Po obdržení souboru ze serveru program zobrazí text, který se v něm nachází, na obrazovce.
Všimněte si, že předpokládáme, že ovládáte základy Dockeru a že máte nainstalovanou platformu Docker.
Pojďme začít pracovat na projektu.
▍1. Vytvoření projektu
Abychom mohli postavit vaši první klient-server aplikaci, navrhuji začít s vytvořením složky projektu. Ta by měla obsahovat následující soubory a složky:
- Soubor
docker-compose.ymlToto je soubor Docker Compose, který bude obsahovat instrukce potřebné k spuštění a nastavení služeb. - Složka
serverBude obsahovat soubory potřebné pro zajištění chodu serveru. - Složka
clientZde budou umístěny soubory klientské aplikace.
Výsledkem by měl být obsah hlavního adresáře vašeho projektu:
.
├── client/
├── docker-compose.yml
└── server/
2 adresáře, 1 soubor▍2. Vytvoření serveru
Během procesu vytváření serveru se dotkneme několika základních věcí týkajících se Dockeru.
2a. Vytvoření souborů
Přejděte do složky server a vytvořte v ní následující soubory:
- Soubor
server.pyV něm bude umístěn kód serveru. - Soubor
index.htmlV tomto souboru bude umístěn fragment textu, který by mělo klientské aplikace zobrazit. - Soubor
DockerfileToto je soubor Docker, který bude obsahovat instrukce potřebné pro vytvoření prostředí serveru.
Takto by měl vypadat obsah vaší složky server/:
.
├── Dockerfile
├── index.html
└── server.py
0 adresářů, 3 soubory2b. Úprava Python souboru.
Přidáme do souboru server.py následující 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 vytvořit jednoduchý webový server. Ten bude vracet klientům soubor index.html, jehož obsah bude později zobrazen na webové stránce.
2c. Úprava HTML souboru
Do souboru index.html přidáme následující text:
Docker-Compose je magie!Tento text bude předán klientovi.
2d. Úprava souboru Dockerfile
Nyní vytvoříme jednoduchý soubor Dockerfile, který bude odpovídat za organizaci prostředí pro provoz Python serveru. Jako základ vytvořeného obrazu použijeme , určený k vykonávání programů napsaných v Pythonu. Zde 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/Teď se pustíme do práce na klientovi.
▍3. Vytvoření klienta
Při vytváření klientské části našeho projektu si při tom připomeneme některé základy Dockeru.
3a. Vytvoření souborů
Přejděte do složky vašeho projektu client a vytvořte v ní následující soubory:
- Soubor
client.py. Zde bude umístěn kód klienta. - Soubor
DockerfileTento soubor má stejnou funkci jako odpovídající soubor ve složce serveru. A to, že obsahuje instrukci, která popisuje vytvoření prostředí pro spuštění klientského kódu.
Výsledkem by měla být vaše složka client/ v této fázi práce by měla vypadat takto:
.
├── client.py
└── Dockerfile
0 adresářů, 2 soubory3b. Úprava Python souboru
Přidáme do souboru client.py následující 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()Díky tomuto kódu může klientská aplikace načíst data ze serveru a zobrazit je na obrazovce.
3c. Úprava souboru Dockerfile
Stejně jako u serveru vytváříme pro klienta jednoduchý Dockerfile, který je odpovědný za vytváření prostředí, ve kterém bude fungovat klientská aplikace Python. Tady je kód klienta Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Jak jste si mohli všimnout, vytvořili jsme dva různé projekty: server a klient. Každý z nich má svůj vlastní soubor Dockerfile. Dosud vše, co se dělo, spadá do základního použití Dockeru. Nyní se však začneme zabývat Docker Compose. Za tímto účelem se obrátíme na soubor docker-compose.yml, umístěný v kořenovém adresáři projektu.
Všimněte si, že se zde nesnažíme pokrýt všechny příkazy, které je možné použít v docker-compose.yml. Naším hlavním cílem je rozebrat praktický příklad, který vám poskytne základní znalosti o Docker Compose.
Tady je kód, který je třeba umístit do souboru 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. Sestavení projektu
Poté, co jsou v docker-compose.yml uvedeny všechny potřebné instrukce, je třeba projekt sestavit. Tento krok naší práce připomíná použití příkazu docker build, ale odpovídající příkaz se týká několika služeb:
$ docker-compose build▍6. Spuštění projektu
Nyní, když je projekt sestaven, přišel čas ho spustit. Tento krok naší práce odpovídá kroku, kdy se při práci s jednotlivými kontejnery spouští příkaz docker run:
$ docker-compose up Po provedení tohoto příkazu by se v terminálu měl objevit text, který klient načetl ze serveru: Docker-Compose je magie!.
Jak již bylo řečeno, server používá port počítače 1234 k obsluze požadavků klienta. Proto, pokud přejdete v prohlížeči na adresu , zobrazí se stránka s textem Docker-Compose je magie!.
Užitečné příkazy
Podívejme se na některé příkazy, které se vám mohou hodit při práci s Docker Compose.
Tento příkaz vám umožňuje zastavit a odstranit kontejnery a další zdroje vytvořené příkazem docker-compose up:
$ docker-compose downTento příkaz vykazuje protokoly služeb:
$ docker-compose logs -f [jméno služby] Například v našem projektu ho lze použít takto: $ docker-compose logs -f [jméno služby].
Pomocí tohoto příkazu můžete zobrazit seznam kontejnerů:
$ docker-compose psTento příkaz umožňuje vykonat příkaz v běžícím kontejneru:
$ docker-compose exec [jméno služby] [příkaz] Například může vypadat takto: docker-compose exec server ls.
Tento příkaz vám umožňuje zobrazit seznam obrazů:
$ docker-compose imagesZávěry
Prozkoumali jsme základy práce s technologií Docker Compose, jejichž znalost vám umožní tuto technologii používat a v případě zájmu přejít k jejímu hlubšímu studiu. repozitář s kódem projektu, který jsme zde zkoumali.
Vážení čtenáři! Používáte Docker Compose ve svých projektech?
Zdroj: habr.com
