Ghid Docker Compose pentru începători

Autorul articolului, pe care îl publicăm astăzi, spune că acesta este destinat acelor dezvoltatori care doresc să învețe Docker Compose și sunt pe cale să creeze prima lor aplicație client-server folosind Docker. Se presupune că cititorul acestui material este familiarizat cu elementele de bază ale Docker. Dacă nu este cazul, puteți arunca o privire la acest serie de materiale acest o postare care acoperă elementele de bază ale Docker împreună cu elementele de bază ale Kubernetes și acest articol pentru incepatori.

Ghid Docker Compose pentru începători

Ce este Docker Compose?

Docker Compose este un instrument inclus cu Docker. Este conceput pentru a rezolva probleme legate de implementarea proiectelor.

În timp ce învățați elementele de bază ale Docker, este posibil să fi întâlnit crearea celor mai simple aplicații care funcționează autonom, nedepinzând, de exemplu, de surse de date externe sau de anumite servicii. În practică, astfel de aplicații sunt rare. Proiectele reale implică de obicei un întreg set de aplicații colaborative.

Cum știi dacă trebuie să folosești Docker Compose atunci când implementezi un proiect? De fapt, este foarte simplu. Dacă utilizați mai multe servicii pentru a rula acest proiect, atunci Docker Compose ar putea fi util. De exemplu, într-o situație în care creați un site web care, pentru a efectua autentificarea utilizatorului, trebuie să se conecteze la o bază de date. Un astfel de proiect poate consta din două servicii - unul care asigură funcționarea site-ului și unul care este responsabil de susținerea bazei de date.

Tehnologia Docker Compose, dacă o descrieți într-un mod simplificat, vă permite să porniți mai multe servicii cu o singură comandă.

Diferența dintre Docker și Docker Compose

Docker este utilizat pentru a gestiona containerele (serviciile) individuale care alcătuiesc o aplicație.

Docker Compose este folosit pentru a gestiona mai multe containere care fac parte dintr-o aplicație în același timp. Acest instrument oferă aceleași caracteristici ca și Docker, dar vă permite să lucrați cu aplicații mai complexe.

Ghid Docker Compose pentru începători
Docker (container unic) și Docker Compose (containere multiple)

Caz de utilizare tipic Docker Compose

Docker Compose este, în mâinile potrivite, un instrument foarte puternic care vă permite să implementați rapid aplicații cu arhitecturi complexe. Acum vom analiza un exemplu de utilizare practică a Docker Compose, a cărui analiză vă va permite să evaluați beneficiile pe care vi le va oferi utilizarea Docker Compose.

Imaginați-vă că sunteți dezvoltatorul unui proiect web. Acest proiect include două site-uri web. Prima permite oamenilor de afaceri să creeze, cu doar câteva clicuri, magazine online. Al doilea vizează suportul pentru clienți. Aceste două site-uri interacționează cu aceeași bază de date.

Proiectul tău devine din ce în ce mai popular și se dovedește că capacitatea serverului pe care funcționează nu mai este suficientă. Ca urmare, decideți să transferați întregul proiect pe o altă mașină.

Din păcate, nu ați folosit ceva de genul Docker Compose. Prin urmare, va trebui să migrați și să reconfigurați serviciile pe rând, în speranța că nu veți uita nimic în procesul acestei lucrări.

Dacă utilizați Docker Compose, atunci migrarea proiectului pe un nou server este o problemă care poate fi rezolvată prin rularea câtorva comenzi. Pentru a finaliza transferul proiectului într-o locație nouă, trebuie doar să faceți câteva setări și să încărcați o copie de rezervă a bazei de date pe noul server.

Dezvoltarea unei aplicații client-server folosind Docker Compose

Acum că știți pentru ce vom folosi Docker Compose, este timpul să vă creați prima aplicație client/server folosind acest instrument. Și anume, vorbim despre dezvoltarea unui mic site web (server) în Python, care poate produce un fișier cu un fragment de text. Acest fișier este solicitat de la server de un program (client), scris tot în Python. După ce a primit fișierul de la server, programul afișează textul stocat în el pe ecran.

Vă rugăm să rețineți că presupunem că aveți elementele de bază ale Docker și că aveți deja instalată platforma Docker.

Să începem să lucrăm la proiect.

▍1. Creați un proiect

Pentru a vă construi prima aplicație client/server, vă sugerez să începeți prin a crea un folder de proiect. 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 porni și configura serviciile.
  • Dosar server. Acesta va conține fișierele necesare pentru ca serverul să funcționeze.
  • Dosar client. Aici vor fi localizate fișierele aplicației client.

Ca rezultat, conținutul folderului principal al proiectului dvs. ar trebui să arate astfel:

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

▍2. Crearea serverului

Aici, în procesul de creare a unui server, vom atinge câteva lucruri de bază referitoare la Docker.

2a. Crearea fișierelor

Accesați folderul server și creați următoarele fișiere în el:

  • fișier server.py. Acesta va conține codul serverului.
  • fișier index.html. Acest fișier va conține o bucată de text pe care aplicația client ar trebui să o afișeze.
  • fișier Dockerfile. Acesta este fișierul Docker care va conține instrucțiunile necesare pentru a crea mediul server.

Așa ar trebui să arate conținutul folderului tău server/:

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

2b. Editarea unui fișier Python.

Adăugați la 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 vă permite să creați un server web simplu. El va oferi clienților un dosar index.html, al cărui conținut va fi afișat ulterior pe pagina web.

2c. Editarea unui fișier HTML

La dosar index.html adăugați următorul text:

Docker-Compose is magic!

Acest text va fi trimis clientului.

2d. Editarea fișierului Docker

Acum vom crea un fișier simplu Dockerfile, care va fi responsabil de organizarea mediului de rulare pentru serverul Python. Ca bază a imaginii create, vom folosi oficial, conceput pentru a rula programe scrise în Python. Iată conținutul fișierului 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 să lucrăm la client.

▍3. Creați un client

În timp ce creăm partea client a proiectului nostru, ne vom aminti câteva elemente de bază Docker pe parcurs.

3a. Crearea fișierelor

Accesați folderul de proiect client și creați următoarele fișiere în el:

  • fișier client.py. Aici va fi codul clientului.
  • fișier Dockerfile. Acest fișier joacă același rol ca un fișier similar din folderul serverului. Și anume, conține o instrucțiune care descrie cum se creează un mediu pentru executarea codului client.

Ca rezultat, folderul dvs client/ În această etapă ar trebui să arate astfel:

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

3b. Editarea unui fișier Python

Adăugați la 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 Docker

Ca și în cazul serverului, creăm pentru client un simplu Dockerfile, responsabil pentru modelarea mediului în care va rula aplicația client Python. Aici este codul clientului Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

După cum puteți vedea, am creat două proiecte diferite: server și client. Fiecare dintre ele are propriul dosar Dockerfile. Până acum, tot ceea ce se întâmplă nu depășește elementele de bază ale lucrului cu Docker. Acum începem să lucrăm cu Docker Compose. Pentru a face acest lucru, consultați fișierul docker-compose.ymlsituat în folderul rădăcină al proiectului.

Vă rugăm să rețineți că aici nu ne propunem să acoperim absolut toate comenzile care pot fi utilizate în docker-compose.yml. Scopul nostru principal este să descompunem un exemplu practic care vă oferă cunoștințe de bază despre Docker Compose.

Iată codul de pus în fișier 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. Construire proiect

Dupa in docker-compose.yml au fost făcute toate instrucțiunile necesare, proiectul trebuie asamblat. Acest pas al muncii noastre seamănă cu utilizarea comenzii docker build, dar comanda corespunzătoare este legată de mai multe servicii:

$ docker-compose build

▍6. Lansarea proiectului

Acum că proiectul este construit, este timpul să-l derulăm. Acest pas al muncii noastre corespunde pasului la care, atunci când lucrați cu containere individuale, comanda este executată docker run:

$ docker-compose up

După executarea acestei comenzi, textul încărcat de client de pe server ar trebui să apară în terminal: Docker-Compose is magic!.

După cum sa menționat deja, serverul folosește portul computerului 1234 pentru a servi cererile clienților. Prin urmare, dacă intri în browser la adresa http://localhost:1234/, va afișa o pagină cu text Docker-Compose is magic!.

Comenzi utile

Să aruncăm o privire la unele dintre comenzile pe care le-ați putea găsi utile atunci când lucrați cu Docker Compose.

Această comandă vă permite să opriți și să ștergeți containerele și alte resurse create de comandă docker-compose up:

$ docker-compose down

Această comandă tipărește jurnalele de service:

$ docker-compose logs -f [service name]

De exemplu, în proiectul nostru poate fi folosit sub această formă: $ docker-compose logs -f [service name].

Cu această comandă, puteți afișa o listă de containere:

$ docker-compose ps

Această comandă vă permite să executați o comandă într-un container care rulează:

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

De exemplu, ar putea arăta astfel: docker-compose exec server ls.

Această comandă vă permite să afișați o listă de imagini:

$ docker-compose images

Rezultatele

Am acoperit elementele de bază ale lucrului cu tehnologia Docker Compose, a cărei cunoaștere vă va permite să utilizați această tehnologie și, dacă doriți, să începeți să o studiați mai în profunzime. Aici depozit cu codul proiectului, pe care l-am considerat aici.

Dragi cititori! Folosiți Docker Compose în proiectele dvs.?

Ghid Docker Compose pentru începători

Sursa: www.habr.com

Adauga un comentariu