Creació d’una imatge Docker des de Scratch

Creating Docker Image From Scratch



El principal avantatge de Docker sobre qualsevol altra tecnologia de contenidors és que Docker està dirigit als desenvolupadors i a les seves aplicacions avançades. Tot i que les tecnologies de contenidors adequades, com ara LXC , Zones i Presons s’orienten des d’una perspectiva d’operacions o, per dir-ho simplement, aquestes plataformes són un substitut de les màquines virtuals que s’executen al núvol. Quan, Docker substitueix els paquets i els binaris executables.

Parlant lliurement, Docker s’assembla cada cop més a un gestor de paquets universal que funciona a totes les plataformes Linux possibles. Es necessiten contenidors i els utilitzen per resoldre un problema completament diferent al que s’enfronten els desenvolupadors. El problema és que els desenvolupadors utilitzen el seu sistema operatiu d’escriptori (com Windows, macOS o Linux amb una gran quantitat de paquets relacionats amb l’escriptori) per escriure aplicacions. L’aplicació que escriuen sovint s’executa en un sistema operatiu completament diferent en un servidor en algun lloc amb una distribució de Linux completament diferent a la del portàtil del desenvolupador.







Amb Docker, la idea és que la vostra aplicació aparegui empaquetada com a imatge de Docker. És tasca de Docker agafar aquesta imatge i executar-la com a aplicació en contenidors. El fet de contenir-se significa que l’aplicació i les seves dependències s’executaran en un entorn aïllat que pot diferir completament del portàtil del desenvolupador i fins i tot del servidor de producció. Mentre tots dos admetin Docker, tots dos poden executar la mateixa aplicació de la mateixa manera.



Anatomia d’una imatge Docker

Com s’ha esmentat anteriorment, una aplicació Docker s’executarà en un entorn acordat. Ara la pregunta és com creem aquest entorn? La majoria de les imatges d’aplicacions importarien una imatge base de Docker i crearien la seva aplicació a sobre.



Les aplicacions es fan a partir de capes de programari. Una imatge de contenidor de wordpress es crea mitjançant una imatge de contenidor httpd que, al seu torn, es crea sobre una imatge d'Ubuntu. La imatge sobre la qual es construeix una imatge més recent es coneix com la IMATGE PARENT a la terminologia de Docker. A Dockerfile (arribarem al que significa un Dockerfile, una mica més tard), aquesta imatge pare s’esmenta a la part superior del fitxer, tal com es mostra a continuació:





DES d’Ubuntu: 18.04
## Resta del fitxer Docker

Quan s'executa aquest fitxer Docker, converteix l'aplicació en una imatge Docker (un tipus binari) que podeu enviar a un registre des d'on es pot extreure per crear nous contenidors en altres llocs. Tot i això, tots tindran Ubuntu: 18.04 com a imatge base i funcionaran com si es tractés d’un sistema Ubuntu en què s’executen.

És possible que ho hagueu notat quan proveu d’obtenir una nova imatge docker.



Creació de Docker Image des de Scratch

Això mostra quantes capes s’extreuen abans que s’apliqui l’aplicació real (que podria tenir només uns pocs megabytes).

Per aquest motiu, ens agradaria crear el que es coneix com a imatge base. Que no es construeix a sobre de res més. La paraula clau scratch s’utilitza per indicar que aquesta capa no es construeix sobre cap altra cosa. Així:

Des de zero
## Resta del fitxer Dcoker

Primer crearem una aplicació simple hello-world i després descobrirem quina serà la resta del fitxer Dockerfile. El sistema amfitrió és Ubuntu: 18.04 LTS i estem utilitzant la versió 17.12.1-ce de Docker per a l’experiment.

Creació d’un binari estàtic

Els contenidors Docker són una col·lecció de processos que s’executen aïllats de la resta del sistema operatiu. L'únic que està en contacte amb aquest procés és el nucli. El nucli és responsable de programar aquests processos a la CPU, fer la gestió de memòria i algunes altres tasques bàsiques de manteniment de la reserva.

Però la majoria de les aplicacions d 'alt nivell depenen de moltes biblioteques de sistemes (com glibc, musl, klibc, etc. ) i moltes dependències en temps d'execució com Python o Node.js o Java Runtime. El binari de l’aplicació no té totes les biblioteques disponibles al seu interior, però quan comença l’execució crida a aquestes biblioteques des del sistema operatiu amfitrió.

Com que intentem crear una imatge des de zero, no obtindríem aquestes coses agradables. Per tant, la nostra aplicació ha de ser un fitxer estàtic o un executable autònom.

Comencem creant una carpeta anomenada MyDockerImage i creant-hi un fitxer hello.cc.

$mkdirMyDockerImage
$cdMyDockerImage
$tocarhello.cc

Obriu hello.cc mitjançant el vostre editor de text preferit i afegiu-hi les línies següents.

#incloure
utilitzant l'espai de noms std;
intprincipal(){
cost<< 'Hola! Aquest missatge prové d’un contenidor n';
tornar 0;

}

Aquest és un senzill programa C ++ que imprimeix Hola! Aquest missatge ...

Per les raons comentades anteriorment, la compilarem mitjançant la marca estàtica. El compilador que s'utilitza és g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Per compilar el programa, executeu l'ordre següent al mateix directori:

$ g++ -hola-estàticHola.cc

Això crea un fitxer executable binari hola al mateix directori. Aquest és el nostre fitxer estàtic. Comproveu si s’executa tal com es vol mencionant el nom del fitxer al terminal.

$./Hola

Ara estem preparats per contenir aquest senzill programa.

Dockerfile

El fitxer Dockerfile consisteix en un conjunt de regles que prenen els fitxers de les vostres aplicacions (com ara fitxers binaris, fitxers font, etc.) juntament amb diversos paràmetres de configuració com el disseny del sistema de fitxers, els ports exposats, etc. i els converteix en un fitxer d’imatges Docker. A continuació, podeu compartir el fitxer d’imatges amb qualsevol persona que vulgui executar aquesta aplicació.

No aprofundirem en totes les opcions disponibles per a Dockerfile, sinó que escriurem un Dockerfile molt minimalista. Al mateix directori, on resideix el vostre executable hola, creeu un fitxer buit anomenat Dockerfile.

$tocarDockerfile

Obriu-lo amb el vostre editor de text preferit i escriviu-hi les línies següents:

Des de zero
AFEGEIX hola/
CMD['/Hola']

ratllar no és una imatge principal. Més aviat, indica a Docker que la imatge no està construïda damunt de cap altra imatge. Està construït des de zero. L'ordre ADD agafaria el binari estàtic anomenat hello del directori actual i l'afegiria al directori arrel del fitxer d'imatge. Quan finalment executaríem un contenidor basat en aquesta imatge, l'executable hola es veurà dins del directori arrel a /hello.

Per últim, la línia CMD té una cadena /Hola aquesta cadena s'executarà com a ordre de l'intèrpret d'ordres sempre que es creï un contenidor a partir d'aquesta imatge, per tant el fitxer binari que hem afegit al contenidor i que imprimim el missatge que hem escrit a la nostra aplicació.

Construïm la imatge invocant el fitxer docker build que passaria pel contingut del fitxer Docker i generaria la imatge. Executeu l'ordre següent al mateix directori que el fitxer Docker i el fitxer binari executable.

$docker build--etiquetaHola .

El –Etiqueta hola flag marca el nom de la imatge a Hola i el punt ( . ) al final explica docker build per buscar al directori actual el fitxer Docker i el contingut relacionat.

Execució del contenidor Docker

Per comprovar si la imatge que acabem de crear apareix a la llista d'imatges, executeu:

$imatges docker

Fixeu-vos en la petita imatge de hola en comparació amb altres imatges. En qualsevol cas, està llest per funcionar com a contenidor,

$docker corre hola

Això és! Heu creat el vostre primer contenidor minimalista des de zero.

Altres opcions

Tot i que la creació d’imatges des de zero sempre és una opció, la gent sovint tendeix a crear imatges a partir d’altres distribucions lleugeres de Linux. Per exemple, imatges com alpine i busybox són entorns realment lleugers amb llibreries més petites com musl en lloc de glibc.

Utilitzar-los com a imatge principal mitjançant FROM alpí: últim també resultaria en imatges més petites. Atès que les imatges bàsiques només tenen una mida de 2-5 MB. Feu-nos saber si hi ha algun tema relacionat amb Docker que és possible que vulgueu que tractem a continuació. Podeu contactar amb nosaltres Twitter , Facebook o subscriviu-nos per correu electrònic.