Στη παρακάτω πτυχιακή εργασία του τελειόφοιτου φοιτητή Παναγιώτη –
Αίαντα Δρακόπουλου γίνεται μια συνολική απεικόνιση των εννοιών της
εικονικοποίησης (virtualization), πού συναντάται, και ποιες είναι οι
κατηγορίες εικονικοποίησης . Στη συνέχεια γίνεται εκτενή αναφορά στις
έννοιες του Containerization και του εργαλείου Docker. Τίθενται σε
σύγκριση οι μέθοδοι της εικονικοποίησης και του Containerization και
παρατίθενται τα πλεονεκτήματα της χρήσης της εικονικοποίησης με
βάση το Docker. Μετέπειτα παρουσιάζεται ολόκληρη η αρχιτεκτονική
του Docker, πώς επιτυγχάνεται η επικοινωνία των containers μεταξύ
τους αλλά και με τον έξω κόσμο και πώς μπορεί ο χρήστης να
προχωρήσει στη δημιουργία δικού του αποθετηρίου (repository) στο
Docker Hub. Ακολουθεί αναφορά στη λειτουργία σμήνους στο Docker
(docker swarm), πώς δημιουργείται ένα docker swarm, πώς
επιτυγχάνεται η ενορχήστρωση των container, πώς λειτουργούν οι
κόμβοι ανάλογα το ρόλο που τους έχει ανατεθεί και πώς προστίθενται
στο σμήνος το οποίο έχει δημιουργηθεί. Κλείνοντας παρουσιάζεται η
δημιουργία μιας υπηρεσίας nginx πάνω σε ένα cluster Docker Swarm
και επίσης δημιουργήσουμε το δικό μας εξατομικευμένο Word Press Blog
το οποίο
δεν θα «τρέχει» στον υπολογιστή μας αλλά σε docker container μέσω
του Docker.
Ένας φυσικός υπολογιστής είναι μια συσκευή βασισμένη σε υλικό, όπως
ένας προσωπικός υπολογιστής. Ο όρος γενικά χρησιμοποιείται για τη
διαφοροποίηση υπολογιστών με βάση το υλικό από εικονικές μηχανές
(Virtual Machine) που βασίζονται σε λογισμικό. Ένας φυσικός
υπολογιστής διαθέτει επεξεργαστή (CPU), σκληρό δίσκο (Hard Drive),
μνήμες RAM και σύνδεση στο δίκτυο. Στα πλαίσια του virtualization ο
φυσικός υπολογιστής ονομάζεται Host. Virtualization είναι η διαδικασία
χρήσης ενός «ειδικού λογισμικού» σε μια φυσική μηχανή για να
δημιουργηθεί μια εικονική μηχανή (VM). Αυτό το «ειδικό λογισμικό»
καλείται ως Hypervisor και η εικονική μηχανή που δημιουργείται καλείται
ως Guest. Πριν τους Hypervisors, οι περισσότεροι φυσικοί υπολογιστές
μπορούσαν να τρέξουν μόνο ένα λειτουργικό σύστημα, δηλαδή το υλικό
(hardware) χειριζόταν αιτήματα μόνο από το συγκεκριμένο λειτουργικό
σύστημα. Το μειονέκτημα αυτής της προσέγγισης ήταν ότι σπαταλούσε
πόρους καθώς το λειτουργικό σύστημα δεν μπορούσε πάντα να
χρησιμοποιήσει όλη την υπολογιστική του ισχύ. Οι Hypervisors λύνουν
αυτό το πρόβλημα. Πρόκειται για ένα μικρό στρώμα λογισμικού που
επιτρέπει σε πολλαπλά λειτουργικά συστήματα να τρέχουν παράλληλα,
μοιράζοντας τους ίδιους φυσικούς πόρους υπολογιστών. Αυτά τα
λειτουργικά συστήματα είναι τα εικονικά μηχανήματα (VMs), τα οποία
μιμούνται ένα ολόκληρο περιβάλλον υπολογιστικού υλικού στο
λογισμικό. Αν και κάποια μορφή εικονικοποίησης υπήρχε από τα μέσα
9
της δεκαετίας του 1960, εξελίχθηκε με την πάροδο του χρόνου,
παραμένοντας όμως κοντά στις ρίζες της. Μεγάλο μέρος της εξέλιξης
στην εικονικοποίηση έχει συμβεί τα τελευταία χρόνια, με νέους τύπους να
αναπτύσσονται και να εμπορευματοποιούνται. Οι διαφορετικοί τύποι
εικονικοποίησης περιορίζονται σε εικονικοποίηση επιφάνειας εργασίας
(Desktop Virtualization), εικονικοποίηση εφαρμογών (Application
Virtualization), εικονικοποίηση διακομιστή (Server Virtualization),
εικονικοποίηση αποθήκευσης (Storage Virtualization) και εικονικοποίηση
δικτύου (Network Virtualization).
Το Containerization επιτρέπει στους προγραμματιστές να δημιουργούν
και να αναπτύσσουν εφαρμογές γρηγορότερα και με μεγαλύτερη
ασφάλεια. Με τις παραδοσιακές μεθόδους, ο κώδικας αναπτύσσεται σε
ένα συγκεκριμένο υπολογιστικό περιβάλλον το οποίο, όταν μεταφέρεται
σε μια νέα τοποθεσία, συχνά οδηγεί σε σφάλματα (bugs, errors). Για
παράδειγμα, όταν ένας προγραμματιστής μεταφέρει κώδικα από
επιτραπέζιο υπολογιστή σε εικονική μηχανή (VM) ή από Linux σε
λειτουργικό σύστημα Windows. Το Containerization εξαλείφει αυτό το
πρόβλημα ομαδοποιώντας τον κωδικό εφαρμογής μαζί με τα σχετικά
αρχεία διαμόρφωσης, βιβλιοθήκες και εξαρτήσεις που απαιτούνται για
την εκτέλεση του. Αυτό το ενιαίο πακέτο λογισμικού ή κοντέινερ
αφαιρείται από το λειτουργικό σύστημα του κεντρικού υπολογιστή, και
ως εκ τούτου, είναι μόνο του και γίνεται φορητό - ικανό να τρέχει σε
οποιαδήποτε πλατφόρμα ή cloud, χωρίς προβλήματα. Η έννοια του
Containerization είναι δεκαετιών, αλλά η εμφάνιση του ανοιχτού κώδικα
Docker Engine το 2013, ένα βιομηχανικό πρότυπο για κοντέινερ με απλά
εργαλεία προγραμματιστή και μια καθολική προσέγγιση packaging,
επιτάχυνε την υιοθέτηση αυτής της τεχνολογίας. Το κοντέινερ (container)
είναι μια τυπική μονάδα λογισμικού που συσκευάζει κώδικα και όλες τις
εξαρτήσεις του, έτσι ώστε η εφαρμογή να εκτελείται γρήγορα και
αξιόπιστα από το ένα υπολογιστικό περιβάλλον στο άλλο. Μια εικόνα
κοντέινερ (Container Image) είναι ένα ελαφρύ, αυτόνομο, εκτελέσιμο
πακέτο λογισμικού που περιλαμβάνει όλα όσα χρειάζονται για την
εκτέλεση μιας εφαρμογής: κωδικός, χρόνος εκτέλεσης, εργαλεία
συστήματος, βιβλιοθήκες συστήματος και ρυθμίσεις. Η τεχνολογία του
Containerization προσφέρει σημαντικά οφέλη για προγραμματιστές και
ομάδες ανάπτυξης. Μεταξύ αυτών είναι η φορητότητα, η ευελιξία, η
ταχύτητα, η απομόνωση βλαβών, η ευκολία διαχείρισης, η
αποδοτικότητα και η ασφάλεια. Αφού εξετάσαμε καθεμία από τις
τεχνολογίες ξεχωριστά, το ερώτημα είναι, ποια πρέπει να προτιμάται; Η
απάντηση εξαρτάται από πολλά διαφορετικά σημεία. Ουσιαστικά, κάθε
επιχείρηση ή εφαρμογή έχει διαφορετικές ανάγκες, απαιτήσεις και
σκοπό. Η επιλογή του virtualization έναντι του containerization εξαρτάται
από την επιχειρηματική ανάπτυξη, το επιχειρησιακό μοντέλο ή τον τρόπο
σύνταξης και παραγωγής των εφαρμογών. Και οι δύο είναι τεχνολογίες
λογισμικού που δημιουργούν αυτόνομα εικονικά πακέτα, αλλά για να
επιλέξουμε αυτό που θα ταιριάζει καλύτερα στις ανάγκες του χρήστη, θα
εξετάσουμε τα ακόλουθα σημεία: ταχύτητα, διαχείριση πόρων,
10
ασφάλεια, φορητότητα, το κύκλο ζωής της εφαρμογής και τις
απαιτήσεις λειτουργικού συστήματος. Ωστόσο, είναι σημαντικό να
σημειωθεί ότι υπάρχουν τρόποι συνδυασμού containerization και
virtualization έτσι ώστε τα πλεονεκτήματα και των δύο τεχνολογιών να
συνδυάζονται.
Το Docker είναι μια ανοιχτή πλατφόρμα για ανάπτυξη, αποστολή και
εκτέλεση εφαρμογών. Μας επιτρέπει να διαχωρίζουμε τις εφαρμογές
(Application) από τη δομή (infrastructure), ώστε να μπορούμε να
παραδίδουμε το λογισμικό γρήγορα. Με το Docker, μπορούμε να
διαμερίζουμε την δομή μας με τον ίδιο τρόπο που διαχειριζόμαστε τις
εφαρμογές μας. Αξιοποιώντας τις μεθοδολογίες του Docker για
αποστολή, δοκιμή και ανάπτυξη κώδικα, μπορούμε να μειώσουμε
σημαντικά την καθυστέρηση μεταξύ σύνταξης κώδικα και εκτέλεσής του
στην παραγωγή. Συνεχίζοντας θα εξετάσουμε την αρχιτεκτονική του
Docker και τα σχετικά στοιχεία της. Θα εξετάσουμε επίσης πώς
λειτουργεί κάθε στοιχείο για να κάνει το Docker να λειτουργεί. Η
αρχιτεκτονική του Docker χρησιμοποιεί ένα μοντέλο διακομιστή-πελάτη
και περιλαμβάνει τα στοιχεία Docker Client, Docker Host, Network and
Storage και το Docker Registry / Hub. Τα κοντέινερ είναι ενθυλακωμένα
περιβάλλοντα στα οποία εκτελούνται οι εφαρμογές. Το κοντέινερ ορίζεται
από την εικόνα και τυχόν πρόσθετες επιλογές διαμόρφωσης που
παρέχονται κατά την εκκίνηση του κοντέινερ, και δεν περιορίζονται στις
συνδέσεις δικτύου και στις επιλογές αποθήκευσης. Τα κοντέινερ έχουν
πρόσβαση μόνο σε πόρους που ορίζονται στην εικόνα, εκτός εάν
ορίζεται πρόσθετη πρόσβαση κατά την κατασκευή της εικόνας σε
κοντέινερ. Μπορούμε επίσης να δημιουργήσουμε μια νέα εικόνα με
βάση την τρέχουσα κατάσταση ενός κοντέινερ. Δεδομένου ότι τα
κοντέινερ είναι πολύ μικρότερα από τα VM, μπορούν να περιστραφούν
σε λίγα δευτερόλεπτα και να έχουν πολύ καλύτερη πυκνότητα διακομιστή
(server density). Φτάνοντας προς το τέλος της εργασίας, συναντάμε την
έννοια του σμήνους (swarm) και εμβαθύνουμε στο πώς λειτουργούν οι
κόμβοι είτε πρόκειται για manager είτε για worker nodes. Η λειτουργία
σμήνους μας επιτρέπει να διαχειριζόμαστε ένα σύμπλεγμα Docker
Engines, εγγενώς στην πλατφόρμα Docker. Μπορούμε να
χρησιμοποιούμε το Docker CLI για να δημιουργήσουμε ένα σμήνος, να
αναπτύξουμε υπηρεσίες εφαρμογών σε ένα σμήνος και να
διαχειριστούμε τη συμπεριφορά του. Κλείνοντας, περιγράφετε βήμαβήμα η δημιουργία μιας υπηρεσίας nginx σε ένα Docker Swarm Cluster
και επίσης δημιουργήσουμε το δικό μας εξατομικευμένο Word Press Blog
το οποίο δεν θα «τρέχει» στον υπολογιστή μας αλλά σε docker
container μέσω του Docker