Πριν πολλά φεγγάρια ήθελα να πακετάρω μια web εφαρμογή μου, για να μπορεί να την πάρει κάποιος και να την εγκαταστήσει εύκολα. Μαζί με όλες τις… παραξενιές που απαιτούσε. Μου λέει ένας φίλος “βάλε Docker να γουστάρεις“.
Πάω κι εγώ να βάλω Docker, χωρίς να το ψάξω και πολύ, με την αίσθηση ότι είναι κάτι σαν Virtual Machine. Αυτό ήξερα, αυτό εμπιστευόμουν. Φυσικά δεν έβγαλα άκρη, αφού πήγα κι εγώ να στήσω Ubuntu με τα πάντα όλα μέσα. Χώσε και Apache, χώσε και PHP, χώσε και mySQL, χώσε και το απαραίτητο third party software. Κάνω restart το container, άφαντα τα data μου.
Με κορόιδεψαν με αυτή τη σαχλαμάρα, είπα. Τι περίεργα μαγικά είναι αυτά; Και άφησα το Docker κατά μέρους. Μέχρι που μετά από καιρό το έπιασα σωστά αυτή τη φορά. Διάβασα σχετική αρθρογραφία, είδα tutorials και μπήκα στο νόημα. Δεν ξανακοίταξα ποτέ πίσω. Και χάθηκα στο ηλιοβασίλεμα…
Τι είναι όμως το Docker; Το Docker όντως είναι κάτι σαν Virtual Machine. Αλλά δεν είναι. Μια Virtual Machine τρέχει μέσα σε ένα λειτουργικό (π.χ. Linux) και είναι η ίδια ένα ολόκληρο λειτουργικό. Είναι ένα ολόκληρο λειτουργικό, μέσα σε ένα ολόκληρο λειτουργικό. Και όλοι μαζί καταναλώνουν resources σαν να μην υπάρχει αύριο.
Ένα Docker container όμως από την άλλη, χρησιμοποιεί το host λειτουργικό. Χρησιμοποιεί τον πυρήνα του host. Δεν έχει δικό του πυρήνα. Με αποτέλεσμα να είναι πολύ ελαφρύ και να ξοδεύει μόνο τα αναγκαία resources, για να τρέξουν τα services που θέλει. Κάθε container είναι πλήρως απομονωμένο από το host λειτουργικό και από άλλα containers.
Η λογική του Docker, είναι ότι σηκώνουμε ένα container για κάθε service που θέλουμε. Θέλουμε Apache; Σηκώνουμε ένα container με Apache. Θέλουμε mySQL; Σηκώνουμε ένα container με mySQL. Και πάει λέγοντας. Φυσικά μπορούμε να τα χώσουμε όλα σαν ένα ενιαίο λειτουργικό σύστημα, αλλά δεν έχει κανένα νόημα όλο αυτό. Ένα γατάκι πεθαίνει κάθε φορά.
Μπορούμε επίσης να χρησιμοποιούμε διαφορετικές εκδόσεις ενός service σε ξεχωριστά containers. Θέλουμε PHP 5.6; Σηκώνουμε container με PHP 5.6. Θέλουμε με 7.4; Σηκώνουμε με 7.4. Αλλάζουμε πολύ εύκολα τις εκδόσεις και μπορούμε να δοκιμάζουμε την εφαρμογή μας σε διάφορα περιβάλλοντα.
Κάθε container δεν κρατάει δεδομένα μέσα του. Δηλαδή αν τρέχουμε ένα container με mySQL, τα δεδομένα της βάσης θα χαθούν αν κάνουμε restart το service. Γι’ αυτό τον λόγο κάνουμε αντιστοίχιση φακέλου του host μηχανήματος με φάκελο του container. π.χ. αντιστοιχούμε τον φάκελο /mysql/data από το host, στον φάκελο /var/lib/mysql εσωτερικά του container. Έτσι τώρα, τα δεδομένα της βάσης θα σώζονται στον φάκελο /mysql/data και θα συγχρονίζεται το container με αυτά.
Με το Docker μπορούμε να πακετάρουμε μια εφαρμογή μας, να μπορεί κάποιος να την χρησιμοποιήσει, είτε για development, είτε για κανονική χρήση. Το μόνο που χρειάζεται, είναι ένα αρχείο που περιγράφει ποια containers και πως θα σηκωθούν. Η εφαρμογή θα έχει στην διάθεση της όλα τα services που χρειάζεται, στην έκδοση που τα χρειάζεται, όπως τα χρειάζεται.
Προγραμματιστές που δουλεύουν ταυτόχρονα μια εφαρμογή, μπορούν να έχουν όλοι πανομοιότυπο development περιβάλλον, ανεξάρτητα σε πιο host μηχάνημα δουλεύουν. Ακόμη και σε διαφορετικά λειτουργικά (Linux, Mac OS, Windows)
Ενώ και το τελικό deploy της εφαρμογής σε κάποιον server μπορεί να γίνει πανεύκολα, σηκώνοντας κι εκεί όλα τα Docker containers που χρειάζονται.
Το Docker είναι σήμερα από τα βασικότερα εργαλεία ενός προγραμματιστή. Πραγματικά όποιος αρχίσει να το χρησιμοποιεί, απορεί μετά πως στο διάολο δούλευε χωρίς αυτό τόσα χρόνια. Απλοποιεί τόσο πολύ διάφορες καταστάσεις και διαδικασίες, που είναι μαζοχισμός να μην το χρησιμοποιείς.
Κι αν εγώ δεν σας τα εξήγησα ωραία, έχετε μια δεύτερη ευκαιρία. Ο τύπος στο παρακάτω βίντεο τα εξηγεί πολύ πιο ωραία (σαν τον Αλέφαντο). Νομίζω είναι το καλύτερο βίντεο που έχω δει για εισαγωγή στο Docker.