Crearea unei imagini Docker din Scratch

Creating Docker Image From Scratch



Principalul avantaj al Docker față de orice altă tehnologie de containerizare este că Docker se adresează dezvoltatorilor și aplicațiilor lor upstack. În timp ce tehnologiile adecvate de containerizare ca LXC , Zone și Închisori sunt vizate dintr-o perspectivă operațională sau, mai simplu spus, aceste platforme sunt un substitut pentru mașinile virtuale care rulează pe cloud. În cazul în care, Docker este un substitut pentru pachete și binare executabile.

Vorbind pe larg, Docker devine din ce în ce mai mult ca un manager de pachete universal care funcționează pe toate platformele Linux posibile. Este nevoie de containere și le folosește pentru a rezolva o problemă complet diferită cu care se confruntă dezvoltatorii. Problema este că dezvoltatorii își folosesc sistemul de operare desktop (cum ar fi Windows, macOS sau Linux cu o tonă de pachete legate de desktop) pentru a scrie aplicații. Aplicația pe care o scriu rulează adesea pe un sistem de operare complet diferit pe un server undeva cu o distribuție Linux complet diferită de cea a laptopului dezvoltatorului.







Cu Docker ideea este că aplicația dvs. vine ambalată ca o imagine Docker. Este sarcina lui Docker să ia această imagine și să o ruleze ca o aplicație containerizată pentru dvs. A fi containerizat înseamnă că aplicația și dependențele sale vor rula într-un mediu izolat, care poate diferi complet de laptopul dezvoltatorului și chiar de serverul de producție. Atâta timp cât ambii acceptă Docker, ambii pot rula aceeași aplicație în același mod.



Anatomia unei imagini Docker

După cum sa menționat mai devreme, o aplicație Docker va rula pe un mediu convenit. Acum întrebarea este cum creăm acel mediu? Majoritatea imaginilor aplicației ar importa o imagine de bază Docker și și-ar construi aplicația deasupra ei.



Aplicațiile sunt realizate din straturi de software. O imagine de container wordpress este construită folosind o imagine de container httpd care, la rândul său, este construită deasupra unei imagini Ubuntu. Imaginea pe care este construită o imagine mai nouă este cunoscută sub numele de PARENT IMAGE în terminologia Docker. În Dockerfile (vom ajunge la ceea ce înseamnă un Dockerfile, puțin mai târziu), această imagine părinte este menționată în partea de sus a fișierului, așa cum se arată mai jos:





DE LA Ubuntu: 18.04
## Restul fișierului Docker

Acest fișier Docker, atunci când este executat, vă convertește aplicația într-o imagine Docker (un tip binar) pe care îl puteți împinge apoi într-un registru de unde poate fi extras pentru a crea noi containere în altă parte. Cu toate acestea, toți vor avea Ubuntu: 18.04 ca imagine de bază și vor rula ca și cum ar fi un sistem Ubuntu în care rulează.

Este posibil să fi observat acest lucru atunci când încercați să extrageți o nouă imagine de andocare.



Crearea imaginii Docker din Scratch

Aceasta arată câte straturi sunt trase înainte ca aplicația reală (care ar putea avea doar câțiva megabyți) să fie introdusă.

Din acest motiv, am dori să creăm ceea ce este cunoscut sub numele de imagine de bază. Ceea ce nu este construit deasupra a nimic altceva. Cuvântul cheie zero este folosit pentru a indica faptul că acest strat nu este construit deasupra a nimic altceva. Ca astfel:

De la zero
## Restul fișierului Dcoker

Mai întâi vom crea o aplicație simplă Hello-World și apoi vom afla ce va fi restul fișierului Dockerfile. Sistemul gazdă este Ubuntu: 18.04 LTS și folosim versiunea Docker 17.12.1-ce pentru experiment.

Crearea unui binar static

Containerele Docker sunt o colecție de procese care rulează izolate de restul sistemului de operare. Singurul lucru cu care procesul este în contact este nucleul. Kernel este responsabil pentru programarea acestor procese pe CPU, gestionarea memoriei și alte câteva activități de bază de păstrare a rezervării.

Dar majoritatea aplicațiilor de nivel înalt depind de o mulțime de biblioteci de sistem (cum ar fi glibc, musl, klibc etc. ) și o mulțime de dependențe de runtime, cum ar fi Python sau Node.js sau Java Runtime. Binarul aplicației nu are toate bibliotecile disponibile în interiorul său, dar atunci când începe executarea apelează acele biblioteci din sistemul de operare gazdă.

Deoarece încercăm să creăm o imagine de la zero, nu am primi aceste simpatii. Deci aplicația noastră trebuie să fie un fișier static sau un executabil independent.

Să începem prin a crea un folder numit MyDockerImage și a crea un fișier hello.cc în interiorul acestuia.

$mkdirMyDockerImage
$CDMyDockerImage
$atingeresalut.cc

Deschideți hello.cc folosind editorul de text preferat și adăugați următoarele rânduri în interiorul acestuia.

#include
folosind spațiul de nume std;
intprincipal(){
cost<< 'Buna ziua! Acest mesaj vine dintr-un container n';
întoarcere 0;

}

Acesta este un program simplu C ++ care imprimă Hello! Acest mesaj …

Din motivele discutate anterior, vom compila acest lucru folosind semnalizatorul static. Compilatorul utilizat este g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Pentru a compila programul, în același director executați următoarea comandă:

$ g++ -o buna ziua-staticBuna ziua.DC

Aceasta creează un fișier executabil binar salut în același director. Acesta este fișierul nostru static. Testați dacă rulează conform intenției menționând numele fișierului în terminal.

$./Buna ziua

Acum suntem gata să punem în container acest program simplu.

Dockerfile

Fișierul Docker este format dintr-un set de reguli care iau fișierele aplicației dvs. (cum ar fi binare, fișiere sursă, etc.) împreună cu diverși parametri de configurare, cum ar fi aspectul sistemului de fișiere, porturile expuse, etc. și le transformă într-un fișier imagine Docker. Apoi, puteți partaja fișierul imagine cu oricine dorește să ruleze aplicația respectivă.

Nu vom analiza fiecare opțiune disponibilă pentru Dockerfile, în schimb vom scrie un Dockerfile foarte minimalist. În același director, unde se află executabilul dvs. Hello, creați un fișier gol numit Dockerfile.

$atingereDockerfile

Deschideți-l cu editorul de text preferat și scrieți-i următoarele rânduri:

De la zero
ADAUGĂ salut/
CMD['/Buna ziua']

zgârietură nu este o imagine părinte. Mai degrabă indică Docker că imaginea nu este construită deasupra oricărei alte imagini. Este construit de la zero. Comanda ADD ar lua binarul static numit hello din directorul curent și l-ar adăuga în directorul rădăcină al fișierului imagine. Când în sfârșit vom rula un container bazat pe această imagine, executabilul Hello va fi văzut în directorul rădăcină însuși la /hello.

În cele din urmă, linia CMD are un șir /Buna ziua acest șir va fi executat ca o comandă de shell ori de câte ori este creat un container din această imagine, astfel fișierul binar pe care l-am adăugat în container și imprimăm mesajul pe care l-am scris în aplicația noastră.

Să construim imaginea invocând docker build comandă care va trece prin conținutul fișierului Docker și va genera imaginea. Rulați următoarea comandă în același director ca fișierul Docker și binarul executabil.

$docker build--etichetăBuna ziua .

The –Tag salut flag stabilește numele imaginii la Buna ziua și punctul ( . ) la sfârșit spune docker build pentru a căuta în directorul curent fișierul Docker și conținutul aferent.

Rularea containerului Docker

Pentru a verifica dacă imaginea pe care tocmai am creat-o apare în lista de imagini, rulați:

$imagini docker

Observați cât de mică este imaginea de salut în comparație cu alte imagini. În orice caz, este gata să fie rulat ca un container,

$docker fugi salut

Asta e! Ai creat primul tău container minimalist de la zero.

Alte optiuni

În timp ce crearea de imagini de la zero este întotdeauna o opțiune, oamenii tind să creeze imagini din alte distribuții Linux ușoare. De exemplu, imaginile precum alpine și busybox sunt medii foarte ușoare, cu biblioteci mai mici, cum ar fi musl în loc de glibc.

Folosindu-le ca imagine părinte folosind FROM alpin: cel mai recent ar avea ca rezultat și imagini mai mici. Deoarece imaginile de bază au o dimensiune de doar 2-5 MB. Spuneți-ne dacă există vreun subiect legat de Docker pe care ați putea dori să îl acoperim în continuare. Ne puteți contacta mai departe Stare de nervozitate , Facebook sau abonați-vă la noi prin e-mail.