Creazione di un'immagine Docker da zero

Creazione di un'immagine Docker da zero
Il principale vantaggio di Docker rispetto a qualsiasi altra tecnologia di containerizzazione è che Docker è rivolto agli sviluppatori e alle loro applicazioni Upstack. Mentre le adeguate tecnologie di containerizzazione come LXC, zone e carceri sono prese di mira dal punto di vista delle operazioni o, per dirla semplicemente, queste piattaforme sono un sostituto delle macchine virtuali in esecuzione sul cloud. Dove come, Docker è un sostituto di pacchetti e binari eseguibili.

In modo valo, Docker sta diventando sempre più simile a un gestore di pacchetti universali che funziona su tutte le possibili piattaforme Linux. Ci vogliono contenitori e li usa per risolvere un problema completamente diverso che gli sviluppatori affrontano. Il problema è che gli sviluppatori utilizzano il loro sistema operativo desktop (come Windows, MacOS o Linux con una tonnellata di pacchetti correlati al desktop) per scrivere applicazioni. L'applicazione che scrivono spesso vengono eseguite su un sistema operativo completamente diverso su un server da qualche parte con una distribuzione Linux completamente diversa da quella del laptop dello sviluppatore.

Con Docker l'idea è che la tua applicazione sia confezionata come un'immagine Docker. È compito di Docker prendere questa immagine ed eseguirla come applicazione containerizzata per te. Essere containerizzato significa che l'applicazione e le sue dipendenze funzionano in un ambiente isolato che può differire completamente dal laptop dello sviluppatore e persino dal server di produzione. Finché entrambi supportano Docker, entrambi possono eseguire la stessa applicazione nello stesso modo.

Anatomia di un'immagine Docker

Come accennato in precedenza, un'app Docker eseguirà su un ambiente concordato. Ora la domanda è come possiamo creare quell'ambiente? La maggior parte delle immagini dell'applicazione importerebbe un'immagine di base Docker e costruirebbe la loro applicazione sopra.

Le applicazioni sono realizzate da livelli di software. Un'immagine del contenitore WordPress è costruita utilizzando un'immagine del contenitore HTTPD che, a sua volta, è costruita sopra un'immagine Ubuntu. L'immagine su cui è costruita un'immagine più nuova è nota come immagine principale nella terminologia Docker. In Dockerfile (arriveremo a ciò che un Dockerfile significa, poco più tardi), questa immagine principale è menzionata nella parte superiore del file come mostrato di seguito:

Da Ubuntu: 18.04
## REST del Dockerfile

Questo Dockerfile quando eseguito converte l'applicazione in un'immagine Docker (una sorta di binario) che è quindi possibile spingere in un registro da dove può essere tirato per creare nuovi contenitori altrove. Tuttavia, avranno tutti Ubuntu: 18.04 come immagine di base ed eseguire come se fosse un sistema ubuntu in cui stanno correndo.

Potresti averlo notato quando si cerca di tirare una nuova immagine Docker.

Questo mostra quanti livelli vengono tirati prima dell'applicazione effettiva (che potrebbe avere solo pochi megabyte di dimensioni).

Per questo motivo, vorremmo creare ciò che è noto come un'immagine di base. Che non è costruito sopra nient'altro. La parola chiave "scratch" viene utilizzata per indicare che questo livello non è costruito su nient'altro. Così:

Da zero
## REST del DCOKERFILE

Prima creeremo una semplice applicazione Hello-World e poi scopriremo quale sarà il resto di Dockerfile. Il sistema host è Ubuntu: 18.04 LTS e stiamo usando Docker versione 17.12.1-ce per l'esperimento.

Creare un binario statico

I contenitori Docker sono una raccolta di processi che eseguono isolati dal resto del sistema operativo. L'unica cosa che il processo è in contatto è il kernel. Il kernel è responsabile della pianificazione di questi processi sulla CPU, svolgere la gestione della memoria e alcune altre prenotazioni di base mantengono le attività.

Ma la maggior parte delle applicazioni di alto livello dipende da molte librerie di sistema (come GLIBC, MUSL, KLIBC, ecc) e molte dipendenze di runtime come Python o Node.JS o Java Runtime. Il binario dell'applicazione non ha tutte le librerie disponibili al suo interno, ma quando inizia l'esecuzione chiama quelle librerie dal sistema operativo host.

Perché stiamo cercando di creare un'immagine da zero, non avremmo queste bellezze. Quindi la nostra applicazione deve essere un file statico o un eseguibile autonomo.

Cominciamo creando una cartella chiamata MyDockerImage e creando un file Hello.cc al suo interno.

$ mkdir mydockerimage
$ cd mydockerimage
$ touch ciao.cc

Apri ciao.CC usando il tuo editor di testo preferito e aggiungi le seguenti righe al suo interno.

#includere
Utilizzo dello spazio dei nomi std;
int main ()
cout << "Hello! This message is coming from a container \n ";
restituzione 0;

Questo è un semplice programma C ++ che stampa "Ciao! Questo messaggio… "

Per motivi discussi in precedenza, lo compileremo usando la flag statica. Il compilatore da utilizzare è G ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Per compilare il programma, nella stessa directory esegui il seguente comando:

$ g ++ -o ciao -statico ciao.cc

Questo crea un file binario eseguibile "ciao" nella stessa directory. Questo è il nostro file statico. Test se è in esecuzione come previsto menzionando il nome file nel terminale.

$ ./Ciao

Ora siamo pronti a containerizzare questo semplice programma.

Dockerfile

Dockerfile è costituito da una serie di regole che prende i file dell'applicazione (come binari, file di origine, ecc.) Insieme a vari parametri di configurazione come layout del file system, porte esposte, ecc. Puoi quindi condividere il file di immagine con chiunque desideri eseguire quell'applicazione.

Non andremo a scavare in tutte le opzioni disponibili per Dockerfile, invece scriveremo un Dockerfile molto minimalista. Nella stessa directory, in cui risiede il tuo hello eseguibile, crea un file vuoto denominato Dockerfile.

$ touch Dockerfile

Aprilo con il tuo editor di testo preferito e scrivi le seguenti righe:

Da zero
Aggiungi ciao /
CMD ["/Hello"]

graffio non è un'immagine genitore. Piuttosto indica Docker che l'immagine non è costruita sopra qualsiasi altra immagine. È costruito da zero. Aggiungi comando prenderebbe il binario statico denominato Ciaodalla directory corrente e aggiungila alla directory principale del file di immagine. Quando avremmo finalmente eseguito un contenitore in base a questa immagine, l'eseguibile Hello sarà visto all'interno della directory di root stessa a /Ciao.

Infine, la linea CMD ha una stringa "/Ciao" Questa stringa verrà eseguita come comando shell ogni volta che un contenitore viene creato da questa immagine, quindi il file binario che abbiamo aggiunto al nostro contenitore e stampano il messaggio che abbiamo scritto nella nostra app.

Costruiamo l'immagine invocando il Build Docker comando che passerebbe attraverso il contenuto di Dockerfile e genererebbe l'immagine. Esegui il comando seguente nella stessa directory del Dockerfile e del binario eseguibile.

$ docker build -tag ciao .

IL -Tag ciao Il flag imposta il nome dell'immagine su Ciao e il punto ( ".") Alla fine dice Build Docker esaminare la directory corrente per Dockerfile e contenuti correlati.

Esecuzione del contenitore Docker

Per verificare se l'immagine che abbiamo appena creato viene visualizzata nell'elenco delle immagini, esegui:

$ Docker Immagini

Notare quanto è piccola l'immagine di Hello se confrontata con altre immagini. In ogni caso, è pronto per essere eseguito come contenitore,

$ Docker Run Ciao

Questo è tutto! Hai creato il tuo primo contenitore minimalista da zero.

Altre opzioni

Durante la creazione di immagini da zero è sempre un'opzione, le persone spesso tendono a creare immagini da altre distro Linux leggere. Ad esempio immagini come Alpine e BusyBox sono ambienti davvero leggeri con librerie più piccole come Musl anziché glibc.

Usandoli come immagine genitore usando "Da Alpine: ultimo" comporterebbe anche immagini più piccole. Poiché le immagini di base hanno una dimensione di soli 2-5 Mb. Facci sapere se c'è qualche argomento relativo al docker che potresti voler coprire. Puoi contattarci su Twitter, Facebook o iscriverci a noi via e -mail.