Δημιουργία εικόνας Docker από το Scratch

Creating Docker Image From Scratch



Το κύριο πλεονέκτημα του Docker έναντι οποιασδήποτε άλλης τεχνολογίας μεταφοράς εμπορευματοκιβωτίων είναι ότι το Docker απευθύνεται σε προγραμματιστές και τις εφαρμογές τους. Ενώ οι κατάλληλες τεχνολογίες εμπορευματοποίησης όπως LXC , Ζώνες και Φυλακές στοχεύονται από τη σκοπιά των λειτουργιών ή, για να το πούμε απλά, αυτές οι πλατφόρμες είναι υποκατάστατο των εικονικών μηχανών που λειτουργούν στο cloud. Σε κάθε περίπτωση, το Docker είναι υποκατάστατο πακέτων και εκτελέσιμων δυαδικών αρχείων.

Χαλαρά, το Docker μοιάζει όλο και περισσότερο με έναν καθολικό διαχειριστή πακέτων που λειτουργεί σε όλες τις πιθανές πλατφόρμες Linux. Παίρνει κοντέινερ και τα χρησιμοποιεί για να λύσει ένα εντελώς διαφορετικό πρόβλημα που αντιμετωπίζουν οι προγραμματιστές. Το πρόβλημα είναι ότι οι προγραμματιστές χρησιμοποιούν το λειτουργικό σύστημα επιφάνειας εργασίας (όπως Windows, macOS ή Linux με έναν τόνο πακέτων που σχετίζονται με επιτραπέζιους υπολογιστές) για να γράψουν εφαρμογές. Η εφαρμογή που γράφουν συχνά εκτελείται σε ένα εντελώς διαφορετικό λειτουργικό σύστημα σε διακομιστή κάπου με κάποια διανομή Linux εντελώς διαφορετική από αυτήν του φορητού υπολογιστή προγραμματιστή.







Με το Docker η ιδέα είναι ότι η εφαρμογή σας έρχεται συσκευασμένη ως εικόνα Docker. Είναι δουλειά του Docker να τραβήξει αυτήν την εικόνα και να την εκτελέσει ως εφαρμογή για κοντέινερ για εσάς. Η μεταφορά σε κοντέινερ σημαίνει ότι η εφαρμογή και οι εξαρτήσεις της, θα εκτελούνται σε ένα απομονωμένο περιβάλλον που μπορεί να διαφέρει εντελώς από το φορητό υπολογιστή του προγραμματιστή, ακόμη και από τον διακομιστή παραγωγής. Εφόσον υποστηρίζουν και οι δύο Docker, μπορούν και οι δύο να τρέχουν την ίδια εφαρμογή με τον ίδιο ακριβώς τρόπο.



Ανατομία μιας εικόνας Docker

Όπως αναφέρθηκε προηγουμένως, μια εφαρμογή Docker θα λειτουργεί σε συμφωνημένο περιβάλλον. Τώρα το ερώτημα είναι πώς δημιουργούμε αυτό το περιβάλλον; Οι περισσότερες εικόνες εφαρμογών εισάγουν μια βασική εικόνα Docker και δημιουργούν την εφαρμογή τους πάνω από αυτήν.



Οι εφαρμογές γίνονται από στρώματα λογισμικού. Μια εικόνα δοχείου wordpress δημιουργείται χρησιμοποιώντας μια εικόνα κοντέινερ httpd η οποία, με τη σειρά της, είναι χτισμένη πάνω από μια εικόνα Ubuntu. Η εικόνα πάνω στην οποία χτίζεται μια νεότερη εικόνα είναι γνωστή ως PARENT IMAGE στην ορολογία Docker. Στο Dockerfile (θα καταλάβουμε τι σημαίνει Dockerfile, λίγο αργότερα), αυτή η γονική εικόνα αναφέρεται στο επάνω μέρος του αρχείου όπως φαίνεται παρακάτω:





ΑΠΟ Ubuntu: 18.04
## Υπόλοιπο αρχείου Dockerfile

Αυτό το Dockerfile όταν εκτελείται μετατρέπει την εφαρμογή σας σε εικόνα Docker (δυαδικό είδος) την οποία μπορείτε στη συνέχεια να σπρώξετε σε μητρώο από όπου μπορεί να τραβηχτεί για να δημιουργήσετε νέα κοντέινερ αλλού. Ωστόσο, όλοι θα έχουν το Ubuntu: 18.04 ως βασική εικόνα και θα τρέχουν σαν να είναι ένα σύστημα Ubuntu στο οποίο τρέχουν.

Mightσως το έχετε παρατηρήσει όταν προσπαθείτε να τραβήξετε μια νέα εικόνα docker.



Δημιουργία εικόνας Docker από το Scratch

Αυτό δείχνει πόσα στρώματα τραβιούνται πριν από την εισαγωγή της πραγματικής εφαρμογής (η οποία μπορεί να είναι μόνο λίγα Megabytes σε μέγεθος).

Για το λόγο αυτό, θα θέλαμε να δημιουργήσουμε αυτό που είναι γνωστό ως βασική εικόνα. Το οποίο δεν είναι χτισμένο πάνω σε τίποτα άλλο. Η λέξη -κλειδί γρατσουνιά χρησιμοποιείται για να δείξει ότι αυτό το επίπεδο δεν είναι χτισμένο πάνω από οτιδήποτε άλλο. Όπως και έτσι:

Από την αρχή
## Υπόλοιπο Dcokerfile

Θα δημιουργήσουμε πρώτα μια απλή εφαρμογή hello-world και στη συνέχεια θα καταλάβουμε τι θα είναι το υπόλοιπο Dockerfile. Το σύστημα υποδοχής είναι το Ubuntu: 18.04 LTS και χρησιμοποιούμε την έκδοση Docker έκδοση 17.12.1-ce για το πείραμα.

Δημιουργία στατικού δυαδικού

Τα δοχεία Docker είναι μια συλλογή διαδικασιών που εκτελούνται απομονωμένες από το υπόλοιπο λειτουργικό σύστημα. Το μόνο πράγμα με το οποίο έρχεται σε επαφή η διαδικασία είναι ο πυρήνας. Ο πυρήνας είναι υπεύθυνος για τον προγραμματισμό αυτών των διαδικασιών στην CPU, τη διαχείριση μνήμης και μερικές άλλες βασικές εργασίες κράτησης.

Αλλά οι περισσότερες εφαρμογές υψηλού επιπέδου εξαρτώνται από πολλές βιβλιοθήκες συστήματος (όπως glibc, musl, klibc κλπ ) και πολλές εξαρτήσεις χρόνου εκτέλεσης όπως Python ή Node.js ή Java Runtime. Η δυαδική εφαρμογή δεν έχει όλες τις διαθέσιμες βιβλιοθήκες μέσα της, αλλά όταν ξεκινά η εκτέλεση καλεί αυτές τις βιβλιοθήκες από το λειτουργικό σύστημα κεντρικού υπολογιστή.

Επειδή προσπαθούμε να δημιουργήσουμε μια εικόνα από το μηδέν, δεν θα είχαμε αυτές τις ομορφιές. Η εφαρμογή μας λοιπόν πρέπει να είναι ένα στατικό αρχείο ή ένα αυτόνομο εκτελέσιμο.

Ας ξεκινήσουμε δημιουργώντας ένα φάκελο που ονομάζεται MyDockerImage και δημιουργώντας ένα αρχείο hello.cc μέσα σε αυτό.

$mkdirMyDockerImage
$CDMyDockerImage
$αφήγεια σου.cc

Ανοίξτε το hello.cc χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή κειμένου και προσθέστε τις ακόλουθες γραμμές μέσα σε αυτό.

#περιλαμβάνω
χρησιμοποιώντας το όνομα χώρου std?
intκύριος(){
κόστος<< 'Γεια σας! Αυτό το μήνυμα προέρχεται από ένα κοντέινερ n'?
ΕΠΙΣΤΡΟΦΗ 0?

}

Αυτό είναι ένα απλό πρόγραμμα C ++ που εκτυπώνει Hello! Αυτό το μήνυμα …

Για λόγους που συζητήθηκαν νωρίτερα, θα το συντάξουμε χρησιμοποιώντας τη στατική σημαία. Ο μεταγλωττιστής που χρησιμοποιείται είναι g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Για να μεταγλωττίσετε το πρόγραμμα, στον ίδιο κατάλογο εκτελέστε την ακόλουθη εντολή:

$ g++ -o γεια-στατικόςγεια σας.DC

Αυτό δημιουργεί ένα δυαδικό εκτελέσιμο αρχείο γεια στον ίδιο κατάλογο. Αυτό είναι το στατικό μας αρχείο. Δοκιμάστε αν λειτουργεί όπως προβλέπεται, αναφέροντας το όνομα αρχείου στο τερματικό.

$./γεια σας

Τώρα είμαστε έτοιμοι να μεταφέρουμε αυτό το απλό πρόγραμμα.

Dockerfile

Το Dockerfile αποτελείται από ένα σύνολο κανόνων που λαμβάνει τα αρχεία της εφαρμογής σας (όπως δυαδικά, αρχεία προέλευσης κ.λπ.) μαζί με διάφορες παραμέτρους διαμόρφωσης όπως διάταξη συστήματος αρχείων, εκτεθειμένες θύρες κ.λπ. και τα μετατρέπει σε αρχείο εικόνας Docker. Στη συνέχεια, μπορείτε να μοιραστείτε το αρχείο εικόνας με οποιονδήποτε θέλει να εκτελέσει αυτήν την εφαρμογή.

Δεν θα εμβαθύνουμε σε κάθε διαθέσιμη επιλογή για το Dockerfile, αλλά θα γράψουμε ένα πολύ μινιμαλιστικό Dockerfile. Στον ίδιο κατάλογο, όπου βρίσκεται το εκτελέσιμο γεια σας, δημιουργήστε ένα κενό αρχείο με όνομα Dockerfile.

$αφήDockerfile

Ανοίξτε το με τον αγαπημένο σας επεξεργαστή κειμένου και γράψτε τις ακόλουθες γραμμές σε αυτό:

Από την αρχή
ΠΡΟΣΘΗΚΗ γεια/
CMD['/γεια σας']

γρατσουνιά δεν είναι εικόνα γονέα. Μάλλον δείχνει το Docker ότι η εικόνα δεν είναι χτισμένη πάνω από οποιαδήποτε άλλη εικόνα. Είναι χτισμένο από την αρχή. Η εντολή ADD θα πάρει το στατικό δυαδικό με όνομα | _+_ | από τον τρέχοντα κατάλογο και θα το προσθέσει στον ριζικό κατάλογο του αρχείου εικόνας. Όταν τελικά θα εκτελέσουμε ένα κοντέινερ με βάση αυτήν την εικόνα, το εκτελέσιμο γεια θα εμφανιστεί μέσα στον ίδιο τον ριζικό κατάλογο στη διεύθυνση | _+_ |

Τέλος, η γραμμή CMD έχει μια συμβολοσειρά /γεια σας αυτή η συμβολοσειρά θα εκτελείται ως εντολή κελύφους κάθε φορά που δημιουργείται ένα κοντέινερ από αυτήν την εικόνα, έτσι το δυαδικό αρχείο που προσθέσαμε στο κοντέινερ μας και εκτυπώνουμε το μήνυμα που γράψαμε στην εφαρμογή μας.

Ας χτίσουμε την εικόνα επικαλούμενοι το κατασκευή docker εντολή που θα περνούσε από τα περιεχόμενα του Dockerfile και θα δημιουργούσε την εικόνα. Εκτελέστε την ακόλουθη εντολή στον ίδιο κατάλογο με το Dockerfile και το εκτελέσιμο δυαδικό.

$κατασκευή docker--ετικέταγεια σας .

ο - ετικέτα γεια σημαία ορίζει το όνομα της εικόνας σε γεια σας και η τελεία ( Το ) στο τέλος λέει κατασκευή docker για να αναζητήσετε τον τρέχοντα κατάλογο για το Dockerfile και το σχετικό περιεχόμενο.

Εκτέλεση του κοντέινερ Docker

Για να ελέγξετε αν η εικόνα που μόλις δημιουργήσαμε εμφανίζεται στη λίστα εικόνων, εκτελέστε:

$εικόνες docker

Παρατηρήστε πόσο μικρή είναι η εικόνα γεια σε σύγκριση με άλλες εικόνες. Σε κάθε περίπτωση, είναι έτοιμο να λειτουργήσει ως κοντέινερ,

$docker run γεια

Αυτό είναι! Δημιουργήσατε το πρώτο σας μινιμαλιστικό δοχείο από την αρχή.

Αλλες επιλογές

Ενώ η δημιουργία εικόνων από την αρχή είναι πάντα μια επιλογή, οι άνθρωποι συχνά τείνουν να δημιουργούν εικόνες από άλλες ελαφριές διανομές Linux. Για παράδειγμα, εικόνες όπως το αλπικό και το busybox είναι πραγματικά ελαφριά περιβάλλοντα με μικρότερες βιβλιοθήκες όπως το musl αντί για glibc.

Χρησιμοποιώντας τα ως γονική εικόνα χρησιμοποιώντας ΑΠΟ ΑΛΠΙΝΑ: τελευταία θα είχε ως αποτέλεσμα και μικρότερες εικόνες. Δεδομένου ότι οι βασικές εικόνες έχουν μέγεθος μόνο 2-5 MB. Ενημερώστε μας αν υπάρχει κάποιο θέμα που σχετίζεται με το Docker, το οποίο ίσως θέλετε να καλύψουμε στη συνέχεια. Μπορείτε να επικοινωνήσετε μαζί μας Κελάδημα , Facebook ή εγγραφείτε σε εμάς μέσω email.