Gvidilo por komencantoj pri Docker Compose

La aŭtoro de la artikolo, kies tradukon ni publikigas hodiaŭ, diras, ke ĝi estas destinita al tiuj programistoj, kiuj volas lerni Docker Compose kaj iras al kreado de sia unua kliento-servila aplikaĵo uzante Docker. Oni supozas, ke la leganto de ĉi tiu materialo konas la bazojn de Docker. Se ĉi tio ne estas la kazo, vi povas rigardi ĉi tio serio de materialoj sur ĉi tio afiŝo kovranta Docker-bazojn kune kun Kubernetes-bazoj, kaj ĉi tio artikolo por komencantoj.

Gvidilo por komencantoj pri Docker Compose

Kio estas Docker Compose?

Docker Compose estas ilo inkluzivita kun Docker. Ĝi estas dizajnita por solvi problemojn ligitajn al projektdeplojo.

Dum lernado de la bazaĵoj de Docker, vi eble renkontis la kreadon de simplaj aplikaĵoj, kiuj funkcias aŭtonome kaj ne dependas, ekzemple, de eksteraj datumfontoj aŭ de certaj servoj. En la praktiko, tiaj aplikoj estas maloftaj. Realaj projektoj kutime implikas tutan aron da aplikoj laborantaj kune.

Kiel vi scias, ĉu vi bezonas uzi Docker Compose dum deplojado de projekto? Ĝi estas efektive tre simpla. Se vi uzas plurajn servojn por funkcii ĉi tiun projekton, tiam Docker Compose eble estos utila. Ekzemple, en situacio kie ili kreas retejon kiu bezonas konekti al datumbazo por aŭtentikigi uzantojn. Tia projekto povas konsisti el du servoj - tiu, kiu certigas la funkciadon de la retejo, kaj tiu, kiu respondecas pri konservado de la datumbazo.

Docker Compose-teknologio, por priskribi ĝin en simpligita maniero, permesas al vi lanĉi multajn servojn per unu komando.

Diferenco inter Docker kaj Docker Compose

Docker estas uzata por administri la individuajn ujojn (servojn) kiuj konsistigas aplikaĵon.

Docker Compose estas uzata por samtempe administri plurajn ujojn, kiuj konsistigas aplikaĵon. Ĉi tiu ilo ofertas la samajn kapablojn kiel Docker, sed permesas vin labori kun pli kompleksaj aplikoj.

Gvidilo por komencantoj pri Docker Compose
Docker (ununura ujo) kaj Docker Compose (multoblaj ujoj)

Tipa uzkazo por Docker Compose

Docker Compose estas, en la ĝustaj manoj, tre potenca ilo, kiu permesas vin tre rapide disfaldi aplikaĵojn kun kompleksaj arkitekturoj. Nun ni rigardos ekzemplon de praktika uzo de Docker Compose, kies analizo permesos al vi taksi la avantaĝojn, kiujn uzado de Docker Compose donos al vi.

Imagu, ke vi estas programisto de retejo-projekto. Ĉi tiu projekto inkluzivas du retejojn. La unua permesas al komercistoj krei interretajn butikojn per nur kelkaj klakoj. La dua celas klientan subtenon. Ĉi tiuj du retejoj interagas kun la sama datumbazo.

Via projekto fariĝas pli kaj pli populara, kaj montriĝas, ke la potenco de la servilo, sur kiu ĝi funkcias, ne plu sufiĉas. Kiel rezulto, vi decidas movi la tutan projekton al alia maŝino.

Bedaŭrinde, vi ne uzis ion kiel Docker Compose. Sekve, vi devos translokigi kaj reagordi servojn unuope, esperante, ke vi ne forgesos ion ajn en la procezo.

Se vi uzas Docker Compose, tiam movi vian projekton al nova servilo estas afero, kiu povas esti solvita rulante kelkajn komandojn. Por kompletigi la translokigon de la projekto al nova loko, vi nur bezonas fari iujn agordojn kaj alŝuti rezervan kopion de la datumbazo al la nova servilo.

Disvolvante klient-servilan aplikaĵon uzante Docker Compose

Nun kiam vi scias, por kio ni uzos Docker Compose, estas tempo krei vian unuan klient-servilan aplikaĵon uzante ĉi tiun ilon. Nome, ni parolas pri evoluigo de malgranda retejo (servilo) en Python, kiu povas eligi dosieron kun fragmento de teksto. Ĉi tiu dosiero estas petita de la servilo de programo (kliento), ankaŭ skribita en Python. Post ricevi dosieron de la servilo, la programo montras la tekston konservitan en ĝi sur la ekrano.

Bonvolu noti, ke ni supozas, ke vi havas bazan komprenon pri Docker kaj ke vi jam havas la Docker-platformon instalitan.

Ni komencu labori pri la projekto.

▍1. Kreante Projekton

Por konstrui vian unuan klient-servilan aplikaĵon, mi sugestas, ke vi komencu kreante projektan dosierujon. Ĝi devus enhavi la sekvajn dosierojn kaj dosierujojn:

  • dosiero docker-compose.yml. Ĉi tio estas dosiero de Docker Compose, kiu enhavos la instrukciojn necesajn por komenci kaj agordi la servojn.
  • dosierujo server. Ĝi enhavos la dosierojn necesajn por ke la servilo funkcias.
  • dosierujo client. La klienta aplikaĵo dosieroj estos lokitaj ĉi tie.

Kiel rezulto, la enhavo de la ĉefa dosierujo de via projekto devus aspekti jene:

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

▍2. Kreante servilon

Ĉi tie, en la procezo de kreado de servilo, ni tuŝos kelkajn bazajn aferojn pri Docker.

2a. Kreante dosierojn

Iru al la dosierujo server kaj kreu la jenajn dosierojn en ĝi:

  • dosiero server.py. Ĝi enhavos la servilan kodon.
  • dosiero index.html. Ĉi tiu dosiero enhavos tekston, kiun la klienta aplikaĵo devus eligi.
  • dosiero Dockerfile. Ĉi tio estas Docker-dosiero, kiu enhavos la instrukciojn necesajn por krei la servilan medion.

Jen kiel devus aspekti la enhavo de via dosierujo server/:

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

2b. Redaktante Python-dosieron.

Aldoni al dosiero server.py jena kodo:

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

Ĉi tiu kodo permesas krei simplan retservilon. Li donos al klientoj la dosieron index.html, kies enhavo estos poste montrata sur la retpaĝo.

2c. Redaktado de HTML-Dosiero

File index.html aldonu la jenan tekston:

Docker-Compose is magic!

Ĉi tiu teksto estos sendita al la kliento.

2d. Redaktante la Dockerfile

Nun ni kreos simplan dosieron Dockerfile, kiu respondecos pri organizado de la rultempa medio por la Python-servilo. Kiel la bazon por la kreita bildo, ni uzos en oficiala maniero, dizajnita por ruli programojn skribitajn en Python. Jen la enhavo de la 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/

Nun ni komencu labori pri la kliento.

▍3. Kreante klienton

Dum kreado de la klienta flanko de nia projekto, ni memoros kelkajn bazaĵojn de Docker laŭ la vojo.

3a. Kreante dosierojn

Iru al via projekta dosierujo client kaj kreu la jenajn dosierojn en ĝi:

  • dosiero client.py. La klientokodo troviĝos ĉi tie.
  • dosiero Dockerfile. Ĉi tiu dosiero ludas la saman rolon kiel simila dosiero en la servila dosierujo. Nome, ĝi enhavas instrukciojn, kiuj priskribas kiel krei medion por ekzekuti klientkodon.

Kiel rezulto, via dosierujo client/ en ĉi tiu etapo de laboro ĝi devus aspekti jene:

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

3b. Redaktante Python-dosieron

Aldoni al dosiero client.py jena kodo:

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

Kun ĉi tiu kodo, la klienta aplikaĵo povas elŝuti datumojn de la servilo kaj montri ĝin sur la ekrano.

3c. Redaktante la Dockerfile

Kiel en la kazo de la servilo, ni kreas simplan Dockerfile, respondeca pri kreado de la medio en kiu ruliĝos la Python-klienta aplikaĵo. Jen la klientokodo Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Komponu

Kiel vi eble rimarkis, ni kreis du malsamajn projektojn: servilo kaj kliento. Ĉiu el ili havas sian propran dosieron Dockerfile. Ĝis nun, ĉio, kio okazis, ne preterpasis la bazojn labori kun Docker. Nun ni komencas kun Docker Compose. Por fari tion, ni iru al la dosiero docker-compose.yml, situanta en la projekta radika dosierujo.

Bonvolu noti, ke ĉi tie ni ne provas kovri absolute ĉiujn komandojn uzeblajn docker-compose.yml. Nia ĉefa celo estas trairi praktikan ekzemplon, kiu donos al vi la bazan scion pri Docker Compose.

Jen la kodo por meti en la dosieron 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. Konstruante la projekton

Post en docker-compose.yml Ĉiuj necesaj instrukcioj estis enigitaj, la projekto devas esti kunvenita. Ĉi tiu paŝo de nia laboro similas uzi la komandon docker build, sed la responda komando rilatas al pluraj servoj:

$ docker-compose build

▍6. Lanĉo de la projekto

Nun kiam la projekto estas kunvenita, estas tempo lanĉi ĝin. Ĉi tiu paŝo de nia laboro respondas al la paŝo en kiu, kiam oni laboras kun individuaj ujoj, la komando estas ekzekutita docker run:

$ docker-compose up

Post ekzekuto de ĉi tiu komando, la teksto elŝutita de la kliento de la servilo devus aperi en la terminalo: Docker-Compose is magic!.

Kiel jam menciite, la servilo uzas la komputilan havenon 1234 por servi klientajn petojn. Sekve, se vi iras al la adreso en via retumilo http://localhost:1234/, ĝi montros paĝon kun teksto Docker-Compose is magic!.

Utilaj komandoj

Ni rigardu kelkajn komandojn, kiujn vi eble trovos utilaj kiam vi laboras kun Docker Compose.

Ĉi tiu komando permesas haltigi kaj forigi ujojn kaj aliajn rimedojn kreitajn de la komando docker-compose up:

$ docker-compose down

Ĉi tiu komando presas servoprotokolojn:

$ docker-compose logs -f [service name]

Ekzemple, en nia projekto ĝi povas esti uzata en ĉi tiu formo: $ docker-compose logs -f [service name].

Uzante ĉi tiun komandon vi povas montri liston de ujoj:

$ docker-compose ps

Ĉi tiu komando permesas al vi ekzekuti komandon en funkcianta ujo:

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

Ekzemple, ĝi povus aspekti jene: docker-compose exec server ls.

Ĉi tiu komando permesas al vi montri liston de bildoj:

$ docker-compose images

Rezultoj

Ni rigardis la bazojn pri laboro kun Docker Compose-teknologio, pri kiu scio permesos al vi uzi ĉi tiun teknologion kaj, se vi volas, komenci studi ĝin pli profunde. tie deponejo kun la kodo por la projekto, kiun ni rigardis ĉi tie.

Karaj legantoj! Ĉu vi uzas Docker Compose en viaj projektoj?

Gvidilo por komencantoj pri Docker Compose

fonto: www.habr.com

Aldoni komenton