Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More

At one point, I decided to write an article about delivery in the form of Docker containers and deb packages, but when I started, I somehow drifted back to the distant times of the first personal computers and even calculators. In general, instead of dry comparisons between Docker and deb, I ended up with these reflections on the topic of evolution, which I present for your consideration.

Any product, no matter what it is, must somehow reach the product servers, be configured, and launched. This is what this article will be about.

I will reflect in a historical context, 'what I see, I sing about', what I saw when I first started writing code and what I observe now, what we ourselves are using at the moment and why. The article does not claim to be a comprehensive study; some moments are omitted; this is my personal view of what was and what exists now.

So, in the good old days
 the earliest method of delivery I experienced was cassette tapes from tape recorders. I had a BK-0010.01 computer...

The Era of Calculators

No, there was an even earlier moment; there was a calculator. MK-61 och MK-52.

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More So, when I had MK-61, the method of transferring a program was an ordinary sheet of graph paper, on which the program was recorded, and when it was necessary to launch it, it was manually entered into the calculator. If you wanted to play (yes, yes, even on this ancient calculator there were games) — you would sit down and input the program into the calculator. Naturally, when the calculator was turned off, the program vanished into oblivion. Besides the codes manually written on paper, programs were published in the magazines 'Radio' and 'Youth Technology', and also printed in books of that time.

The next modification was the calculator MK-52, which already had some semblance of non-volatile data storage. Now there was no need to manually input the game or program; after making some magical passes with the buttons, it loaded itself.

The largest program in the calculator was 105 steps, and the size of the permanent memory in the MK-52 was 512 steps.

Förresten, om det finns nĂ„gra fans av dessa kalkylatorer som lĂ€ser denna artikel — nĂ€r jag skrev artikeln hittade jag en emulator för kalkylatorn för Android och program för den. FramĂ„t, till det förflutna!

En liten avstickare om MK-52 (frÄn Wikipedia)

MK-52 flög i rymden pÄ rymdskeppet "Soyuz TM-7". Det var tÀnkt att anvÀndas för att berÀkna landningsbanan om omborddatorn skulle gÄ sönder.

MK-52 med minnesexpansionsenheten "Elektronika-Astro" började levereras till flottans fartyg som en del av ett navigationsberÀkningssystem frÄn 1988.

De första persondatorerna

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More LÄt oss ÄtervÀnda till tiderna BK-0010. Det Àr förstÄeligt att det ocksÄ blev mer minne, och att skriva in kod frÄn papper var verkligen inte ett alternativ lÀngre (Àven om jag i början gjorde just det, eftersom det inte fanns nÄgon annan lagringsmetod). Huvudmedlet för lagring och distribution av programvara blev ljudkassetter för kassettbandspelare.





Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and MoreLagring pÄ kassett var vanligtvis i form av en eller tvÄ binÀra filer, allt annat fanns internt. Tillförlitligheten var mycket lÄg, man var tvungen att ha 2-3 kopior av programmet. Laddningstiden var inte heller sÀrskilt tillfredsstÀllande; entusiaster experimenterade med olika frekvenskodningar för att bekÀmpa dessa brister. Jag sysslade sjÀlv inte med professionell mjukvaruutveckling vid den tiden (förutom nÄgra enkla program i Basic), sÄ jag kan tyvÀrr inte berÀtta i detalj hur allt var uppbyggt internt. Den enda faktorn att datorn hade endast RAM minnesmÀssigt definierade till stor del enkelheten i datalagringsschemat.

FramvÀxten av pÄlitliga och stora informationslagringar

Senare kom disketter, vilket förenklade kopieringsprocessen och ökade tillförlitligheten.
Men situationen förÀndras radikalt först nÀr tillrÀckligt stora lokala lagringsenheter i form av HDD blir tillgÀngliga.

Typen av distribution förÀndras principiellt: installationsprogram dyker upp som hanterar systemkonfigurationsprocessen och stÀdning efter borttagning, eftersom program inte bara lÀses in i minnet, utan kopieras redan till den lokala lagringsenheten, frÄn vilken man ocksÄ mÄste kunna rensa bort det som inte lÀngre behövs.

Samtidigt ökar komplexiteten hos den levererade programvaran.
Antalet filer i leveransen ökar frÄn en till hundratals och tusentals, vilket leder till versionskonflikter av bibliotek och andra glÀdjeÀmnen nÀr olika program anvÀnder samma data.

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More PÄ den tiden var jag fortfarande inte medveten om linuxexistensen, jag levde i en vÀrld av MS DOS och senare Windows, och jag programmerade pÄ Borland Pascal och Delphi, ibland tittade jag mot C++. För att leverera produkter anvÀnde mÄnga InstallShield. ru.wikipedia.org/wiki/InstallShield, som framgÄngsrikt löste alla uppsatta mÄl för deployment och konfiguration av mjukvara.




Internetepoken

Allt eftersom kompliciteten i programvarusystemen ökade, övergick man frÄn monolitiska och skrivbordsapplikationer till distribuerade system, tunn klient och mikrotjÀnster. Nu behövde man konfigurera inte bara ett program utan en uppsÀttning av dem, och de mÄste alla fungera bra tillsammans.

Konceptet förĂ€ndrades helt, Internet kom och en era av molntjĂ€nster började. Även om det fortfarande bara var i ett tidigt skede, i form av webbplatser, drömde ingen riktigt om tjĂ€nster, men detta var en vĂ€ndpunkt i industrin bĂ„de för utveckling och leverans av applikationer.

Jag la mÀrke till att vid denna tidpunkt skedde en generationsvÀxling bland utvecklarna (eller var det bara i min omgivning), och det kÀndes som att alla gamla goda sÀtt att leverera hade glömts bort pÄ en gÄng och allt började om frÄn början: all leverans började göras med skript skrivna pÄ knÀet, och man kallade det stolt "Continuous Delivery". I praktiken började en period av rörig ordning, dÀr det gamla var bortglömt och inte anvÀndes, medan det nya helt enkelt inte fanns.

Jag minns tiderna nÀr vi i företaget dÀr jag dÄ arbetade (jag kommer inte nÀmna namnet) istÀllet för att bygga genom ant (maven var dÄ fortfarande inte populÀr eller fanns överhuvudtaget), samlade folk bara jar-filen i IDE och tryggt committade den i SVN. Följaktligen bestod leveransen av att hÀmta filen frÄn SVN och kopiera den via SSH till rÀtt maskin. SÄ enkelt och primitivt.

Samtidigt gjorde leveransen av enkla webbplatser pĂ„ PHPs just det – en mycket primitiv kopiering av den korrigerade filen via FTP till mĂ„maskinen. Ibland fanns det inte ens sĂ„dant – koden Ă€ndrades direkt pĂ„ produktionsservern, och det var sĂ€rskilt lyxigt om det fanns nĂ„gra backupkopior nĂ„gonstans.


RPM- och DEB-paket

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and MoreÅ andra sidan, med internets utveckling har UNIX-liknande system blivit alltmer populĂ€ra, sĂ€rskilt just vid den tiden upptĂ€ckte jag RedHat Linux 6, omkring Ă„r 2000. Det Ă€r sjĂ€lvklart att det Ă€ven dĂ€r fanns verktyg för mjukvaruleverans, enligt Wikipedia upptrĂ€dde RPM som den huvudsakliga paketadministratören redan 1995, i version 2.0 av RedHat Linux. Och sedan dess har systemet levererats i form av RPM-paket och existensen har varit framgĂ„ngsrik och i utveckling.

Debian-familjens distributioner har gÄtt en liknande vÀg och implementerat mjukvaruleverans i form av deb-paket, vilket ocksÄ har förblivit oförÀndrat fram till idag.

Paketadministratörer gör det möjligt att leverera sjÀlva programprodukterna, konfigurera dem under installation, hantera beroenden mellan olika paket, utföra borttagning av produkter och stÀda upp överflödigt under avinstallation. Det vill sÀga, i stort sett Àr det allt som behövs, och dÀrför har de hÄllit sig i flera decennier nÀstan oförÀndrade.

Molnlösningar har lagt till möjlighet till installation inte bara frÄn fysiska lagringsmedia, utan Àven frÄn molnarkiv, men prinicipiellt har lite förÀndrats.

Det bör nÀmnas att det för nÀrvarande finns vissa tendenser mot att överge deb och övergÄ till snap-paket, men mer om det senare.

SÄ, detta nya generation av molnutvecklare, som inte kÀnde till vare sig DEB eller RPM, vÀxte ocksÄ sakta, fick erfarenhet, produkterna blev mer komplexa, och det krÀvdes mer rationella sÀtt att leverera, Àn FTP, bash-skript och liknande studentevenemang.
Och hĂ€r kommer Docker in i bilden, en slags blandning av virtualisering, resursegregation och leveransmetod. Det Ă€r nu modernt, ungdomligt, men behövs det för allt? Är det en universallösning?

Enligt mina observationer erbjuds Docker mycket ofta inte som ett rationellt val, utan helt enkelt för att det pratas om det i gemenskapen, och de som erbjuder det kĂ€nner endast till det. Å andra sidan Ă€r de gamla goda paketeringssystemen mestadels tysta — de finns och gör sitt jobb tyst och osynligt. I en sĂ„dan situation finns det inte mycket val — valet Ă€r uppenbart — Docker.

Jag försöker dela med mig av erfarenheten av hur vi implementerade Docker, och vad resultatet blev.


Egenutvecklade skript

I början fanns det bash-skript som distribuerade jar-filer till de nödvĂ€ndiga maskinerna. Jenkins hanterade denna process. Det fungerade framgĂ„ngsrikt, eftersom jar-filen redan Ă€r en samling som innehĂ„ller klasser, resurser och till och med konfiguration. Om man packar allt maximalt i den — Ă€r det inte det mest komplicerade att distribuera den med skript.

Men skripten har flera nackdelar:

  • Skripten skrivs ofta hastigt vilket gör dem sĂ„ primitiva att de bara innehĂ„ller det mest gynnsamma scenariot. Detta frĂ€mjas av att utvecklaren Ă€r intresserad av att leverera snabbt, medan ett ordentligt skript krĂ€ver investering av en hel del resurser.
  • Som en följd av föregĂ„ende punkt innehĂ„ller skripten ingen avinstallationsprocedur.
  • Det finns ingen etablerad uppgraderingsprocedur.
  • Vid lanseringen av en ny produkt mĂ„ste man skriva ett nytt skript.
  • Det finns inget stöd för beroenden.

Naturligtvis kan man skriva ett avancerat skript, men som jag nĂ€mnde tidigare — det tar tid att utveckla, och tid Ă€r alltid en bristvara.

Detta begrÀnsar sjÀlvklart anvÀndningsomrÄdet för denna distributionsmetod till enklaste system. Det Àr dags att Àndra pÄ detta.


Docker

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and MoreVid nĂ„got tillfĂ€lle började nyutbildade mellanliggande utvecklare komma till oss, sprudlande av idĂ©er och drömmande om Docker. Jaha, lĂ„t oss göra det! Det gjordes tvĂ„ försök. BĂ„da misslyckade — lĂ„t oss sĂ€ga, pĂ„ grund av stora ambitioner men bristande verklig erfarenhet. Skulle vi tvinga fram och avsluta det med alla medel? Troligtvis inte — teamet mĂ„ste vĂ€xa evolutionsmĂ€ssigt till rĂ€tt nivĂ„ innan det kan anvĂ€nda rĂ€tt verktyg. Dessutom, nĂ€r vi anvĂ€nde fĂ€rdiga Docker-bilder, stötte vi ofta pĂ„ problem med nĂ€tverket (vilket kanske ocksĂ„ var kopplat till det instabila hos Docker sjĂ€lv) eller hade svĂ„rt att utvidga andras containrar.

Vilka besvÀr stötte vi pÄ?

  • NĂ€tverksproblem i bridge-lĂ€ge.
  • Det Ă€r obekvĂ€mt att se loggar i containern (om de inte Ă€r flyttade separat till filsystemet pĂ„ vĂ€rdmaskinen).
  • Periodisk konstig frysnings av ElasticSearch inuti containern, orsaken kunde vi aldrig faststĂ€lla, containern Ă€r officiell.
  • Det Ă€r obekvĂ€mt att anvĂ€nda shell i containern — allt Ă€r kraftigt begrĂ€nsat, inga bekanta verktyg finns tillgĂ€ngliga.
  • Stora storlekar pĂ„ insamlade containrar – dyrt att lagra
  • PĂ„ grund av stora storlekar pĂ„ containrar Ă€r det svĂ„rt att stödja flera versioner
  • LĂ€ngre samlingstid, i motsats till andra metoder (skript eller deb-paket)

Å andra sidan, varför skulle en Spring-tjĂ€nst i form av en jar-arkiv vara sĂ€mre att distribuera via samma deb? Är resursisolering verkligen nödvĂ€ndig? Ska man avstĂ„ frĂ„n bekvĂ€ma verktyg i operativsystemet genom att stoppa tjĂ€nsten i en kraftigt nedbantad container?

Som erfarenheten visar – i praktiken Ă€r det inte nödvĂ€ndigt, deb-paket rĂ€cker i 90% av fallen.

NÀr fungerar den gamla goda deb ÀndÄ inte och nÀr behövde vi faktiskt Docker?

För oss handlade det om att distribuera tjĂ€nster pĂ„ python. MĂ„nga bibliotek som behövs för maskininlĂ€rning som saknades i standarddistributionen av operativsystemet (och det som fanns – var inte i rĂ€tt version), hack för instĂ€llningar, behov av olika versioner för olika tjĂ€nster som lever pĂ„ samma vĂ€rdsystem ledde till att det enda rimliga sĂ€ttet att leverera denna kĂ€rnblandning blev Docker. Arbetsinsatsen för att bygga Docker-container var lĂ€gre Ă€n tanken att paketera allt detta i separata deb-paket med beroenden, och ingen vid sunda förnuft skulle ens ta sig an det.

Den andra punkten dĂ€r Docker planeras att anvĂ€ndas – för distribution av tjĂ€nster enligt blue-green deploy-schema. Men hĂ€r vill man fĂ„ en gradvis ökning av komplexiteten: först samlas deb-paket, och sedan byggs Docker-containern utifrĂ„n dem.


Snap-paket

Evolution of Delivery Methods, or Reflections on Docker, deb, jar, and More LĂ„t oss Ă„terkomma till snap-paketen. De dök upp officiellt i Ubuntu 16.04. Till skillnad frĂ„n de vanliga deb-paketen och rpm-paketen bĂ€r snap pĂ„ alla beroenden. Å ena sidan undviker detta biblioteks konflikter, Ă„ andra sidan ger det mer betydande storlekar pĂ„ det resulterande paketet. Dessutom kan detta pĂ„verka systemets sĂ€kerhet: vid leverans av snap mĂ„ste utvecklaren som skapar paketet hĂ„lla koll pĂ„ alla Ă€ndringar i de inkluderade biblioteken. SĂ„ det Ă€r inte helt entydigt och allmĂ€n lycka med deras anvĂ€ndning kommer inte automatiskt. Men icke desto mindre Ă€r det en fullt rimlig alternativ, om samma Docker anvĂ€nds endast som ett medel för paketering, inte virtualisering.



Som sammanfattning anvÀnds vi nu i en rimlig kombination bÄde deb-paket och Docker-containrar, som vi eventuellt kommer att byta ut mot snap-paket i vissa fall.

Endast registrerade anvÀndare kan delta i omröstningen. Logga in, tack.

Vad anvÀnder du för leverans?

  • Egenutvecklade skript

  • Vi kopierar manuellt via FTP.

  • deb-paket

  • rpm-paket

  • snap-paket

  • Docker-bilder

  • Virtuella maskinbilder

  • Vi klonar hela HDD:n.

  • puppet

  • ansible

  • Annat

109 anvÀndare röstade. 32 anvÀndare avstod.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster