Priročnik za sestavljanje Dockerja za začetnike

Avtor članka, katerega prevod objavljamo danes, pravi, da je namenjen tistim razvijalcem, ki se želijo naučiti Docker Compose in se usmerjajo k izdelavi svoje prve odjemalsko-strežniške aplikacije s pomočjo Dockerja. Predpostavlja se, da je bralec tega gradiva seznanjen z osnovami Dockerja. Če temu ni tako, si lahko ogledate to serija gradiv na to objava, ki pokriva osnove Dockerja skupaj z osnovami Kubernetesa, in to članek za začetnike.

Priročnik za sestavljanje Dockerja za začetnike

Kaj je Docker Compose?

Docker Compose je orodje, vključeno v Docker. Zasnovan je za reševanje težav, povezanih z uvajanjem projekta.

Med učenjem osnov Dockerja ste morda naleteli na ustvarjanje preprostih aplikacij, ki delujejo avtonomno in niso odvisne na primer od zunanjih podatkovnih virov ali določenih storitev. V praksi so takšne aplikacije redke. Pravi projekti običajno vključujejo cel niz aplikacij, ki delujejo skupaj.

Kako veste, ali morate pri uvajanju projekta uporabiti Docker Compose? Pravzaprav je zelo preprosto. Če za delovanje tega projekta uporabljate več storitev, vam lahko Docker Compose pride prav. Na primer v situaciji, ko ustvarijo spletno stran, ki se mora povezati z bazo podatkov, da bi lahko avtentikirala uporabnike. Takšen projekt je lahko sestavljen iz dveh storitev - tiste, ki zagotavlja delovanje spletnega mesta, in tiste, ki je odgovorna za vzdrževanje baze podatkov.

Tehnologija Docker Compose, če jo opišemo na poenostavljen način, omogoča zagon številnih storitev z enim ukazom.

Razlika med Dockerjem in Docker Compose

Docker se uporablja za upravljanje posameznih vsebnikov (storitev), ki sestavljajo aplikacijo.

Docker Compose se uporablja za hkratno upravljanje več vsebnikov, ki sestavljajo aplikacijo. To orodje ponuja enake zmogljivosti kot Docker, vendar vam omogoča delo z bolj zapletenimi aplikacijami.

Priročnik za sestavljanje Dockerja za začetnike
Docker (en vsebnik) in Docker Compose (več vsebnikov)

Tipičen primer uporabe za Docker Compose

Docker Compose je v pravih rokah zelo zmogljivo orodje, ki vam omogoča zelo hitro uvajanje aplikacij s kompleksno arhitekturo. Zdaj si bomo ogledali primer praktične uporabe Docker Compose, katerega analiza vam bo omogočila, da ocenite prednosti, ki vam jih bo prinesla uporaba Docker Compose.

Predstavljajte si, da ste razvijalec spletnega projekta. Ta projekt vključuje dve spletni strani. Prvi omogoča poslovnežem ustvarjanje spletnih trgovin z le nekaj kliki. Drugi je namenjen podpori strankam. Ti dve strani delujeta z isto bazo podatkov.

Vaš projekt postaja vse bolj popularen in izkaže se, da moč strežnika, na katerem teče, ne zadostuje več. Posledično se odločite, da celoten projekt premaknete na drug stroj.

Na žalost niste uporabili nečesa podobnega Docker Compose. Zato boste morali eno za drugo prenesti in znova konfigurirati storitve, v upanju, da pri tem ne boste česa pozabili.

Če uporabljate Docker Compose, je premik vašega projekta na nov strežnik zadeva, ki jo je mogoče rešiti z izvajanjem nekaj ukazov. Za dokončanje prenosa projekta na novo lokacijo morate opraviti le nekaj nastavitev in naložiti varnostno kopijo baze podatkov na nov strežnik.

Razvijanje aplikacije odjemalec-strežnik z uporabo Docker Compose

Zdaj, ko veste, za kaj bomo uporabljali Docker Compose, je čas, da s tem orodjem ustvarite svojo prvo aplikacijo odjemalec-strežnik. Govorimo namreč o razvoju majhne spletne strani (strežnika) v Pythonu, ki zna izpisati datoteko z delčkom besedila. To datoteko od strežnika zahteva program (odjemalec), prav tako napisan v Pythonu. Po prejemu datoteke s strežnika program na zaslonu prikaže besedilo, ki je v njej shranjeno.

Upoštevajte, da predvidevamo, da imate osnovno razumevanje Dockerja in da že imate nameščeno platformo Docker.

Začnimo delati na projektu.

▍1. Ustvarjanje projekta

Če želite zgraditi svojo prvo aplikacijo odjemalec-strežnik, predlagam, da začnete z ustvarjanjem mape projekta. Vsebovati mora naslednje datoteke in mape:

  • datoteka docker-compose.yml. To je datoteka Docker Compose, ki bo vsebovala navodila, potrebna za zagon in konfiguracijo storitev.
  • Mapa server. Vsebovala bo datoteke, potrebne za delovanje strežnika.
  • Mapa client. Datoteke odjemalske aplikacije se bodo nahajale tukaj.

Posledično bi morala biti vsebina glavne mape vašega projekta videti takole:

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

▍2. Ustvarjanje strežnika

Tukaj se bomo v procesu ustvarjanja strežnika dotaknili nekaterih osnovnih stvari v zvezi z Dockerjem.

2a. Ustvarjanje datotek

Pojdite v mapo server in v njem ustvarite naslednje datoteke:

  • datoteka server.py. Vseboval bo kodo strežnika.
  • datoteka index.html. Ta datoteka bo vsebovala del besedila, ki bi ga morala izpisati odjemalska aplikacija.
  • datoteka Dockerfile. To je datoteka Docker, ki bo vsebovala navodila, potrebna za ustvarjanje okolja strežnika.

Tako bi morala izgledati vsebina vaše mape server/:

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

2b. Urejanje datoteke Python.

Dodaj v datoteko server.py naslednjo 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()

Ta koda vam omogoča ustvarjanje preprostega spletnega strežnika. Strankam bo dal datoteko index.html, katerih vsebina bo kasneje prikazana na spletni strani.

2c. Urejanje datoteke HTML

Vložiti index.html dodajte naslednje besedilo:

Docker-Compose is magic!

To besedilo bo poslano naročniku.

2d. Urejanje datoteke Docker

Zdaj bomo ustvarili preprosto datoteko Dockerfile, ki bo odgovoren za organizacijo izvajalnega okolja za strežnik Python. Kot osnovo za ustvarjeno sliko bomo uporabili na uraden način, zasnovan za izvajanje programov, napisanih v Pythonu. Tukaj je vsebina datoteke 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/

Zdaj pa začnimo delati na stranki.

▍3. Ustvarjanje odjemalca

Med ustvarjanjem odjemalske strani našega projekta se bomo spomnili nekaj osnov Dockerja.

3a. Ustvarjanje datotek

Pojdite v mapo svojega projekta client in v njem ustvarite naslednje datoteke:

  • datoteka client.py. Koda odjemalca se nahaja tukaj.
  • datoteka Dockerfile. Ta datoteka ima enako vlogo kot podobna datoteka v mapi strežnika. Vsebuje namreč navodila, ki opisujejo, kako ustvariti okolje za izvajanje odjemalske kode.

Kot rezultat, vaša mapa client/ na tej stopnji dela bi moralo izgledati takole:

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

3b. Urejanje datoteke Python

Dodaj v datoteko client.py naslednjo 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()

S to kodo lahko odjemalska aplikacija prenese podatke s strežnika in jih prikaže na zaslonu.

3c. Urejanje datoteke Docker

Kot v primeru strežnika ustvarimo preprosto Dockerfile, odgovoren za ustvarjanje okolja, v katerem bo delovala odjemalska aplikacija Python. Tukaj je koda stranke Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Kot ste morda opazili, smo ustvarili dva različna projekta: strežnik in odjemalec. Vsak od njih ima svojo datoteko Dockerfile. Doslej vse, kar se je zgodilo, ni preseglo osnov dela z Dockerjem. Zdaj začnemo z Docker Compose. Če želite to narediti, pojdimo v datoteko docker-compose.yml, ki se nahaja v korenski mapi projekta.

Upoštevajte, da tukaj ne poskušamo zajeti vseh ukazov, ki jih je mogoče uporabiti v docker-compose.yml. Naš glavni cilj je sprehod skozi praktični primer, ki vam bo dal osnovno znanje o Docker Compose.

Tukaj je koda, ki jo vstavite v datoteko 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. Gradnja projekta

Po v docker-compose.yml Vnesena so vsa potrebna navodila, projekt je treba sestaviti. Ta korak našega dela je podoben uporabi ukaza docker build, vendar je ustrezen ukaz pomemben za več storitev:

$ docker-compose build

▍6. Začetek projekta

Zdaj, ko je projekt sestavljen, je čas, da ga zaženemo. Ta korak našega dela ustreza koraku, v katerem se pri delu s posameznimi vsebniki izvede ukaz docker run:

$ docker-compose up

Po izvedbi tega ukaza se mora v terminalu prikazati besedilo, ki ga je odjemalec prenesel s strežnika: Docker-Compose is magic!.

Kot že omenjeno, strežnik uporablja vrata računalnika 1234 za servisiranje zahtev strank. Torej, če greste na naslov v brskalniku http://localhost:1234/, bo prikazala stran z besedilom Docker-Compose is magic!.

Uporabni ukazi

Oglejmo si nekaj ukazov, ki bi se vam lahko zdeli koristni pri delu z Docker Compose.

Ta ukaz vam omogoča, da zaustavite in izbrišete vsebnike in druge vire, ustvarjene z ukazom docker-compose up:

$ docker-compose down

Ta ukaz natisne servisne dnevnike:

$ docker-compose logs -f [service name]

Na primer, v našem projektu ga lahko uporabimo v tej obliki: $ docker-compose logs -f [service name].

S tem ukazom lahko prikažete seznam vsebnikov:

$ docker-compose ps

Ta ukaz vam omogoča, da izvedete ukaz v delujočem vsebniku:

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

Na primer, lahko izgleda takole: docker-compose exec server ls.

Ta ukaz vam omogoča prikaz seznama slik:

$ docker-compose images

Rezultati

Ogledali smo si osnove dela s tehnologijo Docker Compose, katere poznavanje vam bo omogočilo uporabo te tehnologije in jo po želji začeli poglobljeno preučevati. Tu repozitorij s kodo za projekt, ki smo si ga ogledali tukaj.

Drage bralke in bralci! Ali uporabljate Docker Compose v svojih projektih?

Priročnik za sestavljanje Dockerja za začetnike

Vir: www.habr.com

Dodaj komentar