Водич за почетнике за Доцкер Цомпосе

Аутор чланка, чији превод данас објављујемо, каже да је намењен оним програмерима који желе да науче Доцкер Цомпосе и крећу ка креирању своје прве клијент-сервер апликације користећи Доцкер. Претпоставља се да је читалац овог материјала упознат са основама Доцкер-а. Ако то није случај, можете погледати ово серија материјала на ово пост који покрива основе Доцкер-а заједно са основама Кубернетеса, и ово чланак за почетнике.

Водич за почетнике за Доцкер Цомпосе

Шта је Доцкер Цомпосе?

Доцкер Цомпосе је алатка укључена у Доцкер. Дизајниран је за решавање проблема везаних за имплементацију пројекта.

Док сте учили основе Доцкер-а, можда сте наишли на креирање једноставних апликација које раде аутономно и не зависе, на пример, од спољних извора података или одређених услуга. У пракси су такве апликације ретке. Прави пројекти обично укључују читав скуп апликација које раде заједно.

Како знате да ли треба да користите Доцкер Цомпосе приликом постављања пројекта? То је заправо врло једноставно. Ако користите више услуга да би овај пројекат функционисао, Доцкер Цомпосе може бити од користи. На пример, у ситуацији када креирају веб локацију која треба да се повеже са базом података како би се аутентификовала корисници. Такав пројекат може се састојати од две службе – оне која обезбеђује рад сајта и оне која је задужена за одржавање базе података.

Технологија Доцкер Цомпосе, да је опишем на поједностављен начин, омогућава вам да покренете многе услуге једном командом.

Разлика између Доцкер-а и Доцкер Цомпосе-а

Доцкер се користи за управљање појединачним контејнерима (услугама) који чине апликацију.

Доцкер Цомпосе се користи за истовремено управљање више контејнера који чине апликацију. Овај алат нуди исте могућности као Доцкер, али вам омогућава да радите са сложенијим апликацијама.

Водич за почетнике за Доцкер Цомпосе
Доцкер (један контејнер) и Доцкер Цомпосе (више контејнера)

Типичан случај употребе за Доцкер Цомпосе

Доцкер Цомпосе је, у правим рукама, веома моћан алат који вам омогућава да врло брзо примените апликације са сложеном архитектуром. Сада ћемо погледати пример практичне употребе Доцкер Цомпосе, чија ће вам анализа омогућити да процените предности које ће вам донети коришћење Доцкер Цомпосе.

Замислите да сте програмер веб пројекта. Овај пројекат укључује две веб странице. Први омогућава пословним људима да креирају онлајн продавнице са само неколико кликова. Други је усмерен на корисничку подршку. Ова два сајта комуницирају са истом базом података.

Ваш пројекат постаје све популарнији, а испоставило се да снага сервера на коме ради више није довољна. Као резултат тога, одлучујете да преместите цео пројекат на другу машину.

Нажалост, нисте користили нешто попут Доцкер Цомпосе. Због тога ћете морати да преносите и поново конфигуришете услуге једну по једну, надајући се да нећете ништа заборавити у процесу.

Ако користите Доцкер Цомпосе, онда је премештање вашег пројекта на нови сервер ствар која се може решити покретањем неколико команди. Да бисте довршили пренос пројекта на нову локацију, потребно је само да извршите нека подешавања и да отпремите резервну копију базе података на нови сервер.

Развој клијент-сервер апликације користећи Доцкер Цомпосе

Сада када знате за шта ћемо користити Доцкер Цомпосе, време је да креирате своју прву клијент-сервер апликацију користећи овај алат. Наиме, реч је о развоју мале веб странице (сервера) у Питхон-у који може да избаци датотеку са фрагментом текста. Ову датотеку захтева од сервера програм (клијент), такође написан у Питхон-у. Након што добије датотеку са сервера, програм приказује текст сачуван у њој на екрану.

Имајте на уму да претпостављамо да имате основно разумевање Доцкер-а и да већ имате инсталирану Доцкер платформу.

Хајде да почнемо да радимо на пројекту.

▍1. Креирање пројекта

Да бисте направили своју прву клијент/сервер апликацију, предлажем да почнете са креирањем фасцикле пројекта. Требало би да садржи следеће датотеке и фасцикле:

  • фајл docker-compose.yml. Ово је датотека Доцкер Цомпосе која ће садржати упутства потребна за покретање и конфигурисање услуга.
  • Фасцикла server. Садржаће датотеке неопходне да би сервер радио.
  • Фасцикла client. Датотеке клијентске апликације ће се налазити овде.

Као резултат, садржај главне фасцикле вашег пројекта би требало да изгледа овако:

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

▍2. Креирање сервера

Овде, у процесу креирања сервера, дотакћемо се неких основних ствари у вези са Доцкером.

2а. Креирање датотека

Идите у фасциклу server и креирајте следеће датотеке у њему:

  • фајл server.py. Садржаће код сервера.
  • фајл index.html. Ова датотека ће садржати део текста који клијентска апликација треба да избаци.
  • фајл Dockerfile. Ово је Доцкер датотека која ће садржати упутства потребна за креирање серверског окружења.

Овако би требало да изгледа садржај ваше фасцикле server/:

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

2б. Уређивање Питхон датотеке.

Додај у датотеку server.py следећи код:

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

Овај код вам омогућава да креирате једноставан веб сервер. Он ће клијентима дати досије index.html, чији ће садржај касније бити приказан на веб страници.

2ц. Уређивање ХТМЛ датотеке

Да поднесе index.html додати следећи текст:

Docker-Compose is magic!

Овај текст ће бити послат клијенту.

2д. Уређивање Доцкерфиле-а

Сада ћемо креирати једноставну датотеку 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/

Сада почнимо да радимо на клијенту.

▍3. Креирање клијента

Док креирамо клијентску страну нашег пројекта, успут ћемо се сетити неких Доцкер основа.

3а. Креирање датотека

Идите у фасциклу свог пројекта client и креирајте следеће датотеке у њему:

  • фајл client.py. Клијентски код ће се налазити овде.
  • фајл Dockerfile. Ова датотека игра исту улогу као слична датотека у фасцикли сервера. Наиме, садржи упутства која описују како креирати окружење за извршавање клијентског кода.

Као резултат, ваш фолдер client/ у овој фази рада би требало да изгледа овако:

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

3б. Уређивање Питхон датотеке

Додај у датотеку client.py следећи код:

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

Са овим кодом, клијентска апликација може преузети податке са сервера и приказати их на екрану.

3ц. Уређивање Доцкерфиле-а

Као иу случају сервера, креирамо једноставан Dockerfile, одговоран за креирање окружења у којем ће се покретати Питхон клијентска апликација. Овде је код клијента Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Доцкер Цомпосе

Као што сте можда приметили, направили смо два различита пројекта: сервер и клијент. Сваки од њих има свој фајл Dockerfile. До сада, све што се догодило није ишло даље од основа рада са Доцкером. Сада почињемо са Доцкер Цомпосе. Да бисмо то урадили, идемо на датотеку docker-compose.yml, који се налази у основној фасцикли пројекта.

Имајте на уму да овде не покушавамо да покријемо апсолутно све команде које се могу користити docker-compose.yml. Наш главни циљ је да прођемо кроз практичан пример који ће вам дати основно знање о Доцкер Цомпосе-у.

Ево кода који треба ставити у датотеку 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. Изградња пројекта

Након у docker-compose.yml Унета су сва потребна упутства, потребно је саставити пројекат. Овај корак нашег рада је сличан коришћењу команде docker build, али одговарајућа команда је релевантна за неколико сервиса:

$ docker-compose build

▍6. Покретање пројекта

Сада када је пројекат састављен, време је да га покренемо. Овај корак нашег рада одговара кораку у коме се, при раду са појединачним контејнерима, извршава команда docker run:

$ docker-compose up

Након извршења ове команде, текст који је клијент преузео са сервера требало би да се појави у терминалу: Docker-Compose is magic!.

Као што је већ поменуто, сервер користи порт рачунара 1234 да сервисира захтеве клијената. Стога, ако одете на адресу у вашем претраживачу http://localhost:1234/, приказаће страницу са текстом Docker-Compose is magic!.

Корисне команде

Хајде да погледамо неке команде које би вам могле бити корисне када радите са Доцкер Цомпосе.

Ова команда вам омогућава да зауставите и избришете контејнере и друге ресурсе креиране командом docker-compose up:

$ docker-compose down

Ова команда штампа сервисне дневнике:

$ docker-compose logs -f [service name]

На пример, у нашем пројекту се може користити у овом облику: $ docker-compose logs -f [service name].

Помоћу ове команде можете приказати листу контејнера:

$ docker-compose ps

Ова команда вам омогућава да извршите команду у покренутом контејнеру:

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

На пример, то може изгледати овако: docker-compose exec server ls.

Ова команда вам омогућава да прикажете листу слика:

$ docker-compose images

Резултати

Погледали смо основе рада са Доцкер Цомпосе технологијом, чије познавање ће вам омогућити да користите ову технологију и, ако желите, почнете да је проучавате дубље. ovde је спремиште са кодом за пројекат који смо погледали овде.

Драги читаоци! Да ли користите Доцкер Цомпосе у својим пројектима?

Водич за почетнике за Доцкер Цомпосе

Извор: ввв.хабр.цом

Додај коментар