In hantlieding foar begjinners foar Docker Compose

De skriuwer fan it artikel, de oersetting wêrfan wy hjoed publisearje, seit dat it bedoeld is foar dy ûntwikkelders dy't Docker Compose wolle leare en geane nei it meitsjen fan har earste client-server-applikaasje mei Docker. It wurdt oannommen dat de lêzer fan dit materiaal bekend is mei de basis fan Docker. As dit net it gefal is, kinne jo efkes sjen dit rige fan materialen op dit post covering Docker basics tegearre mei Kubernetes basics, en dit artikel foar begjinners.

In hantlieding foar begjinners foar Docker Compose

Wat is Docker Compose?

Docker Compose is in ark opnommen mei Docker. It is ûntworpen om problemen op te lossen yn ferbân mei projektynset.

Wylst jo de basis fan Docker leare, hawwe jo miskien it oanmeitsjen fan ienfâldige applikaasjes tsjinkaam dy't autonoom wurkje en net ôfhinklik binne, bygelyks fan eksterne gegevensboarnen of op bepaalde tsjinsten. Yn 'e praktyk binne sokke tapassingen seldsum. Echte projekten omfetsje normaal in heule set applikaasjes dy't gearwurkje.

Hoe witte jo as jo Docker Compose moatte brûke by it ynsetten fan in projekt? It is eins hiel simpel. As jo ​​​​meardere tsjinsten brûke om dit projekt te wurkjen, dan kin Docker Compose fan pas komme. Bygelyks yn in situaasje wêr't se in webside meitsje dy't ferbine moat mei in database om brûkers te ferifiearjen. Sa'n projekt kin bestean út twa tsjinsten - de iene dy't soarget foar de wurking fan de side, en dejinge dy't ferantwurdlik is foar it behâld fan de databank.

Docker Compose technology, om it op in ferienfâldige manier te beskriuwen, kinne jo in protte tsjinsten starte mei ien kommando.

Ferskil tusken Docker en Docker Compose

Docker wurdt brûkt om de yndividuele konteners (tsjinsten) te behearjen dy't in applikaasje foarmje.

Docker Compose wurdt brûkt om tagelyk meardere konteners te behearjen dy't in applikaasje foarmje. Dit ark biedt deselde mooglikheden as Docker, mar lit jo wurkje mei kompleksere applikaasjes.

In hantlieding foar begjinners foar Docker Compose
Docker (ien kontener) en Docker Compose (meardere konteners)

Typysk gebrûk foar Docker Compose

Docker Compose is, yn 'e juste hannen, in heul krêftich ark wêrmei jo applikaasjes mei komplekse arsjitektuer heul fluch kinne ynsette. No sille wy nei in foarbyld sjen fan praktysk gebrûk fan Docker Compose, wêrfan de analyze jo de foardielen kinne evaluearje dy't it brûken fan Docker Compose jo sil jaan.

Stel jo foar dat jo in ûntwikkelder binne fan in webprojekt. Dit projekt befettet twa websiden. De earste lit saaklike minsken online winkels meitsje mei mar in pear mûsklikken. De twadde is rjochte op klantstipe. Dizze twa siden ynteraksje mei deselde databank.

Jo projekt wurdt hieltyd populêrder, en it docht bliken dat de krêft fan 'e tsjinner dêr't it rint net mear genôch is. As gefolch, jo beslute te ferpleatsen it hiele projekt nei in oare masine.

Spitigernôch hawwe jo net wat brûkt as Docker Compose. Dêrom sille jo tsjinsten ien foar ien moatte oerdrage en opnij konfigurearje, yn 'e hoop dat jo neat sille ferjitte yn it proses.

As jo ​​Docker Compose brûke, dan is it ferpleatsen fan jo projekt nei in nije server in saak dy't kin wurde oplost troch in pear kommando's út te fieren. Om de oerdracht fan it projekt nei in nije lokaasje te foltôgjen, hoege jo allinich wat ynstellings te meitsjen en in reservekopy fan 'e databank op te laden nei de nije tsjinner.

Untwikkeljen fan in client-server-applikaasje mei Docker Compose

No't jo witte wêr't wy Docker Compose foar sille brûke, is it tiid om jo earste client-server-applikaasje te meitsjen mei dit ark. Wy hawwe it nammentlik oer it ûntwikkeljen fan in lytse webside (tsjinner) yn Python dy't in bestân útfiere kin mei in fragmint fan tekst. Dizze triem wurdt oanfrege fan de tsjinner troch in programma (client), ek skreaun yn Python. Nei it ûntfangen fan in bestân fan 'e tsjinner toant it programma de tekst dy't dêryn is opslein op it skerm.

Tink derom dat wy oannimme dat jo in basisbegryp hawwe fan Docker en dat jo it Docker-platfoarm al ynstalleare hawwe.

Litte wy begjinne te wurkjen oan it projekt.

▍1. It meitsjen fan in projekt

Om jo earste client-server-applikaasje te bouwen, stel ik foar dat jo begjinne mei it meitsjen fan in projektmap. It moat de folgjende bestannen en mappen befetsje:

  • file docker-compose.yml. Dit is in Docker Compose-bestân dat de ynstruksjes sil befetsje dy't nedich binne om de tsjinsten te starten en te konfigurearjen.
  • Folder server. It sil de bestannen befetsje dy't nedich binne om de tsjinner rinnend te hâlden.
  • Folder client. De kliïntapplikaasjebestannen sille hjir te finen wêze.

As resultaat moat de ynhâld fan 'e haadmap fan jo projekt der sa útsjen:

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

▍2. It meitsjen fan in tsjinner

Hjir, yn it proses fan it meitsjen fan in server, sille wy guon basis dingen oangeande Docker oanrekke.

2a. It meitsjen fan triemmen

Gean nei map server en meitsje de folgjende bestannen dêryn:

  • file server.py. It sil de serverkoade befetsje.
  • file index.html. Dit bestân sil in stikje tekst befetsje dat de kliïntapplikaasje útfiere moat.
  • file Dockerfile. Dit is in Docker-bestân dat de ynstruksjes sil befetsje dy't nedich binne om de serveromjouwing te meitsjen.

Dit is hoe't de ynhâld fan jo map der útsjen moat server/:

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

2b. In Python-bestân bewurkje.

Tafoegje oan triem server.py de folgjende koade:

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

Dizze koade lit jo in ienfâldige webserver oanmeitsje. Hy sil kliïnten it bestân jaan index.html, wêrfan de ynhâld letter werjûn wurde op de webside.

2c. It bewurkjen fan in HTML-bestân

Opslaan index.html foegje de folgjende tekst ta:

Docker-Compose is magic!

Dizze tekst wurdt stjoerd nei de klant.

2d. De Dockerfile bewurkje

No sille wy in ienfâldige triem meitsje Dockerfile, wa sil ferantwurdlik wêze foar it organisearjen fan de runtime-omjouwing foar de Python-tsjinner. As basis foar it oanmakke byld sille wy brûke op offisjele wize, ûntworpen om programma's út te fieren skreaun yn Python. Hjir is de ynhâld fan it 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/

Litte wy no begjinne te wurkjen oan 'e klant.

▍3. It meitsjen fan in klant

Wylst wy de klantkant fan ús projekt oanmeitsje, sille wy ûnderweis wat Docker-basisbegripen ûnthâlde.

3a. It meitsjen fan triemmen

Gean nei jo projekt map client en meitsje de folgjende bestannen dêryn:

  • file client.py. De kliïntkoade sil hjir te finen wêze.
  • file Dockerfile. Dit bestân spilet deselde rol as in ferlykber bestân yn 'e servermap. It befettet nammentlik ynstruksjes dy't beskriuwe hoe't jo in omjouwing meitsje kinne foar it útfieren fan kliïntkoade.

As gefolch, jo map client/ yn dizze faze fan wurk moat it der sa útsjen:

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

3b. In Python-bestân bewurkje

Tafoegje oan triem client.py de folgjende koade:

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

Mei dizze koade kin de kliïntapplikaasje gegevens downloade fan 'e tsjinner en werjaan op it skerm.

3c. De Dockerfile bewurkje

Lykas yn it gefal fan de tsjinner, meitsje wy in ienfâldige Dockerfile, ferantwurdlik foar it meitsjen fan de omjouwing wêryn de Python-kliïntapplikaasje sil rinne. Hjir is de klantkoade Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Lykas jo miskien hawwe opfallen, hawwe wy twa ferskillende projekten makke: in server en in kliïnt. Elk fan harren hat syn eigen triem Dockerfile. Oant no ta is alles wat bard is net fierder gien as de basis fan wurkjen mei Docker. No begjinne wy ​​​​mei Docker Compose. Om dit te dwaan, litte wy nei it bestân gean docker-compose.yml, leit yn 'e projektrootmap.

Tink derom dat wy hjir net besykje absolút alle kommando's te dekken wêryn kinne wurde brûkt docker-compose.yml. Us haaddoel is om troch in praktysk foarbyld te rinnen dat jo de basiskennis fan Docker Compose sil jaan.

Hjir is de koade om yn it bestân te setten 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. It bouwen fan it projekt

Nei yn docker-compose.yml Alle nedige ynstruksjes binne ynfierd, it projekt moat wurde gearstald. Dizze stap fan ús wurk is gelyk oan it brûken fan it kommando docker build, mar it oerienkommende kommando is relevant foar ferskate tsjinsten:

$ docker-compose build

▍6. Start fan it projekt

No't it projekt gearstald is, is it tiid om it te lansearjen. Dizze stap fan ús wurk komt oerien mei de stap wêryn, as jo wurkje mei yndividuele konteners, it kommando wurdt útfierd docker run:

$ docker-compose up

Nei it útfieren fan dit kommando moat de tekst dy't troch de kliïnt fan 'e server is ynladen yn' e terminal ferskine: Docker-Compose is magic!.

Lykas al neamd, de tsjinner brûkt de kompjûter haven 1234 om klantfersiken te tsjinjen. Dêrom, as jo gean nei it adres yn jo blêder http://localhost:1234/, sil it in side mei tekst werjaan Docker-Compose is magic!.

Nuttige kommando's

Litte wy nei guon kommando's sjen dy't jo nuttich kinne fine as jo wurkje mei Docker Compose.

Dit kommando lit jo konteners en oare boarnen stopje en wiskje troch it kommando docker-compose up:

$ docker-compose down

Dit kommando printet tsjinst logs:

$ docker-compose logs -f [service name]

Bygelyks, yn ús projekt kin it brûkt wurde yn dizze foarm: $ docker-compose logs -f [service name].

Mei dit kommando kinne jo in list mei konteners werjaan:

$ docker-compose ps

Dit kommando lit jo in kommando útfiere yn in rinnende kontener:

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

It kin bygelyks sa útsjen: docker-compose exec server ls.

Dit kommando lit jo in list mei ôfbyldings werjaan:

$ docker-compose images

Resultaten

Wy hawwe sjoen nei de basis fan it wurkjen mei Docker Compose-technology, wêrfan kennis jo dizze technology kinne brûke en, as jo wolle, begjinne om it yn mear djipte te studearjen. hjir in repository mei de koade foar it projekt dat wy hjir seagen.

Dear readers! Brûke jo Docker Compose yn jo projekten?

In hantlieding foar begjinners foar Docker Compose

Boarne: www.habr.com

Add a comment