Docker Compose-gids vir beginners

Die skrywer van die artikel, wat ons vandag publiseer, sê dat dit bedoel is vir daardie ontwikkelaars wat Docker Compose wil leer en op pad is om hul eerste kliënt-bediener-toepassing met Docker te skep. Daar word aanvaar dat die leser van hierdie materiaal vertroud is met die basiese beginsels van Docker. As dit nie die geval is nie, kan jy kyk na hierdie reeks materiale hierdie 'n pos wat die basiese beginsels van Docker dek saam met die basiese beginsels van Kubernetes, en hierdie artikel vir beginners.

Docker Compose-gids vir beginners

Wat is Docker Compose?

Docker Compose is 'n instrument wat by Docker ingesluit is. Dit is ontwerp om probleme op te los wat verband hou met die ontplooiing van projekte.

Terwyl u die basiese beginsels van Docker leer, het u moontlik die skepping van die eenvoudigste toepassings teëgekom wat outonoom werk, nie afhanklik van byvoorbeeld eksterne databronne of van sekere dienste nie. In die praktyk is sulke toepassings skaars. Werklike projekte behels gewoonlik 'n hele stel samewerkende toepassings.

Hoe weet u of u Docker Compose moet gebruik wanneer u 'n projek ontplooi? Eintlik is dit baie eenvoudig. As jy verskeie dienste gebruik om hierdie projek uit te voer, kan Docker Compose handig te pas kom. Byvoorbeeld, in 'n situasie waar jy 'n webwerf skep wat, om gebruikersverifikasie uit te voer, aan 'n databasis moet koppel. So 'n projek kan bestaan ​​uit twee dienste - een wat die werking van die webwerf verseker, en een wat verantwoordelik is vir die ondersteuning van die databasis.

Die Docker Compose-tegnologie, as u dit op 'n vereenvoudigde manier beskryf, stel u in staat om baie dienste met 'n enkele opdrag te begin.

Verskil tussen Docker en Docker Compose

Docker word gebruik om die individuele houers (dienste) waaruit 'n toepassing bestaan, te bestuur.

Docker Compose word gebruik om verskeie houers te bestuur wat gelyktydig deel is van 'n toepassing. Hierdie instrument bied dieselfde kenmerke as Docker, maar laat jou toe om met meer komplekse toepassings te werk.

Docker Compose-gids vir beginners
Docker (enkel houer) en Docker Compose (veelvuldige houers)

Tipiese Docker Compose-gebruiksgeval

Docker Compose is, in die regte hande, 'n baie kragtige instrument waarmee jy vinnig toepassings met komplekse argitekture kan ontplooi. Nou sal ons kyk na 'n voorbeeld van die praktiese gebruik van Docker Compose, waarvan die ontleding jou sal toelaat om die voordele te evalueer wat die gebruik van Docker Compose jou sal gee.

Stel jou voor dat jy die ontwikkelaar van 'n webprojek is. Hierdie projek sluit twee webwerwe in. Die eerste stel sakelui in staat om, met net 'n paar kliks, aanlynwinkels te skep. Die tweede is gemik op kliëntediens. Hierdie twee werwe werk met dieselfde databasis.

Jou projek word al hoe meer gewild, en dit blyk dat die kapasiteit van die bediener waarop dit werk nie meer genoeg is nie. As gevolg hiervan besluit u om die hele projek na 'n ander masjien oor te dra.

Ongelukkig het jy nog nie iets soos Docker Compose gebruik nie. Daarom sal u dienste een op 'n slag moet migreer en herkonfigureer, met die hoop dat u niks in die proses van hierdie werk sal vergeet nie.

As u Docker Compose gebruik, is die migreer van u projek na 'n nuwe bediener 'n probleem wat opgelos kan word deur 'n paar opdragte uit te voer. Om die oordrag van die projek na 'n nuwe ligging te voltooi, hoef u slegs 'n paar instellings te maak en 'n rugsteunkopie van die databasis op die nuwe bediener op te laai.

Ontwikkel 'n kliënt-bediener-toepassing met Docker Compose

Noudat jy weet waarvoor ons Docker Compose gaan gebruik, is dit tyd om jou eerste kliënt-/bedienertoepassing met hierdie hulpmiddel te skep. Ons praat naamlik van die ontwikkeling van 'n klein webwerf (bediener) in Python, wat 'n lêer met 'n teksfragment kan produseer. Hierdie lêer word van die bediener aangevra deur 'n program (kliënt), ook geskryf in Python. Nadat die lêer vanaf die bediener ontvang is, vertoon die program die teks wat daarin gestoor is, op die skerm.

Neem asseblief kennis dat ons aanvaar dat u die basiese beginsels van Docker het en dat u reeds die Docker-platform geïnstalleer het.

Kom ons begin werk aan die projek.

▍1. Skep 'n projek

Om u eerste kliënt/bedienertoepassing te bou, stel ek voor dat u begin deur 'n projeklêer te skep. Dit moet die volgende lêers en vouers bevat:

  • lêer docker-compose.yml. Dit is 'n Docker Compose-lêer wat die instruksies sal bevat wat nodig is om die dienste te begin en op te stel.
  • Map server. Dit sal die lêers bevat wat nodig is om die bediener te laat werk.
  • Map client. Dit is waar die kliënttoepassinglêers geleë sal wees.

Gevolglik behoort die inhoud van die hoofgids van jou projek so te lyk:

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

▍2. Bediener skepping

Hier sal ons, in die proses om 'n bediener te skep, 'n paar basiese dinge rakende Docker aanraak.

2a. Die skep van lêers

Gaan na die gids server en skep die volgende lêers daarin:

  • lêer server.py. Dit sal die bedienerkode bevat.
  • lêer index.html. Hierdie lêer sal 'n stukkie teks bevat wat die kliënttoepassing moet vertoon.
  • lêer Dockerfile. Dit is die Docker-lêer wat die instruksies sal bevat wat nodig is om die bedieneromgewing te skep.

Dit is hoe die inhoud van jou vouer moet lyk server/:

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

2b. Redigeer 'n Python-lêer.

Voeg by lêer server.py die volgende kode:

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

Hierdie kode laat jou toe om 'n eenvoudige webbediener te skep. Hy sal aan kliënte 'n lêer gee index.html, waarvan die inhoud later op die webblad vertoon sal word.

2c. Redigeer 'n HTML-lêer

Om te liasseer index.html voeg die volgende teks by:

Docker-Compose is magic!

Hierdie teks sal aan die kliënt gestuur word.

2d. Redigeer die Dockerfile

Nou sal ons 'n eenvoudige lêer skep Dockerfile, wat verantwoordelik sal wees vir die organisering van die runtime-omgewing vir die Python-bediener. As basis van die geskepte beeld, sal ons gebruik amptelik, ontwerp om programme te laat loop wat in Python geskryf is. Hier is die inhoud van die 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/

Kom ons werk nou aan die kliënt.

▍3. Skep 'n kliënt

Terwyl ons die kliëntkant van ons projek skep, sal ons 'n paar Docker-beginsels langs die pad onthou.

3a. Die skep van lêers

Gaan na jou projekgids client en skep die volgende lêers daarin:

  • lêer client.py. Dit is waar die kliëntkode sal wees.
  • lêer Dockerfile. Hierdie lêer speel dieselfde rol as 'n soortgelyke lêer in die bedienergids. Dit bevat naamlik 'n stelling wat beskryf hoe om 'n omgewing te skep vir die uitvoering van kliëntkode.

As gevolg hiervan, jou gids client/ Op hierdie stadium behoort dit so te lyk:

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

3b. Redigeer 'n Python-lêer

Voeg by lêer client.py die volgende kode:

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

Danksy hierdie kode kan die kliënttoepassing data van die bediener aflaai en dit op die skerm vertoon.

3c. Redigeer die Dockerfile

Soos in die geval van die bediener, skep ons vir die kliënt 'n eenvoudige Dockerfile, verantwoordelik vir die vorming van die omgewing waarin die Python-kliënttoepassing sal loop. Hier is die kliënt kode Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Soos u kan sien, het ons twee verskillende projekte geskep: bediener en kliënt. Elkeen van hulle het sy eie lêer Dockerfile. Tot dusver gaan alles wat gebeur nie verder as die basiese beginsels van werk met Docker nie. Nou begin ons met Docker Compose werk. Om dit te doen, verwys na die lêer docker-compose.ymlgeleë in die hoofmap van die projek.

Neem asseblief kennis dat ons nie hier poog om absoluut al die opdragte te dek wat in gebruik kan word nie docker-compose.yml. Ons hoofdoel is om 'n praktiese voorbeeld af te breek wat jou basiese kennis van Docker Compose gee.

Hier is die kode om in die lêer te plaas 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. Projek bou

Na in docker-compose.yml al die nodige instruksies gemaak is, die projek moet saamgestel word. Hierdie stap van ons werk lyk soos die gebruik van die opdrag docker build, maar die ooreenstemmende opdrag hou verband met verskeie dienste:

$ docker-compose build

▍6. Begin van die projek

Noudat die projek gebou is, is dit tyd om dit uit te voer. Hierdie stap van ons werk stem ooreen met die stap waarop, wanneer daar met individuele houers gewerk word, die opdrag uitgevoer word docker run:

$ docker-compose up

Nadat hierdie opdrag uitgevoer is, moet die teks wat deur die kliënt vanaf die bediener gelaai is in die terminaal verskyn: Docker-Compose is magic!.

Soos reeds genoem, gebruik die bediener die rekenaarpoort 1234 om kliënteversoeke te bedien. Daarom, as jy in die blaaier na die adres gaan http://localhost:1234/, sal dit 'n bladsy met teks vertoon Docker-Compose is magic!.

Nuttige opdragte

Kom ons kyk na sommige van die opdragte wat u dalk nuttig kan vind wanneer u met Docker Compose werk.

Hierdie opdrag laat jou toe om houers en ander hulpbronne wat deur die opdrag geskep is, te stop en uit te vee docker-compose up:

$ docker-compose down

Hierdie opdrag druk die dienslogboeke:

$ docker-compose logs -f [service name]

Byvoorbeeld, in ons projek kan dit in hierdie vorm gebruik word: $ docker-compose logs -f [service name].

Met hierdie opdrag kan jy 'n lys houers vertoon:

$ docker-compose ps

Hierdie opdrag laat jou toe om 'n opdrag in 'n lopende houer uit te voer:

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

Dit kan byvoorbeeld so lyk: docker-compose exec server ls.

Hierdie opdrag laat jou toe om 'n lys prente te vertoon:

$ docker-compose images

Resultate van

Ons het die basiese beginsels van die werk met Docker Compose-tegnologie behandel, waarvan die kennis jou in staat sal stel om hierdie tegnologie te gebruik en, indien verkies, dit in meer diepte te begin bestudeer. Hier bewaarplek met die projekkode, wat ons hier oorweeg het.

Beste lesers! Gebruik jy Docker Compose in jou projekte?

Docker Compose-gids vir beginners

Bron: will.com

Voeg 'n opmerking