Docker Compose: darba vienkāršošana, izmantojot Makefile

Ikvienu pāris gadu laikā programmatūras izstrādes nozarē notiek paradigmas maiņa. Viens no šiem parādībām ir interesi par mikropakalpojumu koncepciju. Lai gan mikropakalpojumi nav jauna tehnoloģija, to popularitāte pēdējā laikā ir strauji pieaugusi.

Lielie monolītiskie pakalpojumi mūsdienās tiek aizstāti ar neatkarīgiem autonomiem mikropakalpojumiem. Mikropakalpojumu var uzskatīt par lietojumprogrammu, kas kalpo vienai un ļoti specifiskai mērķim. Piemēram, tas var būt relāciju datu bāze, Express lietojumprogramma vai Solr pakalpojums.

Docker Compose: darba vienkāršošana, izmantojot Makefile

Mūsdienās ir grūti iedomāties jaunas programmatūras sistēmas izstrādi bez mikropakalpojumiem. Šī situācija mūs, savukārt, novirza uz Docker platformu.

Docker

Platforma Docker, mikropakalpojumu izstrādes un izvietošanas jomā ir kļuvusi par praktiski industrijas standartu. Projekta tīmekļa vietnē var uzzināt, ka Docker ir vienīgā neatkarīgā konteinerizācijas platforma, kas ļauj organizācijām bez sarežģījumiem veidot jebkādas lietojumprogrammas, kā arī izplatīt un palaist tās jebkurā vidē — no hibrīda mākoņiem līdz malas sistēmām.

Docker Compose

Tehnoloģija Docker Compose ir paredzēta vairāku konteineru lietojumprogrammu konfigurēšanai. Docker Compose projektā var ietilpt tik daudz Docker konteineru, cik nepieciešams šī projekta veidotājam.

Strādājot ar Docker Compose, lai iestatītu lietojumprogrammas pakalpojumus un organizētu to mijiedarbību, tiek izmantots YAML fails. Tādējādi Docker Compose ir rīks, kas apraksta un palaida vairāku konteineru Docker lietojumprogrammas.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Divi konteineri, kas darbojas uz hosta sistēmas

GNU Make

Programma make, būtībā ir rīks, kas automatizē programmu un bibliotēku izstrādāšanu no avota koda. Kopumā var teikt, ka make tā ir piemērojama jebkuram procesam, kas ietver brīvprātīgu komandu izpildi, lai pārveidotu noteiktus izejmateriālus uz noteiktu rezultātu vai mērķi. Mūsu gadījumā komandas docker-compose tiks pārveidotas par abstraktiem mērķiem (Phony targets).

Lai paziņotu programmai make par to, ko vēlamies no viņas, mums būs nepieciešams fails Makefile.

Mūsu Makefile kas saturēs parastās komandas docker un docker-compose, kas paredzēti daudzu uzdevumu risināšanai. Proti, mēs runājam par konteineru izveidošanu, to palaišanu, apturēšanu, restartēšanu, lietotāja pieteikšanos konteineros, darbu ar konteineru žurnāliem un citu līdzīgu uzdevumu risināšanu.

Tipiski Docker Compose lietošanas gadījumi

Iedomāsimies tipisku tīmekļa lietojumprogrammu, kurā ir sekojošie komponenti:

  • TimescaleDB (Postgres) datu bāze.
  • Express.js lietojumprogramma.
  • Ping (vienkārši konteiners, kas neko īpašu nedara).

Šai lietojumprogrammai būs nepieciešami 3 Docker konteineri un fails docker-compose, kura satur instrukcijas šo konteiners vadīšanai. Katram no konteineriem būs dažādas saskarnes. Piemēram, ar konteinera timescale varēs darboties līdzīgi kā ar datu bāzēm. Proti, tas ļauj veikt šādas darbības:

  • Ienākšana Postgres terminālī.
  • Tabulu importēšana un eksportēšana.
  • Izveide pg_dump jaunas tabulas vai datu bāzes.

Express.js konteiners expressjs, var nodrošināt šādas iespējas:

  • Jaunu datu sniegšana no sistēmas žurnāla.
  • Ienākšana terminālī, lai izpildītu noteiktas komandas.

Mijiedarbība ar konteineriem

Pēc tam, kad esam konfigurējuši savienojumu starp konteineriem, izmantojot Docker Compose, ir pienācis laiks nodrošināt mijiedarbību ar šiem konteineriem. Docker Compose sistēmā ir komanda docker-compose, kas atbalsta opciju -f, kas ļauj nodot sistēmai failu docker-compose.yml.

Izmantojot šīs opcijas iespējas, varam ierobežot mijiedarbību ar sistēmu tikai ar tiem konteineriem, kuri minēti failā docker-compose.yml.

Paskatīsimies, kā izskatās mijiedarbība ar konteineriem, izmantojot komandas docker-compose. Ja mēs vēlētos ienākt terminālī psql, attiecīgās komandas varētu izskatīties šādi:

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

Tā pati komanda, kuru izmanto, neizmantojot docker-compose, bet docker, varētu izskatīties šādi:

docker exec -it edp_timescale_1 psql -Upostgres

Ņemiet vērā, ka šādos gadījumos vienmēr ir ieteicamāk izmantot nevis komandu docker, bet komandu docker-compose, jo tas ļauj izvairīties no nepieciešamības atcerēties konteineru nosaukumus.

Abas iepriekš minētās komandas nav pārāk sarežģītas. Bet, ja mēs izmantotu "apvalku", kas veidots Makefile, kas sniegtu mums saskarni kā vienkāršas komandas un pati izsauktu līdzīgas garas komandas, tad tos pašus rezultātus varētu sasniegt šādi:

make db-shell

Ir pilnīgi acīmredzams, ka izmantošana Makefile ievērojami atvieglo darbu ar konteineriem!

Darba piemērs

Pamatojoties uz iepriekšminēto projekta shēmu, izveidosim nākamo failu 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

Lai pārvaldītu Docker Compose konfigurāciju un mijiedarbotos ar konteineriem, kurus tā apraksta, izveidosim nākamo failu 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 -U postgres

Lielākā daļa šeit aprakstīto komandu tiek lietotas visiem konteineriem, bet opcijas c= ļauj ierobežot komandas darbības jomu līdz vienam konteineram.

Pēc tam, kad Makefile gatavs, to var izmantot tā:

  • make help — izvadīt visus pieejamos komandu sarakstus, make.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Palaidiet pieejamo komandu palīdzību

  • make build — attēla izveide no Dockerfile. Mūsu piemērā mēs izmantojām esošās bildes timescale un ping. Bet bilde api ko mēs vēlamies savākt lokāli. Tieši to mēs izdarīsim pēc šīs komandas izpildes.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Docker konteineru veidošana

  • make start — visu konteineru palaišana. Lai palaistu tikai vienu konteineru, var izmantot komandu make start c=timescale.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Timescale konteineru palaišana

Docker Compose: darba vienkāršošana, izmantojot Makefile
Ping konteineru palaišana

  • make login-timescale — iekļūšana konteineru bash sesijā timescale.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Bash palaišana timescale konteinerā

  • make db-shell — iekļūšana psql konteinerā timescale lai veiktu SQL vaicājumus uz datu bāzi.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Psql palaišana timescaledb konteinerā

  • make stop — konteineru apstādināšana.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Timescale konteineru apstādināšana

  • make down — konteineru apstādināšana un dzēšana. Lai dzēstu konkrētu konteineru, var izmantot šo komandu ar norādītu vajadzīgo konteineru. Piemēram — make down c=timescale vai make down c=api.

Docker Compose: darba vienkāršošana, izmantojot Makefile
Visu konteineru apstādināšana un dzēšana

Secinājumi

Neskatoties uz to, ka Docker Compose sniedz plašu komandu klāstu, kas ir paredzēts konteineru pārvaldībai, dažreiz šīs komandas kļūst garas, līdz ar to tās ir grūti atcerēties.

Izmantošanas metode Makefile palīdzēja mums nodrošināt ātru un vienkāršu mijiedarbību ar konteineriem no faila docker-compose.yml. Proti, runa ir par sekojošo:

  • Izstrādātājs sadarbojas tikai ar projekta konteineriem, kas aprakstīti docker-compose.yml, strādājot netraucē citu palaistu konteineru.
  • Ja kāda komanda ir aizmirsta, var izpildīt komandu make help un saņemt informāciju par pieejamām komandām.
  • Nav jāatceras garus argumentu sarakstus, lai veiktu tādas darbības kā jaunāko žurnāla ierakstu saņemšana vai iekļūšana sistēmā. Piemēram, komanda docker-compose -f docker-compose.yml exec timescale psql -Upostgres pārvēršas make db-shell.
  • Fails Makefile to var, projekta attīstoties, pielāgot tādā veidā. Piemēram, nav grūti pievienot komandu datu bāzes dublēšanai vai jebkurai citai rīcībai.
  • Ja liela izstrādātāju komanda izmanto to pašu Makefile, tas sakārto sadarbību un samazina kļūdu skaitu.

P.S. Mūsu tirgus vietnē ir attēls Docker, kas tiek instalēts ar vienu klikšķi. Jūs varat pārbaudīt konteineru darbību uz VPS. Visām jaunajām klientam tiek sniegti 3 dienas bezmaksas testēšanai.

Cienījamie lasītāji! Kā jūs automatizējat darbu ar Docker Compose?

Docker Compose: darba vienkāršošana, izmantojot Makefile

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster