Docker Compose: спрашчэнне працы з выкарыстаннем Makefile

Кожныя некалькі гадоў у індустрыі распрацоўкі ПЗ адбываецца змена парадыгмы. Адной з такіх з'яў можна прызнаць рост цікавасці да канцэпцыі мікрасэрвісаў. Хоць мікрасэрвісы – гэта тэхналогія не самая новая, толькі ў апошні час яе папулярнасць літаральна ўзляцела да нябёсаў.

Вялікія маналітныя сэрвісы ў нашы дні замяняюць незалежнымі аўтаномнымі мікрасэрвісамі. Мікрасэрвіс можна разглядаць як дадатак, якое служыць адзінай і вельмі спецыфічнай мэты. Напрыклад - гэта можа быць рэляцыйная СКБД, Express-дадатак, Solr-сэрвіс.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile

У нашы дні складана ўявіць сабе распрацоўку новай праграмнай сістэмы без ужывання мікрасэрвісаў. А гэтая сітуацыя, у сваю чаргу, вядзе нас да платформы Docker.

Докер

Платформа Докер, у справе распрацоўкі і разгортвання мікрасэрвісаў, стала практычна індустрыяльным стандартам. На сайце праекта можна даведацца аб тым, што Docker - гэта адзіная незалежная платформа кантэйнерызацыі, якая дазваляе арганізацыям без асаблівых намаганняў ствараць любыя прыкладанні, а таксама распаўсюджваць і запускаць іх у любых асяроддзях - ад гібрыдных аблокаў, да памежных сістэм.

Docker Compose

Тэхналогія Docker Compose прызначана для канфігуравання шматкантэйнерных прыкладанняў. У Docker Compose-праект можа ўваходзіць гэтулькі кантэйнераў Docker, колькі трэба стваральніку гэтага праекту.

Пры працы з Docker Compose для налады сэрвісаў прыкладання і арганізацыі іх узаемадзеяння сябар з сябрам выкарыстоўваецца YAML-файл. Docker Compose, такім чынам, гэта прылада для апісання і запуску шматкантэйнерных прыкладанняў Docker.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Два кантэйнера, якія працуюць на хост-сістэме

Зрабіць GNU

Праграма make, па сутнасці, уяўляе сабой інструмент для аўтаматызацыі зборкі праграм і бібліятэк з зыходнага кода. У цэлым, можна казаць аб тым, што make дастасавальная да любога працэсу, які складаецца з выкананне адвольных каманд для пераўтварэння некаторых зыходных матэрыялаў да нейкага выніковага выгляду, да нейкай мэты. У нашым выпадку каманды docker-compose будуць пераўтварацца ў абстрактныя мэты (Phony targets).

Для таго каб паведаміць праграме make пра тое, чаго мы ад яе жадаем, нам спатрэбіцца файл Makefile.

У нашым Makefile будуць утрымлівацца звычайныя каманды docker и docker-compose, якія прызначаны для вырашэння мноства задач. У прыватнасці, гаворка ідзе аб зборцы кантэйнера, аб яго запуску, прыпынку, перазапуску, аб арганізацыі ўваходу карыстальніка ў кантэйнер, аб працы з логамі кантэйнера і аб рашэнні іншых падобных задач.

Тыповыя варыянты выкарыстання Docker Compose

Уявім сабе звычайны вэб-дадатак, у якім маюцца наступныя кампаненты:

  • База даных TimescaleDB (Postgres).
  • Express.js-дадатак.
  • Ping (проста кантэйнер, нічога асаблівага не які робіць).

Гэтаму з дадаткам спатрэбіцца 3 кантэйнера Docker і файл docker-compose, які змяшчае інструкцыі па кіраванні гэтымі кантэйнерамі. Кожны з кантэйнераў будзе валодаць рознымі кропкамі ўзаемадзеяння. Напрыклад, з кантэйнерам timescale можна будзе працаваць прыкладна так, як працуюць з базамі даных. У прыватнасці, ён дазваляе выконваць наступныя дзеянні:

  • Уваход у абалонку Postgres.
  • Імпарт і экспарт табліц.
  • стварэнне pg_dump табліцы або базы даных.

Кантэйнер Express.js-дадаткі, expressjs, можа валодаць наступнымі магчымасцямі:

  • Выдача новых дадзеных з сістэмнага часопіса.
  • Уваход у абалонку для выканання некаторых каманд.

Узаемадзеянне з кантэйнерамі

Пасля таго, як мы наладзілі сувязь паміж кантэйнерамі з выкарыстаннем Docker Compose, прыйшоў час наладжвання ўзаемадзеяння з гэтымі кантэйнерамі. У рамках сістэмы Docker Compose ёсць каманда docker-compose, якая падтрымлівае опцыю -f, якая дазваляе перадаваць сістэме файл docker-compose.yml.

Выкарыстоўваючы магчымасці гэтай опцыі, можна абмежаваць узаемадзеянне з сістэмай толькі тымі кантэйнерамі, якія згаданыя ў файле. docker-compose.yml.

Зірнем на тое, як выглядаюць узаемадзеянні з кантэйнерамі пры выкарыстанні каманд docker-compose. Калі ўявіць, што нам трэба ўвайсці ў абалонку psql, то адпаведныя каманды могуць выглядаць так:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

Тая ж каманда, для выканання якой выкарыстоўваецца не docker-compose, А docker, можа выглядаць так:

docker exec -it  edp_timescale_1 psql -Upostgres

Звернеце ўвагу на тое, што ў падобных выпадках заўсёды пераважней выкарыстоўваць не каманду docker, а каманду docker-compose, так як гэта дазваляе пазбавіцца ад неабходнасці памятаць імёны кантэйнераў.

Абедзве прыведзеных вышэй каманды не так ужо і складаныя. Але калі б мы скарысталіся абгорткай у выглядзе Makefile, якая давала б нам інтэрфейс у выглядзе простых каманд і сама б выклікала падобныя доўгія каманды, то тых жа вынікаў можна было б дабіцца так:

make db-shell

Цалкам відавочна тое, што выкарыстанне Makefile значна спрашчае працу з кантэйнерамі!

Рабочы прыклад

На аснове вышэйразгледжанай схемы праекту створым наступны файл docker-compose.yml:

version: '3.3'
services:
    api:
        build: .
        image: mywebimage:0.0.1
        ports:
            - 8080:8080
        volumes:
            - /app/node_modules/
        depends_on:
            - timescale
        command: npm run dev
        networks:
            - webappnetwork
    timescale:
        image: timescale/timescaledb-postgis:latest-pg11
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
        volumes:
          - ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
        networks:
           - webappnetwork
    ping:
       image: willfarrell/ping
       environment:
           HOSTNAME: "localhost"
           TIMEOUT: 300
networks:
   webappnetwork:
       driver: bridge

Для кіравання канфігурацыяй Docker Compose і для ўзаемадзеяння з кантэйнерамі, якія яна апісвае, створым наступны файл Makefile:

THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
        make -pRrq  -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
        docker-compose -f docker-compose.yml build $(c)
up:
        docker-compose -f docker-compose.yml up -d $(c)
start:
        docker-compose -f docker-compose.yml start $(c)
down:
        docker-compose -f docker-compose.yml down $(c)
destroy:
        docker-compose -f docker-compose.yml down -v $(c)
stop:
        docker-compose -f docker-compose.yml stop $(c)
restart:
        docker-compose -f docker-compose.yml stop $(c)
        docker-compose -f docker-compose.yml up -d $(c)
logs:
        docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
        docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
        docker-compose -f docker-compose.yml ps
login-timescale:
        docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
        docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
        docker-compose -f docker-compose.yml exec timescale psql -Upostgres

Большасць апісаных тут каманд прымяняюцца да ўсіх кантэйнераў, але выкарыстанне опцыі c= дазваляе абмежаваць вобласць дзеяння каманды да аднаго кантэйнера.

Пасля таго, як Makefile гатовы, карыстацца ім можна так:

  • make help - выдача пераліку ўсіх каманд, даступных для make.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Даведка па даступных камандах

  • make build - зборка выявы з Dockerfile. У нашым прыкладзе мы выкарыстоўвалі існуючыя вобразы timescale и ping. Але вобраз api мы жадаем сабраць лакальна. Менавіта гэта і будзе зроблена пасля выканання гэтай каманды.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Зборка кантэйнера Docker

  • make start - запуск усіх кантэйнераў. Для запуску толькі аднаго кантэйнера можна скарыстацца камандай віду make start c=timescale.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Запуск кантэйнера timescale

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Запуск кантэйнера ping

  • make login-timescale - уваход у bash-сесію кантэйнера timescale.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Запуск bash у кантэйнеры timescale

  • make db-shell - уваход у psql у кантэйнеры timescale для выканання SQL-запытаў да базы дадзеных.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Запуск psql у кантэйнеры timescaledb

  • make stop - Прыпынак кантэйнераў.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Прыпынак кантэйнера timescale

  • make down - Прыпынак і выдаленне кантэйнераў. Для выдалення канкрэтнага кантэйнера можна выкарыстоўваць гэтую каманду з указаннем патрэбнага кантэйнера. Напрыклад - make down c=timescale або make down c=api.

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile
Прыпынак і выдаленне ўсіх кантэйнераў

Вынікі

Нягледзячы на ​​тое, што сістэма Docker Compose дае ў наша распараджэнне шырокі набор каманд, прызначаных для кіравання кантэйнерамі, часам гэтыя каманды становяцца доўгімі, у выніку іх бывае складана запомніць.

Методыка выкарыстання Makefile дапамагла нам наладзіць хуткае і простае ўзаемадзеянне з кантэйнерамі з файла docker-compose.yml. У прыватнасці, гаворка ідзе аб наступным:

  • Распрацоўнік ўзаемадзейнічае толькі з кантэйнерамі праекта, апісанымі ў docker-compose.yml, працы не перашкаджаюць іншыя запушчаныя кантэйнеры.
  • У тым выпадку, калі нейкая каманда забытая, можна выканаць каманду make help і атрымаць даведку па даступным камандам.
  • Не трэба запамінаць доўгіх спісаў аргументаў для выканання такіх дзеянняў, як атрыманне свежых запісаў часопіса ці ўваход у сістэму. Напрыклад, каманда віду docker-compose -f docker-compose.yml exec timescale psql -Upostgres ператвараецца ў make db-shell.
  • файл Makefile можна, па меры росту праекту, гнутка пад яго падладжваць. Напрыклад, у яго нескладана дадаць каманду для стварэння рэзервовай копіі базы дадзеных ці для выканання любога іншага дзеяння.
  • Калі вялікая каманда распрацоўшчыкаў карыстаецца адным і тым жа Makefile, гэта парадкуе сумесную працу і зніжае колькасць памылак.

PS У нашым маркетплэйсе маецца вобраз Докер, Які ўстанаўліваецца ў адзін клік. Вы можаце праверыць працу кантэйнераў на VPS. Усім новым кліентам бясплатна прадастаўляюцца 3 дні для тэсціравання.

Паважаныя чытачы! Як вы аўтаматызуеце працу з Docker Compose?

Docker Compose: спрашчэнне працы з выкарыстаннем Makefile

Крыніца: habr.com

Дадаць каментар