Docker Compose rokasgrāmata iesācējiem

Raksta, kura tulkojumu šodien publicējam, autors stāsta, ka tas ir paredzēts tiem izstrādātājiem, kuri vēlas apgūt Docker Compose un virzās uz savas pirmās klienta-servera aplikācijas izveidi, izmantojot Docker. Tiek pieņemts, ka šī materiāla lasītājs ir iepazinies ar Docker pamatiem. Ja tas tā nav, varat apskatīt šis materiālu sērija par šis ziņa, kas aptver Docker pamatus, kā arī Kubernetes pamatus un šis raksts iesācējiem.

Docker Compose rokasgrāmata iesācējiem

Kas ir Docker Compose?

Docker Compose ir Docker komplektācijā iekļauts rīks. Tas ir paredzēts, lai atrisinātu problēmas, kas saistītas ar projekta izvietošanu.

Apgūstot Docker pamatus, iespējams, esat saskāries ar vienkāršu lietojumprogrammu izveidi, kas darbojas autonomi un nav atkarīgas, piemēram, no ārējiem datu avotiem vai noteiktiem pakalpojumiem. Praksē šādi pieteikumi ir reti. Reāli projekti parasti ietver veselu pieteikumu kopumu, kas strādā kopā.

Kā zināt, vai, izvietojot projektu, ir jāizmanto Docker Compose? Patiesībā tas ir ļoti vienkārši. Ja izmantojat vairākus pakalpojumus, lai šis projekts darbotos, Docker Compose var noderēt. Piemēram, situācijā, kad viņi izveido vietni, kurai nepieciešams izveidot savienojumu ar datu bāzi, lai autentificētu lietotājus. Šāds projekts var sastāvēt no diviem pakalpojumiem - tā, kas nodrošina vietnes darbību, un tā, kas ir atbildīgs par datu bāzes uzturēšanu.

Docker Compose tehnoloģija, lai to aprakstītu vienkāršotā veidā, ļauj palaist daudzus pakalpojumus ar vienu komandu.

Atšķirība starp Docker un Docker Compose

Docker tiek izmantots, lai pārvaldītu atsevišķus konteinerus (pakalpojumus), kas veido lietojumprogrammu.

Docker Compose tiek izmantots, lai vienlaikus pārvaldītu vairākus konteinerus, kas veido lietojumprogrammu. Šis rīks piedāvā tādas pašas iespējas kā Docker, taču ļauj strādāt ar sarežģītākām lietojumprogrammām.

Docker Compose rokasgrāmata iesācējiem
Docker (viens konteiners) un Docker Compose (vairāki konteineri)

Tipisks Docker Compose lietošanas gadījums

Docker Compose labās rokās ir ļoti spēcīgs rīks, kas ļauj ļoti ātri izvietot lietojumprogrammas ar sarežģītu arhitektūru. Tagad apskatīsim Docker Compose praktiskās izmantošanas piemēru, kura analīze ļaus novērtēt priekšrocības, ko dos Docker Compose izmantošana.

Iedomājieties, ka esat tīmekļa projekta izstrādātājs. Šis projekts ietver divas tīmekļa vietnes. Pirmais ļauj biznesa cilvēkiem izveidot tiešsaistes veikalus tikai ar dažiem klikšķiem. Otrais ir paredzēts klientu atbalstam. Šīs divas vietnes mijiedarbojas ar vienu un to pašu datu bāzi.

Jūsu projekts kļūst arvien populārāks, un izrādās, ka ar servera jaudu, kurā tas darbojas, vairs nepietiek. Rezultātā jūs nolemjat pārvietot visu projektu uz citu iekārtu.

Diemžēl jūs neizmantojāt kaut ko līdzīgu Docker Compose. Tāpēc jums būs jāpārsūta un jāpārkonfigurē pakalpojumi pa vienam, cerot, ka šajā procesā jūs neko neaizmirsīsit.

Ja izmantojat Docker Compose, projekta pārvietošana uz jaunu serveri ir problēma, ko var atrisināt, izpildot dažas komandas. Lai pabeigtu projekta pārsūtīšanu uz jaunu vietu, jums tikai jāveic daži iestatījumi un jāaugšupielādē datu bāzes rezerves kopija jaunajā serverī.

Klienta-servera lietojumprogrammas izstrāde, izmantojot Docker Compose

Tagad, kad zināt, kam mēs izmantosim Docker Compose, ir pienācis laiks izveidot savu pirmo klienta-servera lietojumprogrammu, izmantojot šo rīku. Proti, runa ir par nelielas mājas lapas (servera) izstrādi Python, kas spēj izvadīt failu ar teksta fragmentu. Šo failu no servera pieprasa programma (klients), kas arī ir rakstīta Python valodā. Pēc faila saņemšanas no servera programma ekrānā parāda tajā saglabāto tekstu.

Lūdzu, ņemiet vērā, ka mēs pieņemam, ka jums ir pamatzināšanas par Docker un ka jums jau ir instalēta Docker platforma.

Sāksim strādāt pie projekta.

▍1. Projekta izveide

Lai izveidotu savu pirmo klienta-servera lietojumprogrammu, iesaku sākt ar projekta mapes izveidi. Tajā jāietver šādi faili un mapes:

  • fails docker-compose.yml. Šis ir Docker Compose fails, kurā būs norādījumi, kas nepieciešami pakalpojumu palaišanai un konfigurēšanai.
  • Mape server. Tajā būs faili, kas nepieciešami, lai serveris darbotos.
  • Mape client. Šeit atradīsies klienta lietojumprogrammu faili.

Rezultātā jūsu projekta galvenās mapes saturam vajadzētu izskatīties šādi:

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

▍2. Servera izveide

Šeit, servera izveides procesā, mēs pieskarsimies dažām pamata lietām saistībā ar Docker.

2a. Failu izveide

Dodieties uz mapi server un izveidojiet tajā šādus failus:

  • fails server.py. Tajā būs servera kods.
  • fails index.html. Šajā failā būs teksta fragments, kas jāizvada klienta lietojumprogrammai.
  • fails Dockerfile. Šis ir Docker fails, kurā būs norādījumi, kas nepieciešami servera vides izveidei.

Šādi vajadzētu izskatīties jūsu mapes saturam server/:

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

2b. Python faila rediģēšana.

Pievienot failam server.py šāds kods:

#!/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 kods ļauj izveidot vienkāršu tīmekļa serveri. Viņš iedos klientiem failu index.html, kuras saturs vēlāk tiks parādīts tīmekļa lapā.

2.c. HTML faila rediģēšana

Uz failu index.html pievienot šādu tekstu:

Docker-Compose is magic!

Šis teksts tiks nosūtīts klientam.

2d. Docker faila rediģēšana

Tagad mēs izveidosim vienkāršu failu Dockerfile, kurš būs atbildīgs par Python servera izpildlaika vides organizēšanu. Kā pamatu izveidotajam attēlam mēs izmantosim oficiālā veidā, kas paredzēts Python rakstīto programmu palaišanai. Šeit ir Dockerfile saturs:

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

Tagad sāksim strādāt pie klienta.

▍3. Klienta izveide

Veidojot mūsu projekta klienta pusi, mēs atcerēsimies dažus Docker pamatus.

3a. Failu izveide

Dodieties uz sava projekta mapi client un izveidojiet tajā šādus failus:

  • fails client.py. Šeit atradīsies klienta kods.
  • fails Dockerfile. Šim failam ir tāda pati loma kā līdzīgam failam servera mapē. Proti, tajā ir instrukcijas, kas apraksta, kā izveidot vidi klienta koda izpildei.

Tā rezultātā jūsu mape client/ šajā darba posmā tam vajadzētu izskatīties šādi:

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

3b. Python faila rediģēšana

Pievienot failam client.py šāds kods:

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

Izmantojot šo kodu, klienta lietojumprogramma var lejupielādēt datus no servera un parādīt tos ekrānā.

3c. Docker faila rediģēšana

Tāpat kā servera gadījumā, mēs izveidojam vienkāršu Dockerfile, kas atbild par vides izveidi, kurā darbosies Python klienta lietojumprogramma. Šeit ir klienta kods Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Kā jūs, iespējams, pamanījāt, mēs izveidojām divus dažādus projektus: serveri un klientu. Katram no tiem ir savs fails Dockerfile. Līdz šim viss notikušais nav ticis tālāk par pamatiem darbam ar Docker. Tagad mēs sākam darbu ar Docker Compose. Lai to izdarītu, pāriesim uz failu docker-compose.yml, kas atrodas projekta saknes mapē.

Lūdzu, ņemiet vērā, ka šeit mēs necenšamies aptvert pilnīgi visas komandas, kuras var izmantot docker-compose.yml. Mūsu galvenais mērķis ir apskatīt praktisku piemēru, kas sniegs jums pamatzināšanas par Docker Compose.

Šeit ir kods, kas jāievieto 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. Projekta būvēšana

Pēc iekšā docker-compose.yml Visas nepieciešamās instrukcijas ir ievadītas, projekts jāsamontē. Šis mūsu darba posms ir līdzīgs komandas izmantošanai docker build, bet atbilstošā komanda attiecas uz vairākiem pakalpojumiem:

$ docker-compose build

▍6. Projekta uzsākšana

Tagad, kad projekts ir samontēts, ir pienācis laiks to uzsākt. Šis mūsu darba posms atbilst solim, kurā, strādājot ar atsevišķiem konteineriem, tiek izpildīta komanda docker run:

$ docker-compose up

Pēc šīs komandas izpildes terminālī jāparādās tekstam, ko klients lejupielādējis no servera: Docker-Compose is magic!.

Kā jau minēts, serveris izmanto datora portu 1234 apkalpot klientu pieprasījumus. Tāpēc, ja pārlūkprogrammā dodaties uz adresi http://localhost:1234/, tiks parādīta lapa ar tekstu Docker-Compose is magic!.

Noderīgas komandas

Apskatīsim dažas komandas, kas varētu būt noderīgas, strādājot ar Docker Compose.

Šī komanda ļauj apturēt un dzēst konteinerus un citus komandas izveidotos resursus docker-compose up:

$ docker-compose down

Šī komanda drukā pakalpojumu žurnālus:

$ docker-compose logs -f [service name]

Piemēram, mūsu projektā to var izmantot šādā formā: $ docker-compose logs -f [service name].

Izmantojot šo komandu, varat parādīt konteineru sarakstu:

$ docker-compose ps

Šī komanda ļauj izpildīt komandu darbojošā konteinerā:

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

Piemēram, tas varētu izskatīties šādi: docker-compose exec server ls.

Šī komanda ļauj parādīt attēlu sarakstu:

$ docker-compose images

Rezultāti

Mēs esam apskatījuši pamatus darbam ar Docker Compose tehnoloģiju, kuras zināšanas ļaus izmantot šo tehnoloģiju un, ja vēlaties, sākt to pētīt dziļāk. šeit ir krātuve ar tā projekta kodu, kuru mēs šeit apskatījām.

Cienījamie lasītāji! Vai savos projektos izmantojat Docker Compose?

Docker Compose rokasgrāmata iesācējiem

Avots: www.habr.com

Pievieno komentāru