Autorul articolului, a cărui traducere o publicăm astăzi, afirmă că acesta este destinat dezvoltatorilor care doresc să învețe Docker Compose și se îndreaptă spre crearea primei lor aplicații client-server utilizând Docker. Se presupune că cititorul acestui material are cunoștințe de bază despre Docker. Dacă nu este cazul — puteți arunca o privire la serie de materiale, la publicația în care conceptele de bază ale Docker sunt prezentate împreună cu cele ale Kubernetes, și la articolul pentru începători.
Ce este Docker Compose?
Docker Compose este un instrument inclus în Docker. Este destinat soluționării problemelor legate de desfășurarea proiectelor.
Studiind conceptele de bază ale Docker, este posibil să fi dat peste crearea unor aplicații simple care funcționează autonom, nefiind dependente, de exemplu, de surse externe de date sau de anumite servicii. În practică, însă, astfel de aplicații sunt rare. Proiectele reale includ, de obicei, un întreg set de aplicații care colaborează.
Cum să știți dacă aveți nevoie de Docker Compose la desfășurarea unui proiect? De fapt, este foarte simplu. Dacă pentru funcționarea proiectului sunt utilizate mai multe servicii, atunci Docker Compose vă poate fi util. De exemplu, în situația în care se construiește un site web care, pentru a efectua autentificarea utilizatorilor, trebuie să se conecteze la o bază de date. Un astfel de proiect poate constă din două servicii — cel care asigură funcționarea site-ului și cel care se ocupă cu suportul bazei de date.
Tehnologia Docker Compose, dacă o descriem simplificat, permite, printr-o singură comandă, lansarea mai multor servicii.
Diferența dintre Docker și Docker Compose
Docker este utilizat pentru gestionarea containerelor individuale (serviciilor) din care este compusă aplicația.
Docker Compose este folosit pentru gestionarea simultană a mai multor containere care fac parte din aplicație. Acest instrument oferă aceleași capabilități ca și Docker, dar permite lucrul cu aplicații mai complexe.

Docker (container individual) și Docker Compose (mai multe containere)
Un scenariu tipic de utilizare a Docker Compose
Docker Compose este, în mâini pricepute, un instrument foarte puternic, care permite desfășurarea rapidă a aplicațiilor cu arhitecturi complexe. Acum vom analiza un exemplu practic de utilizare a Docker Compose, a cărui analiză vă va permite să evaluați avantajele pe care le va oferi utilizarea Docker Compose.
Imaginați-vă că sunteți un dezvoltator al unui anumit proiect web. Acest proiect include două site-uri web. Primul permite antreprenorilor să creeze, în câteva clicuri, magazine online. Al doilea este dedicat suportului clienților. Aceste două site-uri interacționează cu aceeași bază de date.
Proiectul dumneavoastră devine tot mai popular și constatați că resursele serverului pe care funcționează nu sunt suficiente. Ca urmare, decideți să mutați întregul proiect pe o altă mașină.
Din păcate, nu ați folosit ceva de genul Docker Compose. Așadar, va trebui să mutați și să reconfigurați serviciile una câte una, sperând că în procesul acesta nu veți uita nimic.
Dacă utilizați Docker Compose, atunci mutarea proiectului pe un nou server este o problemă care se rezolvă prin executarea câtorva comenzi. Pentru a finaliza mutarea proiectului pe noua locație, trebuie doar să efectuați câteva setări și să încărcați pe noul server o copie de rezervă a bazei de date.
Dezvoltarea unei aplicații client-server folosind Docker Compose
Acum că știți pentru ce vom folosi Docker Compose, a venit timpul să creați prima dumneavoastră aplicație client-server folosind acest instrument. Mai exact, este vorba despre dezvoltarea unui site web mic (server) în Python, care poate returna un fișier cu un fragment de text. Acest fișier este solicitat de un program (client), de asemenea scris în Python. După ce primește fișierul de la server, programul afișează textul stocat în acesta pe ecran.
Vă rugăm să rețineți că ne așteptăm să aveți o bază solidă în Docker și că platforma Docker este deja instalată pe sistemul dumneavoastră.
Să începem lucrul la proiect.
▍1. Crearea proiectului
Pentru a construi prima dumneavoastră aplicație client-server, vă propun să începeți prin a crea un folder pentru proiect. Acesta ar trebui să conțină următoarele fișiere și foldere:
- Fișier
docker-compose.yml. Acesta este un fișier Docker Compose, care va conține instrucțiunile necesare pentru a lansa și configura serviciile. - Folder
server. El va conține fișierele necesare pentru funcționarea serverului. - Folder
client. Aici vor fi fișierele aplicației client.
Prin urmare, conținutul folderului principal al proiectului dumneavoastră ar trebui să arate astfel:
.
├── client/
├── docker-compose.yml
└── server/
2 directoare, 1 fișier▍2. Crearea serverului
Aici, în timpul creării serverului, vom aborda câteva aspecte de bază legate de Docker.
2a. Crearea fișierelor
Accesați folderul server și creați în el următoarele fișiere:
- Fișier
server.py. Acesta va conține codul serverului. - Fișier
index.html. În acest fișier va fi un fragment de text pe care aplicația client ar trebui să-l afișeze. - Fișier
Dockerfile. Acesta este un fișier Docker, care va conține instrucțiunile necesare pentru a crea mediul serverului.
Iată cum ar trebui să arate conținutul folderului dumneavoastră server/:
.
├── Dockerfile
├── index.html
└── server.py
0 directoare, 3 fișiere2b. Editarea fișierului Python.
Să adăugăm în fișier server.py următorul cod:
#!/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() Acest cod permite crearea unui server web simplu. Acesta va returna clienților fișierul index.html, al cărui conținut va fi ulterior afișat pe pagina web.
2c. Editarea fișierului HTML
În fișierul index.html să adăugăm următorul text:
Docker-Compose este magic!Acest text va fi transmis clientului.
2d. Editarea fișierului Dockerfile
Acum vom crea un fișier simplu Dockerfile, care va fi responsabil pentru organizarea mediului de execuție pentru serverul Python. Ca bază pentru imaginea creată, vom folosi , destinată executării programelor scrise în Python. Iată conținutul 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/Acum vom lucra la client.
▍3. Crearea clientului
În timp ce creăm partea client a proiectului nostru, ne vom aminti unele noțiuni de bază despre Docker.
3a. Crearea fișierelor
Accesați folderul proiectului dumneavoastră client și creați în el următoarele fișiere:
- Fișier
client.py. Aici va fi codul clientului. - Fișier
Dockerfile. Acest fișier îndeplinește aceeași funcție ca și fișierul similar din folderul serverului. Adică, conține instrucțiunea care descrie crearea mediului pentru executarea codului client.
Prin urmare, folderul dumneavoastră client/ în această etapă a lucrului ar trebui să arate astfel:
.
├── client.py
└── Dockerfile
0 directoare, 2 fișiere3b. Editarea fișierului Python
Să adăugăm în fișier client.py următorul cod:
#!/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()Datorită acestui cod, aplicația client poate descărca date de pe server și le poate afișa pe ecran.
3c. Editarea fișierului Dockerfile
La fel ca în cazul serverului, creăm pentru client un simplu Dockerfile, responsabil pentru formarea mediului în care va funcționa aplicația client Python. Iată codul clientului Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Așa cum ați observat, am creat două proiecte diferite: server și client. Fiecare dintre ele are propriul său fișier Dockerfile. Până acum, tot ce s-a întâmplat nu depășește cadrul de bază al lucrului cu Docker. Acum ne concentrăm pe lucrul cu Docker Compose. În acest sens, să ne uităm la fișierul docker-compose.yml, situat în directorul rădăcină al proiectului.
Rețineți că aici nu ne străduim să examinăm absolut toate comenzile care pot fi utilizate în docker-compose.yml. Scopul nostru principal este să dezbatem un exemplu practic care să vă ofere cunoștințe de bază despre Docker Compose.
Iată codul care trebuie plasat în fișierul 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. Construirea proiectului
După ce în docker-compose.yml sunt incluse toate instrucțiunile necesare, proiectul trebuie construit. Această etapă a muncii noastre amintește de utilizarea comenzii docker build, dar comanda corespunzătoare se referă la mai multe servicii:
$ docker-compose build▍6. Lansarea proiectului
Acum, când proiectul este construit, a venit timpul să-l lansăm. Această etapă a muncii noastre corespunde pașului în care, atunci când lucrăm cu containere separate, se execută comanda docker run:
$ docker-compose up După executarea acestei comenzi, în terminal ar trebui să apară textul, încărcat de client de pe server: Docker-Compose este magic!.
Așa cum s-a menționat deja, serverul utilizează portul computerului 1234 pentru a gestiona cererile clientului. Prin urmare, dacă se accesează în browser adresa , va fi afișată o pagină cu textul Docker-Compose este magic!.
Comenzi utile
Să examinăm câteva comenzi care vă pot fi utile în lucrul cu Docker Compose.
Această comandă permite oprirea și ștergerea containerelor și altor resurse create de comanda docker-compose up:
$ docker-compose downAceastă comandă generează jurnalele serviciilor:
$ docker-compose logs -f [service name] De exemplu, în proiectul nostru poate fi utilizată în următoarea formă: $ docker-compose logs -f [service name].
Prin această comandă se poate afișa lista containerelor:
$ docker-compose psAceastă comandă permite executarea unei comenzi într-un container în execuție:
$ docker-compose exec [service name] [command] De exemplu, aceasta poate arăta astfel: docker-compose exec server ls.
Această comandă permite afișarea listei imaginilor:
$ docker-compose imagesConcluzii
Am analizat bazele utilizării tehnologiei Docker Compose, cunoștințele fiind esențiale pentru a folosi această tehnologie și, dacă doriți, pentru a începe o studiu mai profund al acesteia. un repository cu codul proiectului pe care l-am discutat aici.
Stimați cititori! Folositi Docker Compose în proiectele voastre?
Sursa: habr.com
