Πώς να χρησιμοποιήσετε το Docker (Μέρος 1 – Εισαγωγή)

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

Αυτός ίσως να είναι και ο λόγος για τον οποίο μπορεί να έχετε εγκαταλείψει εξολοκλήρου την χρήση των Containers του Linux, ή γιατί είχατε διαβάσει κάποιο αμφιλεγόμενο άρθρο είτε από αυτούς που το ενστερνίζονται είτε το σας λένε να το αποφύγετε όπως-όπως.

Σε αυτό το πρώτο μέρος, μιας σειράς άρθρων, θα προσπαθήσουμε να ξεκαθαρίσουμε τα πράγματα και να τα βάλουμε στη σωστή προοπτική για οποιονδήποτε προγραμματιστή, sysadmins, Q/A μηχανικούς ή ακόμη και ενθουσιώδης χρήστες που χρειάζονται ακριβώς τη σωστή έμπνευση για τη χρήση των Linux Containers για να λύσουν κάποια ειδικά προβλήματα στον τομέα τους.

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

Πώς προέκυψαν τα «δοχεία» (Container)

Για πολλά χρόνια, οι διακομιστές χρησιμοποιούνταν ως έχουν, με μια ενιαία διαμόρφωση υλικού, που περιείχε ένα πλήρες λειτουργικό σύστημα (OS για συντομία), για να παρέχει χιλιάδες ιστοσελίδες και μερικές πρώιμες εκδόσεις εταιρικού λογισμικού στο ίδιο μηχάνημα.

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

Εικονοποίηση (Virtualisation)

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

Το Virtualization, είναι στην πραγματικότητα η συναρμολόγηση εξαρτημάτων υλικού όπως CPU, RAM, Δίσκοι, Κάρτες Δικτύου κλπ. που όμως, εξομοιώνονται με ένα ειδικό λογισμικό (όπως π.χ. το VirtualBox).

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

Με αυτόν τον τρόπο, ο εικονικός υπολογιστής γίνεται «επισκέπτης» (Guest OS) μέσα σε έναν πραγματικό υπολογιστή ο οποίος με το λειτουργικό του σύστημα ονομάζεται Host.

doker-pos-xrisimopoioyme-virtualisation

Παρόλο που η εικονικοποίηση υλικού εισήχθη πριν από περίπου 10 χρόνια, άρχισε να χρησιμοποιείται ευρέως σε διάφορους τύπους εξυπηρετητών από προγραμματιστές και sysadmins, χρησιμοποιώντας τη λειτουργία KVM (Virtual Machine με βάση τον πυρήνα) η οποία παρουσιάστηκε στον πυρήνα του Linux το 2007.

Έτσι με την τεχνολογία «VT» της Intel και την «AMD-V » της AMD οι προγραμματιστές και sysadmins μπορούν να δημιουργήσουν πολλαπλές εικονικές μηχανές (VM για συντομία) με σκοπό να δοκιμάσουν τις εφαρμογές τους χωρίς να χρειαστεί να αγοράσουν – νοικιάσουν ολόκληρους διακομιστές.

Ένα από τα μεγάλα πλεονεκτήματα της τεχνολογία Virtualization είναι η δυνατότητα δημιουργίας στιγμιότυπων.

Ένα στιγμιότυπο είναι η κατάσταση μιας εικονικής μηχανής σε ένα ακριβές χρονικό σημείο.

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

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

Μπορείτε να σκεφτείτε εικόνες, όπως το ISO της αγαπημένης σας διανομής Linux.

Δεδομένου ότι το αρχείο ISO περιέχει όλα τα βασικά συστατικά για να τρέχει ένα ολόκληρο λειτουργικό σύστημα από ένα live USB/DVD, με τον ίδιο λοιπόν τρόπο ένα στιγμιότυπο εικονικής μηχανής, περιέχει το λειτουργικό σύστημα αλλά και τα εικονικά εξαρτήματα υλικού.

Όλα τα παραπάνω, δημιούργησαν μια ολόκληρη βιομηχανία ιδιωτικών εικονικών διακομιστών (VPS), όπου οι πελάτες θα μπορούν να εκκινήσουν αμέσως προρυθμισμένα στιγμιότυπα διακομιστών για οποιοδήποτε σκοπό. Αυτοί οι πάροχοι VPS έχουν συνήθως 10 ή 20 στιγμιότυπα VM σε κεντρικό κεντρικό υπολογιστή τα οποία κλωνοποιούνται πολλές φορές ανά αίτημα πελατών για να τους παρέχουν τους εικονικούς διακομιστές που χρειάζονται.

Δοχεία LXC (Linux Containers)

Όπως μπορείτε να φανταστείτε, ένα εικονικό μηχάνημα είναι ένα ολόκληρο λειτουργικό σύστημα που τρέχει μέσα σε ένα λειτουργικό σύστημα κεντρικού υπολογιστή. Τα Guest λειτουργικά συστήματα, αν και είναι απομονωμένα, μοιράζονται και χρησιμοποιούν τους πόρους υλικού του κεντρικού υπολογιστή (Host) που τα φιλοξενεί. Μερικές φορές, υπάρχουν πολλαπλά Guest λειτουργικά συστήματα στον ίδιο Host που εκτελούν την ίδια στοίβα υπηρεσιών και λογισμικών ενός συγκεκριμένου λειτουργικού συστήματος.

doker-pos-xrisimopoioyme-virtualisation-vs-container

Αυτή η κατάσταση, δημιούργησε μια ευκαιρία για τους προγραμματιστές του πυρήνα του Linux και τους χάκερς να δημιουργήσουν κάτι που ονομάζεται «ελαφριά εικονικοποίηση διεργασιών» (lightweight process virtualization). Απάντησαν λοιπόν σε ένα εύλογο ερώτημα : « Γιατί να χρησιμοποιούμε ένα ολόκληρο λειτουργικό σύστημα μέσα σε ένα άλλο λειτουργικό σύστημα όταν μπορούμε να χρησιμοποιούμε το υπάρχον επιλέγοντας μόνο τις απαραίτητες για την υπηρεσία μας διεργασίες ;»

Έτσι, αντί να χρησιμοποιούν ένα ολόκληρο λειτουργικό σύστημα, μπόρεσαν να αφαιρέσουν τα «περιττά» (και επαναλαμβανόμενα) στοιχεία του εικονικού λειτουργικού συστήματος για να δημιουργήσουν μια ελαχιστοποιημένη (minimal) έκδοση του. Αυτό οδήγησε στη δημιουργία του LXC (Linux Containers).

Πριν μπούμε στα βαθειά, θα πρέπει να αναφέρουμε ότι η εικονικοποίηση των διεργασιών δεν είναι κάτι καινούργιο. Το Solaris διαθέτει τα Zones, οι *BSD έχει τα Jails και υπάρχουν άλλες παρόμοιες τεχνολογίες όπως το OpenVZ. Το πρόβλημα είναι ότι συχνά αλλάζουν το όνομα ή το σκοπό τους όταν στην πραγματικότητα χρησιμοποιείται η ίδια βασική ιδέα. Είναι αλήθεια ότι δεν είναι όλα τα προηγούμενα ίδια, αλλά οι θεμελιώδεις αρχές είναι σχεδόν οι ίδιες.

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

Ας επιστρέψουμε όμως στο LXC.

Το LXC λοιπόν διαφέρει από τις εικονικές μηχανές στο ότι είναι ένα περιβάλλον virtualization στο επίπεδο του λειτουργικού συστήματος και όχι ένα περιβάλλον virtualization υλικού. Και οι δύο (LXC και Virtualization) κάνουν το ίδιο πράγμα, αλλά το LXC παρέχει λειτουργικό σύστημα σε επίπεδο υπηρεσιών και έχει το δικό του μερίδιο στην χρήση πόρων αλλά και δικτύου, αντί να δημιουργήσει μια ολόκληρη εικονική μηχανή. Κατά συνέπεια, ένα εικονικό λειτουργικό σύστημα LXC έχει ελάχιστες απαιτήσεις πόρων και εκκινεί σε δευτερόλεπτα.

Όπως μπορείτε να δείτε στην παρακάτω εικόνα, το εικονικό Ubuntu LXC στα αριστερά, χρησιμοποιεί 11MB σε ενώ μια εικονική μηχανή του Ubuntu θα χρησιμοποιούσε πάνω απο 100MB. Επίσης η εκκίνηση του Ubuntu LXC γίνεται σε 1 δευτερόλεπτο ενώ της εικονικής μηχανής σε περισσότερα.

doker-pos-xrisimopoioyme-virtualisation-vs-lxc

Και εγένετο το Docker

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

Το 2013, οι προγραμματιστές της dotCloud (μια εταιρεία που άλλαξε αργότερα το όνομά της στο Docker Inc.) παρουσίασαν το Docker.

Το Docker είναι ένας μηχανισμός ανοιχτού κώδικα, ο κύριος στόχος του οποίου είναι να αυτοματοποιήσει την διανομή εφαρμογών μέσα σε δοχεία λογισμικού και την αυτοματοποίηση του Virtualization των μικρο-υπηρεσιών του λειτουργικού συστήματος στο Linux.

Ένα δοχείο docker, σε αντίθεση με μια εικονική μηχανή και το LXC, δεν απαιτεί ούτε περιλαμβάνει ξεχωριστό λειτουργικό σύστημα. Αντίθετα, βασίζεται στη λειτουργικότητα του πυρήνα του Linux και χρησιμοποιεί απομόνωση πόρων.

Τα δοχεία docker δημιουργούνται από στιγμιότυπα (images) docker (θυμηθείτε τα στιγμιότυπα του Virtualization). Μπορείτε να φανταστείτε ένα δοχείο docker ως τη ζωντανή κατάσταση μιας διαδικτυακής εφαρμογής που τρέχει από ένα αρχείο ISO. Αλλά αυτή τη φορά το ISO, το οποίο στο παράδειγμά μας είναι το ισοδύναμο του στιγμιότυπου του docker, περιέχει μόνο την εφαρμογή και τις εξαρτήσεις της.

doker-pos-xrisimopoioyme-docker-stracture

Ένα μεγάλο χαρακτηριστικό του docker, το οποίο θα συζητήσουμε στο δεύτερο μέρος, είναι το αρχείο docker (docker file). Ένα αρχείο docker είναι η συνταγή που περιέχει όλα τα απαραίτητα βήματα που απαιτούνται για τη δημιουργία μιας εικόνας docker. Υπάρχουν κυριολεκτικά εκατοντάδες αρχείων docker «έτοιμα για χρήση» που μπορείτε να προσαρμόσετε να τα χρησιμοποιήσετε όπως είναι.

Επίλογος

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

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

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

Εγγραφείτε στο Newsletter του Cerebrux.net για να λαμβάνετε ειδοποίηση για νέα άρθρα

Advertisements

3 thoughts on “Πώς να χρησιμοποιήσετε το Docker (Μέρος 1 – Εισαγωγή)

  1. Ωραίο και ενδιαφέρον άρθρο. Δύο πράγματα μόνο να σημειώσω που μου πήρε και μένα αρκετό καιρό για να τα καταλάβω:

    1. Τα containers δεν είναι ούτε πρέπει να σχετίζονται με τα virtual machines. Ένα virtual machine είναι μια προσομοίωση ενός υπολογιστή σε λογισμικό (εξού και το όνομα virtual machine). Σε αυτόν τον υπολογιστή μπορεί να τρέξει οποιοδήποτε λειτουργικό σύστημα υποστηρίζει την αρχιτεκτονική που προσομοιώνει το virtual machine.

    Τα containers αντιθέτως δεν είναι τίποτα παραπάνω από ένα απομονωμένο περιβάλλον μέσα στο οποίο προορίζετε να «τρέξει» μια διεργασία. Η διεργασία αυτή θα «τρέξει» απομονωμένα και ανεξάρτητα από τις άλλες διεργασίες του λειτουργικού συστήματος.

    Σε αρκετές περιπτώσεις βέβαια βλέπουμε ότι τα containers χρησιμοποιούνται για να τρέξει ένα ολόκληρο λειτουργικό σύστημα μέσα σε αυτά και αυτός είναι και ο κύριος λόγος που δημιουργείτε η σύγχυση με τα virtual machines. Αν και τεχνικά αυτό είναι εφικτό είναι λάθος προσέγγιση στην χρήση της τεχνολογίας των containers. Εκεί που τα containers κάνουν «fit» είναι όταν μια εφαρμογή έχει δομηθεί γύρω από micro services. Δηλαδή μικρές αυτόνομες υπηρεσίες που εκτελούν μια πολύ συγκεκριμένη εργασία. Σε αυτήν την περίπτωση κάθε service «τρέχει» μέσα στο δικό του container. Νομίζω ότι τα containers βρίσκονται ακόμα στην αρχή και ο κόσμος δεν έχει καταλάβει ακόμα πως να τα αξιοποιήσει στο έπακρο.

    2. To Docker δεν είναι από μόνο του τεχνολογία containerization αλλά ένας wrapper σε υπάρχουσες τεχνολογίες του πυρήνα(cgroups, namespaces). To διευκρινίζω αυτό γιατί πολύ νομίζουν ότι containers = Docker. Μέγα λάθος μιας και μπορείς κάλλιστα να τρέξεις μια διεργασία απομονωμένα χωρίς Docker.

    1. Πολύ σημαντικές οι παρατηρήσεις σου Κώστα και ελπίζω οτι δεν δημιουργήθηκε από το άρθρο η εντύπωση ότι το Docker είναι το μόνο στην αγορά ή οτι containers == virtualization. Στόχος μου ήταν μια απλοποιημένη ιστορική αναδρομή για το πως φτάσαμε σε αυτές τις τεχνολογίες. Προσωπικά εδώ και πολύ καιρό χρησιμοποιώ το LXC/LXD λόγο των «δυστροπιών» που έχει το Docker σε κάποιες περιπτώσεις ενώ σε άλλες περιπτώσεις το Docker.

  2. Συνέχισε την πολύ καλή δουλειά που κάνεις σε αυτό το blog. Το σχόλιο μου έχει στόχο να κάνει ξεκάθαρο σε κάποιον που ξεκινάει με τα containers κάποια πράγματα που και εγώ θα ήθελα να ξέρω όταν ασχολήθηκα για πρώτη φορά.

Απορίες, παρατηρήσεις, ιδέες... Ελεύθερα ! Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s