Docker hè un ghjoculu o micca? O hè sempre vera ?

Bonghjornu ognunu!

Vogliu veramente andà direttamente à u tema, ma saria più currettu di cuntà un pocu di a mo storia:

Plus

Sò un programatore cù sperienza in u sviluppu di applicazioni frontend di una sola pagina, scala / java è nodejs in u servitore.

Per un bellu pezzu (definitivamente un paru o trè anni), era di l'opinione chì Docker hè manna da u celu è in generale un strumentu assai cool è assolutamente ogni sviluppatore deve esse capace di usà. E da questu segue chì ogni sviluppatore deve avè installatu Docker in a so macchina locale. Cosa di u mo parè, fighjate à traversu i vacanti chì sò publicati nantu à u listessu hh. Ogni seconda cuntene una menzione di docker, è se u pussede, questu serà u vostru vantaghju cumpetitivu 😉

In u mo modu, aghju scontru parechje persone, cù e so diverse attitudini versu Docker è u so ecosistema. Qualchidunu dicenu chì questu hè una cosa cunvene chì guarantisci a funziunalità cross-platform. I secondi ùn anu micca capitu per quessa ch'elli duveranu curriri in cuntenituri è quale prufittu venenu da questu, u terzu ùn hà micca cura di tuttu è ùn hà micca disturbatu (anu scrittu solu u codice è si n'andò in casa - l'invidiu, da u manera :)

Motivi di usu

Perchè aghju utilizatu docker? Probabilmente per i seguenti motivi:

  • lanciamentu di basa di dati, 99% di l'applicazioni l'utilizanu
  • lanciari nginx per a distribuzione frontend è proxy à u backend
  • pudete imballà l'applicazione in una maghjina docker, cusì a mo applicazione funziona induve esiste docker, u prublema di distribuzione hè risolta immediatamente.
  • scuperta di serviziu fora di a scatula, pudete creà microservizi, ogni cuntinuu (cunnessu à una reta cumuna) pò facilmente ghjunghje à un altru via un alias, assai convenientu
  • Hè divertitu per creà un cuntinuu è "ghjucà" in questu.

Ciò chì ùn mi piace micca sempre di docker:

  • Per chì a mo applicazione funziona, aghju bisognu di Docker stessu nantu à u servitore. Perchè aghju bisognu di questu se e mo applicazioni sò in jre o nodejs è l'ambiente per elli hè digià in u servitore?
  • se vogliu eseguisce a mo maghjina (privata) custruita localmente in un servitore remoto, allora aghju bisognu di u mo propiu repository docker, aghju bisognu di u registru per travaglià in qualchì locu è aghju ancu bisognu di cunfigurà https, perchè docker cli funziona solu nantu à https. Oh damn ... ci sò opzioni, sicuru, per salvà l'imaghjini in u locu via docker save è solu mandà l'imaghjini via scp... Ma questu hè assai movimenti di u corpu. È in più, pare una suluzione "crutch" finu à chì u vostru propiu repositoriu appare
  • docker-compose. Hè necessariu solu per curriri cuntenituri. Eccu tuttu. Ùn pò fà nunda altru. Docker-compose hà una mansa di versioni di i so schedari, a so propria sintassi. Ùn importa micca quantu hè dichjarazione, ùn vogliu micca leghje a so documentazione. Ùn aghju micca bisognu in altrò.
  • quandu travaglia in una squadra, a maiò parte di a ghjente scrive un Dockerfile assai stortu, ùn capisce micca cumu hè in cache, aghjunghje tuttu ciò chì anu bisognu è ùn anu micca bisognu à l'imaghjini, eredite da l'imaghjini chì ùn sò micca in Dockerhub o un repository privatu, creanu qualchi docker-compose schedari cù basa di dati è nunda persiste. À u listessu tempu, i sviluppatori dichjaranu orgogliosi chì Docker hè cool, tuttu funziona in u locu per elli, è HR impurtante scrive in u vacante: "Usemu Docker è avemu bisognu di un candidatu cù una tale sperienza di travagliu".
  • Sò constantemente perseguitatu da pinsamenti nantu à elevà tuttu in Docker: postgresql, kafka, redis. Hè una disgrazia chì micca tuttu funziona in cuntenituri, micca tuttu hè faciule di cunfigurà è eseguisce. Questu hè supportatu da sviluppatori di terzu, è micca da i venditori stessi. E per via, a quistione hè subitu: i venditori ùn anu micca preoccupatu di mantene i so prudutti in Docker, perchè hè questu, forse sanu qualcosa?
  • A quistione sempre nasce nantu à a persistenza di e dati di u containeru. è allora pensate, duverebbe ghjustu à muntà u cartulare di l'ospiti o creà un voluminu docker o fà un containeru di dati chì hè avà deprecated? Se aghju muntatu un repertoriu, allora aghju bisognu di assicurà chì l'uid è u gid di l'utilizatore in u cuntinuu currisponde à l'id di l'utilizatore chì hà lanciatu u cuntinuu, altrimenti i schedari creati da u cuntinuu seranu creati cù diritti di root. Se l'usu volume tandu i dati sarà simpricimenti creatu in certi /usr/* è ci sarà a stessa storia cù uid è gid cum'è in u primu casu. Sè vo lanciate un cumpunente di terzu, avete bisognu di leghje a ducumentazione è cercate a risposta à a quistione: "in quale repertoriu di cuntenituri u cumpunente scrive i schedari?"

Ùn mi hè sempre piaciutu u fattu chì aghju avutu à chjappà cù Docker per troppu longu in u stadiu iniziale: Aghju capitu cumu lanciari cuntenituri, da quali imaghjini lanciari, fattu Makefiles chì cuntenenu alias à cumandamenti longu di Docker. Aghju odiatu docker-compose perchè ùn vulia micca amparà un altru strumentu in l'ecosistema docker. È docker-compose up M'hà disturbatu, soprattuttu s'elli si scontranu sempre quì build custruzzioni, piuttostu cà imagine digià assemblatu. Tuttu ciò chì vulia veramente era di fà solu un pruduttu in modu efficiente è rapidamente. Ma ùn pudia capisce cumu utilizà docker.

Presentazione di Ansible

Ricertamenti (trè mesi fà), aghju travagliatu cù una squadra DevOps, quasi tutti i membri di quale avianu una attitudine negativa versu Docker. Per ragioni:

  • docker regule iptables (ancu se pudete disattivà lu in daemon.json)
  • docker hè buggy è ùn l'avemu micca eseguitu in produzzione
  • se docker daemon crashs, allura tutti i cuntenituri cù infrastruttura crash in conseguenza
  • senza bisognu di docker
  • perchè docker s'ellu ci hè Ansible è macchine virtuale

À u stessu travagliu, aghju cunnisciutu un altru strumentu - Ansible. L'aghju intesu parlà una volta, ma ùn aghju micca pruvatu à scrive u mo propiu playbooks. È avà aghju cuminciatu à scrive i mo compiti è dopu a mo visione hà cambiatu cumplettamente ! Perchè aghju realizatu: Ansible hà moduli per eseguisce i stessi cuntenituri docker, custruzzioni di l'imaghjini, rete, etc., è i cuntenituri ponu esse gestiti micca solu in u locu, ma ancu in i servitori remoti! U mo piacè ùn cunnosci micca limiti - aghju trovu un strumentu NORMAL è aghju cacciatu u mo Makefile è i schedarii docker-compose, sò stati rimpiazzati cù compiti yaml. U codice hè stata ridutta usendu custruzzioni cum'è loop, when, Etc.

Docker per eseguisce cumpunenti di terze parti cum'è basa di dati

Recentemente aghju cunnisciutu i tunnel ssh. Hè risultatu chì hè assai faciule "forward" u portu di un servitore remoto à un portu lucale. U servitore remotu pò esse sia una macchina in u nuvulu sia una macchina virtuale chì funziona in VirtualBox. Se u mo cullega o aghju bisognu di una basa di dati (o qualchì altru cumpunente di terzu), pudemu simpricimenti inizià u servitore cù questu cumpunente è spegne quandu u servitore ùn hè micca necessariu. A spedizione di portu dà u listessu effettu cum'è una basa di dati chì curre in un containeru docker.

Questu cumandimu trasmette u mo portu lucale à un servitore remoto chì esegue postgresql:

ssh -L 9000:localhost:5432 [email prutettu]

Utilizà un servitore remoto risolve u prublema cù u sviluppu di a squadra. Un tali servitore pò esse usatu da parechji sviluppatori à una volta; ùn anu micca bisognu di pudè cunfigurà postgresql, capisce Docker è altre intricacies. In un servitore remoto, pudete installà a stessa basa di dati in Docker stessu, se hè difficiule di stallà una versione specifica. Tutti i sviluppatori anu bisognu hè di furnisce l'accessu ssh!

Aghju lettu recentemente chì i tunnellati SSH sò una funziunalità limitata di una VPN regulare! Pudete simpricimenti installà OpenVPN o altre implementazioni VPN, cunfigurà l'infrastruttura è dà à i sviluppatori per l'usu. Questu hè cusì bellu!

Fortunatamente, AWS, GoogleCloud è altri vi dannu un annu di usu gratuitu, cusì aduprate! Sò boni si spegne quandu ùn sò micca in usu. Mi sò sempre dumandatu perchè averia bisognu di un servitore remoto cum'è gcloud, pare ch'e aghju trovu.

Cum'è una macchina virtuale lucale, pudete aduprà u listessu Alpine, chì hè attivamente utilizatu in cuntenituri docker. Ebbè, o qualchì altra distribuzione ligera per fà a macchina boot più veloce.

Bottom line: pudete è deve eseguisce e basa di dati è altre boni di l'infrastruttura nantu à i servitori remoti o in virtualbox. Ùn aghju micca bisognu di docker per questi scopi.

Un pocu nantu à l'imaghjini di docker è a distribuzione

Aghju digià scrittu articulu in quale vulia trasmette chì l'usu di l'imaghjini docker ùn furnisce micca garantia. L'imaghjini Docker sò necessarii solu per creà un containeru docker. Sè vo aghjurnà à una maghjina docker, allora avete aghjurnatu per utilizà cuntenituri docker è l'utilizate solu.

Avete vistu in ogni locu induve i sviluppatori di software portanu i so prudutti solu in una maghjina docker?
U risultatu di a maiò parte di i prudutti sò i schedarii binari per una piattaforma specifica; sò simpliciamente aghjuntu à l'imaghjini docker, chì hè ereditatu da a piattaforma desiderata. Avete mai dumandatu perchè ci sò tante imagine simili nantu à dockerhub? Inserite nginx per esempiu, vi vede 100500 XNUMX images da diverse persone. Queste persone ùn anu micca sviluppatu nginx stessu, anu aghjustatu solu nginx ufficiale à a so maghjina di docker è l'hà staghjunatu cù e so cunfigurazioni per a cunvenzione di lancià cuntenituri.

In generale, pudete simpricimenti almacenà in tgz, se qualchissia hà bisognu di eseguisce in docker, allora lasciate aghjunghje tgz à u Dockerfile, eredite da l'ambiente desideratu è creanu buns supplementari chì ùn cambianu micca l'applicazione stessa in tgz. Qualchidunu chì hà da creà una maghjina di docker saperà ciò chì tgz hè è ciò chì hà bisognu à travaglià. Questu hè cumu aduprà docker ccà

Bottom line: Ùn aghju micca bisognu di u docker registry, aghju aduprà qualchì tipu di S3 o solu un archiviu di schedari cum'è google drive / dropbox

Docker in CI

Tutte e cumpagnie chì aghju travagliatu sò simili. Di solitu sò d'alimentazione. Vale à dì, anu una applicazione, una pila di tecnulugia (bene, forse un paru o trè lingue di prugrammazione).

Queste cumpagnie utilizanu docker nantu à i so servitori induve u prucessu CI corre. Quistione: Perchè avete bisognu di custruisce prughjetti in un containeru docker in i vostri servitori? Perchè ùn solu preparà un ambiente per a custruzzione, per esempiu, scrive un Ansible playbook chì installerà e versioni necessarie di nodejs, php, jdk, copiate chjavi ssh, etc. à u servitore in quale a custruzzione serà fatta?

Avà capitu chì questu mi spara in u pede, perchè docker ùn porta micca prufittu cù u so isolamentu. I prublemi chì aghju scontru cù CI in docker:

  • di novu avete bisognu di una maghjina docker per custruisce. avete bisognu di circà una maghjina o scrive u vostru propiu dockerfile.
  • 90% chì avete bisognu di rinvià qualchi chjavi ssh, dati secreti chì ùn vulete micca scrive à l'imaghjini docker.
  • u cuntinuu hè creatu è mori, tutti i caches sò persi cun ellu. u prossimu custruzzioni vi ri-scaricà tutte e dipende di u prugettu, chì hè tempu-cunsumu è inefficace, è u tempu hè soldi.

I sviluppatori ùn custruiscenu micca prughjetti in cuntenituri docker (era una volta un fanàticu, veramente, mi dispiace per mè stessu in u passatu xD). In java hè pussibule avè parechje versioni è cambià cù un cumandamentu à quellu chì avete bisognu avà. Hè u listessu in nodejs, ci hè nvm.

cunchiusioni

Credu chì u docker hè un strumentu assai putente è flessibile, questu hè u so inconveniente (sona stranu, sì). Cù u so aiutu, l'imprese ponu facilmente agganciate è aduprà induve hè necessariu è micca necessariu. I sviluppatori lancianu i so cuntenituri, unipochi di i so ambienti, allora tuttu scorri in CI è pruduzzione. U squadra DevOps scrive un tipu di codice per eseguisce questi cuntenituri.

Aduprate Docker solu nantu u più recente stage in u vostru flussu di travagliu, ùn trascinate micca in u prugettu à u principiu. Ùn risolverà micca i vostri prublemi di cummerciale. Solu moverà i prublemi à un altru livellu è offre e so solu suluzioni, fate un doppiu travagliu.

Quandu u docker hè necessariu: Sò ghjuntu à a cunclusione chì docker hè assai bonu per ottimisà un prucessu determinatu, ma micca per custruisce e funziunalità di basa

Se decide sempre di utilizà docker, allora:

  • esse assai attenti
  • ùn forza micca i sviluppatori à aduprà docker
  • localizà u so usu in un locu, ùn sparghje micca in tutti i repositori Dockefile è docker-compose

PS:

Ti ringraziu per a lettura, ti pregu decisioni trasparenti in i vostri affari è i ghjorni di travagliu produttivi!

Source: www.habr.com

Add a comment