„Docker Compose“ vadovas pradedantiesiems

Straipsnio, kurio vertimą šiandien skelbiame, autorius teigia, kad jis skirtas tiems kūrėjams, kurie nori išmokti „Docker Compose“ ir žengia link pirmosios kliento-serverio aplikacijos kūrimo naudojant „Docker“. Daroma prielaida, kad šios medžiagos skaitytojas yra susipažinęs su Docker pagrindais. Jei taip nėra, galite pažiūrėti tai medžiagų serija tai įrašas, apimantis „Docker“ pagrindus kartu su „Kubernetes“ pagrindais ir tai straipsnis pradedantiesiems.

„Docker Compose“ vadovas pradedantiesiems

Kas yra „Docker Compose“?

„Docker Compose“ yra įrankis, įtrauktas į „Docker“. Jis skirtas problemoms, susijusioms su projekto diegimu, spręsti.

Mokydamiesi „Docker“ pagrindų galėjote susidurti su paprastų programų, kurios veikia savarankiškai ir nepriklauso, pavyzdžiui, nuo išorinių duomenų šaltinių ar tam tikrų paslaugų, kūrimo. Praktiškai tokios programos yra retos. Tikri projektai paprastai apima daugybę programų, veikiančių kartu.

Kaip žinoti, ar diegiant projektą reikia naudoti „Docker Compose“? Iš tikrųjų tai labai paprasta. Jei naudojate kelias paslaugas, kad šis projektas veiktų, „Docker Compose“ gali būti naudingas. Pavyzdžiui, kai jie sukuria svetainę, kuri turi prisijungti prie duomenų bazės, kad būtų galima autentifikuoti vartotojus. Toks projektas gali susidėti iš dviejų paslaugų – tos, kuri užtikrina svetainės veikimą, ir tos, kuri atsakinga už duomenų bazės priežiūrą.

„Docker Compose“ technologija, norint ją apibūdinti supaprastintu būdu, leidžia paleisti daugybę paslaugų viena komanda.

Skirtumas tarp „Docker“ ir „Docker Compose“.

„Docker“ naudojama atskiriems konteineriams (paslaugoms), kurie sudaro programą, valdyti.

„Docker Compose“ naudojama norint vienu metu valdyti kelis konteinerius, kurie sudaro programą. Šis įrankis siūlo tas pačias galimybes kaip ir Docker, tačiau leidžia dirbti su sudėtingesnėmis programomis.

„Docker Compose“ vadovas pradedantiesiems
„Docker“ (vienas konteineris) ir „Docker Compose“ (keli konteineriai)

Įprastas Docker Compose naudojimo atvejis

„Docker Compose“ yra labai galingas įrankis, leidžiantis labai greitai įdiegti sudėtingos architektūros programas. Dabar apžvelgsime praktinio Docker Compose panaudojimo pavyzdį, kurio analizė leis įvertinti naudą, kurią jums suteiks Docker Compose naudojimas.

Įsivaizduokite, kad esate interneto projekto kūrėjas. Šis projektas apima dvi svetaines. Pirmoji leidžia verslo žmonėms sukurti internetines parduotuves vos keliais paspaudimais. Antrasis skirtas klientų aptarnavimui. Šios dvi svetainės sąveikauja su ta pačia duomenų baze.

Jūsų projektas tampa vis populiaresnis ir pasirodo, kad serverio, kuriame jis veikia, galios nebepakanka. Dėl to nusprendžiate perkelti visą projektą į kitą įrenginį.

Deja, nenaudojote tokio dalyko kaip „Docker Compose“. Todėl paslaugas turėsite perkelti ir perkonfigūruoti po vieną, tikėdamiesi, kad nieko nepamiršite.

Jei naudojate „Docker Compose“, projekto perkėlimas į naują serverį yra problema, kurią galima išspręsti vykdant kelias komandas. Norint užbaigti projekto perkėlimą į naują vietą, tereikia atlikti kai kuriuos nustatymus ir į naują serverį įkelti atsarginę duomenų bazės kopiją.

Kliento ir serverio programos kūrimas naudojant „Docker Compose“.

Dabar, kai žinote, kam naudosime „Docker Compose“, laikas sukurti savo pirmąją kliento-serverio programą naudodami šį įrankį. Būtent, mes kalbame apie mažos svetainės (serverio) kūrimą Python, kuri gali išvesti failą su teksto fragmentu. Šio failo iš serverio prašo programa (klientas), taip pat parašyta Python. Gavusi failą iš serverio, programa ekrane parodo jame saugomą tekstą.

Atkreipkite dėmesį, kad manome, kad turite pagrindinius Docker supratimus ir jau turite įdiegę Docker platformą.

Pradėkime dirbti su projektu.

▍1. Projekto kūrimas

Norėdami sukurti savo pirmąją kliento-serverio programą, siūlau pradėti nuo projekto aplanko kūrimo. Jame turėtų būti šie failai ir aplankai:

  • byla docker-compose.yml. Tai yra „Docker Compose“ failas, kuriame bus instrukcijos, reikalingos paslaugoms paleisti ir konfigūruoti.
  • Aplankas server. Jame bus failai, reikalingi serveriui palaikyti.
  • Aplankas client. Kliento programų failai bus čia.

Dėl to jūsų projekto pagrindinio aplanko turinys turėtų atrodyti taip:

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

▍2. Serverio kūrimas

Čia, kurdami serverį, paliesime keletą pagrindinių „Docker“ dalykų.

2a. Failų kūrimas

Eikite į aplanką server ir sukurkite jame šiuos failus:

  • byla server.py. Jame bus serverio kodas.
  • byla index.html. Šiame faile bus teksto dalis, kurią turi išvesti kliento programa.
  • byla Dockerfile. Tai Docker failas, kuriame bus instrukcijos, reikalingos serverio aplinkai sukurti.

Taip turėtų atrodyti jūsų aplanko turinys server/:

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

2b. Python failo redagavimas.

Pridėti prie failo server.py šis kodas:

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

Šis kodas leidžia sukurti paprastą žiniatinklio serverį. Jis pateiks klientams bylą index.html, kurio turinys vėliau bus rodomas tinklalapyje.

2c. HTML failo redagavimas

Į failą index.html pridėti šį tekstą:

Docker-Compose is magic!

Šis tekstas bus išsiųstas klientui.

2d. Docker failo redagavimas

Dabar sukursime paprastą failą Dockerfile, kuris bus atsakingas už Python serverio vykdymo aplinkos organizavimą. Kaip sukurto įvaizdžio pagrindą naudosime oficialiu būdu, skirtas paleisti programas, parašytas Python. Štai Dockerfile turinys:

# На всякий случай напоминаю, что 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/

Dabar pradėkime dirbti su klientu.

▍3. Kliento sukūrimas

Kurdami savo projekto kliento pusę, prisiminsime kai kuriuos „Docker“ pagrindus.

3a. Failų kūrimas

Eikite į savo projekto aplanką client ir sukurkite jame šiuos failus:

  • byla client.py. Kliento kodas bus čia.
  • byla Dockerfile. Šis failas atlieka tą patį vaidmenį kaip ir panašus failas serverio aplanke. Būtent jame yra instrukcijos, aprašančios, kaip sukurti aplinką kliento kodui vykdyti.

Dėl to jūsų aplankas client/ šiame darbo etape jis turėtų atrodyti taip:

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

3b. Python failo redagavimas

Pridėti prie failo client.py šis kodas:

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

Su šiuo kodu kliento programa gali atsisiųsti duomenis iš serverio ir parodyti juos ekrane.

3c. Docker failo redagavimas

Kaip ir serverio atveju, sukuriame paprastą Dockerfile, atsakingas už aplinkos, kurioje veiks Python kliento programa, sukūrimą. Čia yra kliento kodas Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. „Docker Compose“.

Kaip jau supratote, sukūrėme du skirtingus projektus: serverį ir klientą. Kiekvienas iš jų turi savo failą Dockerfile. Iki šiol viskas, kas įvyko, neperžengė darbo su „Docker“ pagrindų. Dabar pradedame naudoti „Docker Compose“. Norėdami tai padaryti, eikime į failą docker-compose.yml, esantis projekto šakniniame aplanke.

Atkreipkite dėmesį, kad čia mes nesistengiame aprėpti absoliučiai visų komandų, kurias galima naudoti docker-compose.yml. Pagrindinis mūsų tikslas – pateikti praktinį pavyzdį, kuris suteiks jums pagrindinių „Docker Compose“ žinių.

Čia yra kodas, kurį reikia įdėti į failą 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. Projekto kūrimas

Įėjus docker-compose.yml Įvestos visos reikalingos instrukcijos, reikia surinkti projektą. Šis mūsų darbo žingsnis yra panašus į komandos naudojimą docker build, tačiau atitinkama komanda yra svarbi kelioms paslaugoms:

$ docker-compose build

▍6. Projekto paleidimas

Dabar, kai projektas surinktas, laikas jį pradėti. Šis mūsų darbo žingsnis atitinka žingsnį, kuriame, dirbant su atskirais konteineriais, vykdoma komanda docker run:

$ docker-compose up

Įvykdžius šią komandą, terminale turėtų pasirodyti tekstas, kurį klientas atsisiuntė iš serverio: Docker-Compose is magic!.

Kaip jau minėta, serveris naudoja kompiuterio prievadą 1234 patenkinti klientų pageidavimus. Todėl, jei einate adresu savo naršyklėje http://localhost:1234/, bus rodomas puslapis su tekstu Docker-Compose is magic!.

Naudingos komandos

Pažvelkime į keletą komandų, kurios gali būti naudingos dirbant su Docker Compose.

Ši komanda leidžia sustabdyti ir ištrinti konteinerius bei kitus komandos sukurtus išteklius docker-compose up:

$ docker-compose down

Ši komanda spausdina paslaugų žurnalus:

$ docker-compose logs -f [service name]

Pavyzdžiui, mūsų projekte jis gali būti naudojamas tokia forma: $ docker-compose logs -f [service name].

Naudodami šią komandą galite parodyti konteinerių sąrašą:

$ docker-compose ps

Ši komanda leidžia vykdyti komandą veikiančiame konteineryje:

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

Pavyzdžiui, tai gali atrodyti taip: docker-compose exec server ls.

Ši komanda leidžia rodyti vaizdų sąrašą:

$ docker-compose images

rezultatai

Apžvelgėme darbo su „Docker Compose“ technologija pagrindus, kurių žinios leis naudotis šia technologija ir, jei norite, pradėti ją gilinti. Čia saugykla su projekto, kurį čia peržiūrėjome, kodu.

Mieli skaitytojai! Ar savo projektuose naudojate „Docker Compose“?

„Docker Compose“ vadovas pradedantiesiems

Šaltinis: www.habr.com

Добавить комментарий