Vodnik po Docker Compose za začetnike

Avtor članka, katerega prevod danes objavljamo, pravi, da je namenjen razvijalcem, ki želijo spoznati Docker Compose in si prizadevajo ustvariti svojo prvo odjemalsko-strežniško aplikacijo z uporabo Dockera. Predpostavlja se, da je bralec tega gradiva seznanjen z osnovami Dockera. Če temu ni tako — lahko pogledate na to serijo gradiv, na to Objavo, kjer so osnove Dockera obravnavane skupaj z osnovami Kubernetes, in na to članek za začetnike.

Vodnik po Docker Compose za začetnike

Kaj je Docker Compose?

Docker Compose je orodje, ki je del Dockera. Namenjeno je reševanju nalog, povezanih z uvajanjem projektov.

Ob študiju osnov Dockera ste se morda srečali s ustvarjanjem najpreprostejših aplikacij, ki delujejo samostojno in niso odvisne, na primer, od zunanjih virov podatkov ali nekaterih storitev. V praksi so tovrstne aplikacije redke. Pravi projekti običajno vključujejo celotno zbirko aplikacij, ki delujejo skupaj.

Kako ugotoviti, ali potrebujete Docker Compose pri uvajanju svojega projekta? V resnici je to zelo preprosto. Če za zagotovitev delovanja tega projekta uporabljate več storitev, vam lahko Docker Compose pride prav. Na primer, v situaciji, ko ustvarjate spletno stran, ki se mora za izvajanje avtentikacije uporabnikov povezati z bazo podatkov. Tovrstni projekt lahko vključuje dva servisa — tistega, ki zagotavlja delovanje spletne strani, in tistega, ki odgovarja za podporo bazi podatkov.

Tehnologija Docker Compose, poenostavljeno povedano, omogoča z enim ukazom zagon številnih storitev.

Razlika med Dockerjem in Docker Compose

Docker se uporablja za upravljanje posameznih kontejnerjev (storitev), iz katerih je sestavljena aplikacija.

Docker Compose se uporablja za hkratno upravljanje več kontejnerjev, ki so del aplikacije. To orodje ponuja enake možnosti kot Docker, vendar omogoča delo z bolj zapletenimi aplikacijami.

Vodnik po Docker Compose za začetnike
Docker (posamezni kontejner) in Docker Compose (več kontejnerjev)

Tipičen scenarij uporabe Docker Compose

Docker Compose je, v zmožnih rokah, zelo močno orodje, ki omogoča hitro postavljanje aplikacij s kompleksno arhitekturo. Sedaj bomo obravnavali primer praktične uporabe Docker Compose, katerega analiza vam bo omogočila, da ocenite prednosti, ki jih prinaša uporaba Docker Compose.

Predstavljajte si, da ste razvijalec nekega spletnega projekta. Ta projekt vključuje dve spletni strani. Prva omogoča podjetnikom, da z le nekaj kliki ustvari spletne trgovine. Druga je usmerjena v podporo strankam. Ti dve spletni strani komunicirata z isto bazo podatkov.

Vaš projekt postaja vedno bolj priljubljen, in ugotovite, da zmogljivosti strežnika, na katerem deluje, že ne zadoščajo. Zaradi tega se odločite, da celoten projekt preselite na drugo napravo.

Na žalost niste uporabljali nečesa takega kot je Docker Compose. Zato boste morali premakniti in prekonfigurirati posamezne storitve, v upanju, da ob tem ne pozabite na nič.

Če pa uporabljate Docker Compose, je prenos vašega projekta na nov strežnik vprašanje, ki ga rešite z uporabo več ukazov. Da dokončate prenos projekta na novo mesto, morate le narediti nekaj nastavitev in naložiti varnostno kopijo baze podatkov na nov strežnik.

Razvoj odjemalsko-strežniške aplikacije z uporabo Docker Compose

Sedaj, ko veste, za kaj bomo uporabljali Docker Compose, je čas, da ustvarite svojo prvo odjemalsko-strežniško aplikacijo s tem orodjem. Natančneje, gre za razvoj majhne spletne strani (strežnika) v Pythonu, ki zna posredovati datoteko z odlomkom besedila. To datoteko strežnik zahteva program (odjemalec), prav tako napisan v Pythonu. Po prejemu datoteke s strežnika program prikaže besedilo, shranjeno v njej, na zaslonu.

Upoštevajte, da pričakujemo, da obvladate osnove Dockerja in da imate že nameščeno platformo Docker.

Zagotovimo se, da delamo na projektu.

▍1. Ustvarjanje projekta

Da bi zgradili svojo prvo odjemalsko-strežniško aplikacijo, vam priporočam, da začnete s kreiranjem mape projekta. Ta mora vsebovati naslednje datoteke in mape:

  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: docker-compose.ymlTo je datoteka Docker Compose, ki bo vsebovala navodila, potrebna za zagon in konfiguracijo storitev.
  • Mapa strežnikVsebuje datoteke, potrebne za delovanje strežnika.
  • Mapa odjemalecTukaj bodo datoteke odjemalske aplikacije.

Zato bi vsebina glavne mape vašega projekta morala izgledati tako:

.
├── client/
├── docker-compose.yml
└── server/
2 mapi, 1 datoteka

▍2. Ustvarjanje strežnika

Med ustvarjanjem strežnika bomo obravnavali nekaj osnovnih stvari o Dockerju.

2a. Ustvarjanje datotek

Pojdite v mapo strežnik in ustvarite naslednje datoteke:

  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: server.pyV njej bo koda strežnika.
  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: index.htmlV tej datoteki bo fragment besedila, ki ga mora odjemalska aplikacija prikazati.
  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: DockerfileTo je datoteka Docker, ki bo vsebovala navodila, potrebna za ustvarjanje okolja strežnika.

Tako naj bi vsebina vaše mape izgledala server/:

.
├── Dockerfile
├── index.html
└── server.py
0 map, 3 datoteke

2b. Urejanje Python datoteke.

Добавим в файл server.py naslednja koda:

#!/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 omogoča ustvarjanje preprostega spletnega strežnika. Ta bo strankam posredoval datoteko index.html, katere vsebina bo kasneje prikazana na spletni strani.

2c. Urejanje HTML datoteke

V datoteko index.html dodamo naslednje besedilo:

Docker-Compose je čarovnija!

To besedilo bo poslano stranki.

2d. Urejanje datoteke Dockerfile

Zdaj bomo ustvarili preprosto datoteko Dockerfile, ki bo odgovorna za organizacijo okolja za izvajanje Python strežnika. Kot osnovo ustvarjenega slike bomo uporabili uradno sliko, namenjeno izvajanju programov, napisanih v Pythonu. Tukaj je vsebina 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 se bomo lotili dela na odjemalcu.

▍3. Ustvarjanje odjemalca

Ko ustvarjamo odjemalski del našega projekta, se bomo mimogrede spomnili nekaterih osnov Dockerja.

3a. Ustvarjanje datotek

Pojdite v mapo vašega projekta odjemalec in ustvarite naslednje datoteke:

  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: client.py. Tukaj bo koda odjemalca.
  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: Dockerfile. Ta datoteka ima enako vlogo kot ustrezna datoteka v mapi strežnika. Natančneje, vsebuje navodila, ki opisujejo ustvarjanje okolja za izvajanje odjemalske kode.

Zato bi vaša mapa client/ v tej fazi dela morala izgledati tako:

.
├── client.py
└── Dockerfile
0 map, 2 datoteki

3b. Urejanje Python datoteke

Добавим в файл client.py naslednja koda:

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

Zahvaljujoč tej kodi lahko odjemalska aplikacija naloži podatke s strežnika in jih prikaže na zaslonu.

3c. Urejanje datoteke Dockerfile

Kot v primeru strežnika, ustvarjamo za odjemalca preprosto Dockerfile, odgovoren za oblikovanje okolja, v katerem bo delovala klientna Python aplikacija. Tukaj je koda klienta Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Kot ste lahko opazili, smo ustvarili dva različna projekta: strežnik in klient. Vsak od njiju ima svoj lasten datoteko Dockerfile. Do sedaj nismo zapustili osnov dela z Dockerjem. Zdaj pa se lotevamo dela z Docker Compose. Za to se obrnimo na datoteko docker-compose.yml, ki se nahaja v korenski mapo projekta.

Upoštevajte, da tukaj ne poskušamo predstaviti vseh ukazov, ki jih je mogoče uporabiti v docker-compose.yml. Naš glavni cilj je razčleniti praktičen primer, ki vam daje osnovno znanje o Docker Compose.

Tukaj je koda, ki jo je treba postaviti 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 tem, ko so v docker-compose.yml vnesene vse potrebne navodila, je treba projekt zgraditi. Ta korak našega dela spominja na uporabo ukaza docker build, vendar ustrezen ukaz zadeva več storitev:

$ docker-compose build

▍6. Zagon projekta

Zdaj, ko je projekt zgrajen, je čas, da ga zaženemo. Ta korak našega dela ustreza koraku, kjer, pri delu z ločenimi kontejnerji, izvajamo ukaz docker run:

$ docker-compose up

Po izvedbi tega ukaza bi se v terminalu moral prikazati besedilo, preneseno iz strežnika s strani klienta: Docker-Compose je čarovnija!.

Kot že omenjeno, strežnik uporablja vrata računalnika 1234 za obravnavo zahtev klienta. Zato, če v brskalniku preidete na naslov http://localhost:1234/, se bo prikazala stran z besedilom Docker-Compose je čarovnija!.

Uporabni ukazi

Oglejmo si nekatere ukaze, ki vam lahko koristijo pri delu z Docker Compose.

Ta ukaz omogoča zaustavitev in odstranitev kontejnerjev ter drugih virov, ki jih ustvari ukaz docker-compose up:

$ docker-compose down

Ta ukaz prikazuje dnevnike storitev:

$ docker-compose logs -f [ime storitve]

Na primer, v našem projektu ga lahko uporabimo na ta način: $ docker-compose logs -f [ime storitve].

S takim ukazom lahko prikažete seznam kontejnerjev:

$ docker-compose ps

Ta ukaz omogoča izvajanje ukaza v tekočem kontejnerju:

$ docker-compose exec [ime storitve] [ukaz]

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

Tak ukaz omogoča prikaz seznama slik:

$ docker-compose images

Zaključki

Opravili smo osnovne osnove dela s tehnologijo Docker Compose, katerih poznavanje vam omogoča, da uporabljate to tehnologijo in, če želite, začnete z njenim globljim raziskovanjem. Evo repo z izvorno kodo projekta, ki smo ga tukaj obravnavali.

Spoštovani bralci! Ali uporabljate Docker Compose v svojih projektih?

Vodnik po Docker Compose za začetnike

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster