Cum să construiți rapid imagini Slim Docker de Simon Hawe Către știința datelor
Simon Hawe
20 noiembrie 2019 · 7 min de citire
Vă amintiți acele zile în care ați scris un software minunat, dar nu ați putut să-l instalați pe computerul altcuiva sau s-a prăbușit acolo? Deși aceasta nu este niciodată o experiență plăcută, am putea spune întotdeauna

În zilele noastre, asta nu mai este o scuză din cauza containerizării.
Pe scurt, cu containerizarea, vă împachetați aplicația și toate dependențele necesare într-o imagine. La execuție, rulați acea imagine ca un container. Cu aceasta, nu trebuie să vă deranjați cu sistemul altei persoane pentru ca software-ul dvs. să ruleze. Containerul și, prin urmare, software-ul dvs. ar trebui să ruleze oriunde, dacă rulează pe mașină. Acest lucru este util și pentru oamenii de știință de date atunci când implementează modele care depind de diferite pachete și versiuni ale acestora. Pentru mine, oamenii de știință ai datelor trebuie să știe cum să creeze imagini și containere.
După cum știți cu toții, Docker este jucătorul principal în acest domeniu, iar imaginile Docker sunt omniprezente. Acest lucru este minunat, deoarece puteți începe, de exemplu, baze de date din diferite versiuni, unul lângă altul, fără probleme. Crearea împreună a imaginilor pentru aplicațiile dvs. este, de asemenea, foarte simplă. Acest lucru se datorează numărului mare de imagini de bază și limbajului de definiție simplu. Cu toate acestea, atunci când hackezi imagini împreună fără să știi ce faci, ai două probleme.
- Veți pierde spațiu pe disc pe măsură ce imaginile dvs. se îngrașă inutil.
- Pierzi timpul așteptând construcții care durează prea mult.
În acest articol, vreau să vă arăt cum puteți atenua aceste două probleme. Din fericire, acest lucru necesită doar să cunoașteți câteva trucuri și tehnici oferite de Docker. Pentru a face tutorialul distractiv și util, vă arăt cum să împachetați o aplicație Python într-o imagine Docker. Puteți găsi tot codul la care se face referire mai jos în depozitul meu Github.
Sunteți gata? Sa incepem.
Să presupunem că toate codurile noastre trăiesc într-un singur fișier Python main.py. Deoarece suntem copii mișto, folosim cea mai recentă și mai bună versiune Python, care este 3.8 în momentul scrierii acestui articol. Aplicația noastră este doar un simplu server web și depinde de panda, fastapi și uvicorn. Stocăm dependențele într-un fișier requirements.txt. La nivel local, dezvoltăm aplicația într-un mediu virtual. Acest mediu se află într-un folder numit .venv în același folder cu codul (acest lucru devine important în curând). Acum, decidem să împachetăm toate acestea într-o imagine Docker. Pentru a face acest lucru, tot ce trebuie să facem este
- Utilizați o imagine de bază cu Python 3.8 disponibil.
- Copiați peste cod și fișierul de cerințe.
- Instalați cerințele și dependențele în imagine.
- Expuneți o comandă care rulează aplicația noastră
Prima versiune a imaginii noastre Docker arată
În afară de codul și cerințele noastre, trebuie să instalăm GCC deoarece FastApi necesită acest lucru la instalare. Ne construim imaginea prin
Dimensiunea acestei imagini este de aproximativ 683 MB și durează aproximativ un minut pentru ao construi (cu excepția descărcării imaginii de bază). Să vedem cum putem reduce acest lucru.
Imagine de bază
În ceea ce privește imaginea de bază, am făcut deja o alegere conștientă folosind Python slim. De ce am ales exact asta?
Aș fi putut lua de exemplu o imagine Ubuntu completă sau CentOS, care ar duce la o dimensiune a imaginii> 1 GB. Dar, deoarece am nevoie doar de Python, nu există niciun motiv pentru a instala toate acestea.
La capătul inferior al dimensiunii imaginii, am putea lua python: 3.8.0- alpin. Dar, codul meu se bazează pe panda, care este o durere de instalat pe alpine. Alpine are, de asemenea, probleme legate de stabilitate și securitate. În plus, slim este doar
80MB mai mare decât alpin, ceea ce este încă bine. Pentru mai multe informații despre cum să alegeți imaginea Python optimă, trimit cititorul interesat la acest articol.
Construiți context
Când creați imaginea, prima linie tipărită pe consola dvs. spune: Trimiterea contextului de construire la daemonul Docker. Pe computerul meu, acest lucru a durat aproximativ 5 secunde și s-au trimis 154 MB. Ce se intampla aici? Docker copiază peste toate fișierele și folderele care se află în contextul de construire, în daemon. Aici, contextul de construire este directorul în care este stocat fișierul Docker. Deoarece avem nevoie doar de două fișiere text, 154 MB sună destul de mult, nu-i așa? Motivul este că Docker copiază peste orice, de exemplu, folderul .venv care conține mediul virtual sau folderul .git.