Ръководство за композиране на Docker за начинаещи

Авторът на статията, която публикуваме днес, казва, че тя е предназначена за онези разработчици, които искат да научат Docker Compose и са на път да създадат своето първо клиент-сървър приложение с помощта на Docker. Предполага се, че читателят на този материал е запознат с основите на Docker. Ако това не е така, можете да разгледате това серия от материали това публикация, обхващаща основите на Docker заедно с основите на Kubernetes и това статия за начинаещи.

Ръководство за композиране на Docker за начинаещи

Какво е Docker Compose?

Docker Compose е инструмент, включен в Docker. Предназначен е за решаване на проблеми, свързани с внедряването на проекти.

Докато изучавате основите на Docker, може да сте се натъкнали на създаването на най-простите приложения, които работят автономно, без да зависят, например, от външни източници на данни или от определени услуги. На практика подобни приложения са рядкост. Реалните проекти обикновено включват цял ​​набор от приложения за съвместна работа.

Как да разберете дали трябва да използвате Docker Compose при внедряване на проект? Всъщност е много просто. Ако използвате множество услуги за изпълнение на този проект, тогава Docker Compose може да ви бъде полезен. Например, в ситуация, в която създавате уебсайт, който, за да извърши удостоверяване на потребителя, трябва да се свърже с база данни. Такъв проект може да се състои от две услуги - една, която осигурява работата на сайта, и една, която отговаря за поддръжката на базата данни.

Технологията Docker Compose, ако я опишете по опростен начин, ви позволява да стартирате много услуги с една команда.

Разлика между Docker и Docker Compose

Docker се използва за управление на отделните контейнери (услуги), които съставят приложение.

Docker Compose се използва за управление на множество контейнери, които са част от приложение едновременно. Този инструмент предлага същите функции като Docker, но ви позволява да работите с по-сложни приложения.

Ръководство за композиране на Docker за начинаещи
Docker (единичен контейнер) и Docker Compose (множество контейнери)

Типичен случай на използване на Docker Compose

Docker Compose е, в правилните ръце, много мощен инструмент, който ви позволява бързо да внедрявате приложения със сложна архитектура. Сега ще разгледаме пример за практическото използване на Docker Compose, чийто анализ ще ви позволи да оцените ползите, които ще ви даде използването на Docker Compose.

Представете си, че сте разработчик на уеб проект. Този проект включва два уебсайта. Първият позволява на бизнесмени да създават само с няколко щраквания онлайн магазини. Вторият е насочен към поддръжка на клиенти. Тези два сайта взаимодействат с една и съща база данни.

Вашият проект става все по-популярен и се оказва, че капацитетът на сървъра, на който работи, вече не е достатъчен. В резултат на това решавате да прехвърлите целия проект на друга машина.

За съжаление не сте използвали нещо като Docker Compose. Следователно ще трябва да мигрирате и преконфигурирате услугите една по една, надявайки се, че няма да забравите нищо в процеса на тази работа.

Ако използвате Docker Compose, тогава мигрирането на вашия проект към нов сървър е проблем, който може да бъде разрешен чрез изпълнение на няколко команди. За да завършите прехвърлянето на проекта на ново място, трябва само да направите някои настройки и да качите резервно копие на базата данни на новия сървър.

Разработване на приложение клиент-сървър с помощта на Docker Compose

След като вече знаете за какво ще използваме Docker Compose, време е да създадете вашето първо клиент/сървър приложение с помощта на този инструмент. А именно, говорим за разработката на малък уеб сайт (сървър) на Python, който може да създаде файл с текстов фрагмент. Този файл се изисква от сървъра от програма (клиент), също написана на Python. След като получи файла от сървъра, програмата извежда на екрана записания в него текст.

Моля, обърнете внимание, че приемаме, че имате основите на Docker и че вече имате инсталирана платформата Docker.

Да започнем работа по проекта.

▍1. Създайте проект

За да изградите вашето първо клиент/сървър приложение, предлагам ви да започнете, като създадете папка на проекта. Трябва да съдържа следните файлове и папки:

  • досие docker-compose.yml. Това е Docker Compose файл, който ще съдържа инструкциите, необходими за стартиране и конфигуриране на услугите.
  • Папка server. Той ще съдържа файловете, необходими за работата на сървъра.
  • Папка client. Тук ще бъдат разположени файловете на клиентското приложение.

В резултат на това съдържанието на главната папка на вашия проект трябва да изглежда така:

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

▍2. Създаване на сървър

Тук ние, в процеса на създаване на сървър, ще се докоснем до някои основни неща относно Docker.

2а. Създаване на файлове

Отидете в папката server и създайте следните файлове в него:

  • досие server.py. Той ще съдържа кода на сървъра.
  • досие index.html. Този файл ще съдържа част от текста, който клиентското приложение трябва да показва.
  • досие Dockerfile. Това е Docker файлът, който ще съдържа инструкциите, необходими за създаване на сървърната среда.

Ето как трябва да изглежда съдържанието на вашата папка server/:

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

2б. Редактиране на Python файл.

Добавяне към файла server.py следния код:

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

Този код ви позволява да създадете прост уеб сървър. Той ще даде на клиентите файл index.html, чието съдържание по-късно ще бъде показано на уеб страницата.

2в. Редактиране на HTML файл

Да подаде index.html добавете следния текст:

Docker-Compose is magic!

Този текст ще бъде изпратен на клиента.

2г. Редактиране на Docker файла

Сега ще създадем прост файл Dockerfile, който ще отговаря за организирането на средата за изпълнение на Python сървъра. Като основа на създаденото изображение ще използваме официално, предназначен да изпълнява програми, написани на Python. Ето съдържанието на 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/

Сега да работим върху клиента.

▍3. Създайте клиент

Докато създаваме клиентската страна на нашия проект, ще си припомним някои основи на Docker по пътя.

3а. Създаване на файлове

Отидете в папката на вашия проект client и създайте следните файлове в него:

  • досие client.py. Това е мястото, където ще бъде клиентският код.
  • досие Dockerfile. Този файл играе същата роля като подобен файл в папката на сървъра. А именно, той съдържа изявление, което описва как да се създаде среда за изпълнение на клиентски код.

В резултат на това вашата папка client/ На този етап трябва да изглежда така:

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

3б. Редактиране на Python файл

Добавяне към файла client.py следния код:

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

Благодарение на този код клиентското приложение може да изтегля данни от сървъра и да ги показва на екрана.

3в. Редактиране на Docker файла

Както в случая със сървъра, ние създаваме за клиента прост Dockerfile, отговорен за оформянето на средата, в която ще работи клиентското приложение на Python. Ето кода на клиента Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Както можете да видите, създадохме два различни проекта: сървър и клиент. Всеки от тях има собствен файл Dockerfile. Досега всичко, което се случва, не надхвърля основите на работа с Docker. Сега започваме работа с Docker Compose. За да направите това, вижте файла docker-compose.ymlнамиращ се в основната папка на проекта.

Моля, имайте предвид, че тук нямаме за цел да покрием абсолютно всички команди, които могат да се използват в docker-compose.yml. Нашата основна цел е да разбием практически пример, който ви дава основни познания за Docker Compose.

Ето кода, който трябва да поставите във файла 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. Изграждане на проект

След в docker-compose.yml всички необходими инструкции са направени, проектът трябва да бъде сглобен. Тази стъпка от нашата работа наподобява използването на командата docker build, но съответната команда е свързана с няколко услуги:

$ docker-compose build

▍6. Стартиране на проекта

Сега, когато проектът е изграден, е време да го стартирате. Тази стъпка от нашата работа съответства на стъпката, на която при работа с отделни контейнери се изпълнява командата docker run:

$ docker-compose up

След изпълнение на тази команда текстът, зареден от клиента от сървъра, трябва да се появи в терминала: Docker-Compose is magic!.

Както вече споменахме, сървърът използва порта на компютъра 1234 за обслужване на клиентски заявки. Следователно, ако отидете в браузъра на адреса http://localhost:1234/, ще покаже страница с текст Docker-Compose is magic!.

Полезни команди

Нека да разгледаме някои от командите, които може да ви бъдат полезни, когато работите с Docker Compose.

Тази команда ви позволява да спирате и изтривате контейнери и други ресурси, създадени от командата docker-compose up:

$ docker-compose down

Тази команда отпечатва регистрационните файлове на услугата:

$ docker-compose logs -f [service name]

Например в нашия проект може да се използва в следната форма: $ docker-compose logs -f [service name].

С тази команда можете да покажете списък с контейнери:

$ docker-compose ps

Тази команда ви позволява да изпълните команда в работещ контейнер:

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

Например може да изглежда така: docker-compose exec server ls.

Тази команда ви позволява да покажете списък с изображения:

$ docker-compose images

Резултати от

Разгледахме основите на работа с технологията Docker Compose, чието познаване ще ви позволи да използвате тази технология и, ако желаете, да започнете да я изучавате по-задълбочено. тук е хранилище с кода на проекта, който разгледахме тук.

Уважаеми читатели! Използвате ли Docker Compose във вашите проекти?

Ръководство за композиране на Docker за начинаещи

Източник: www.habr.com

Добавяне на нов коментар