Εισαγωγή

To Docker είναι μια αρχιτεκτονική για containers. Άλλη αντίστοιχη αρχιτεκτονική είναι το OCI (Open Container Initiative). Τα containers ενσωματώνουν όλα τα κομμάτια που χρειάζεται μια εφαρμογή για να λειτουργήσει ξεχωριστά από τις υπόλοιπες σε ένα ενιαίο πακέτο, το οποίο απομονώνεται από τις υπόλοιπες εφαρμογές και λειτουργικό σύστημα με τρόπους που βασίζονται στη χρήση linux namespaces και έχουν τις απαρχές τους στο chroot jail. Θα μπορούσε κανείς να πει ότι τα containers υλοποιούν operating system virtualization κατά αντίστοιχο τρόπο που τα Virtual Machines υλοποιούν hardware virtualization. Κατά τον ίδιο τρόπο λοιπόν που τα Virtual Machines λειτουργούν απομονωμένα και μοιράζονται το ίδιο φυσικό hardware, έτσι και τα containers λειτουργούν απομονωμένα και μοιράζονται το ίδιο λειτουργικό σύστημα με απόλυτη απομόνωση σε επίπεδο λειτουργικού και processes.

os-virtualization

Ξεκινήστε πρώτα από εδώ:

Και δείτε κι αυτά:

Συστατικά

Μπορεί κανείς να πάρει μια ιδέα από το παρακάτω post:

https://developers.redhat.com/blog/2016/01/13/a-practical-introduction-to-docker-container-terminology/?utm_campaign=containers&intcmp=70160000000h1s6AAA

Ακολουθούν συνοπτικοί ορισμοί:

Docker server

Γνωστός και ως docker host, είναι στο μηχάνημα (φυσικό ή VM) που φιλοξενεί τα containers και είναι το λογισμικό που διαμοιράζει τα resources, φροντίζει για την απομόνωση και την λειτουργία των containers (start, stop, κλπ) αλλά και την επικοινωνία τους είτε μεταξύ τους είτε με τον υπόλοιπο κόσμο.

Docker client

Το σύνολο των εντολών (linux) ή το ξεχωριστό λογισμικό (windows) που αποτελούν το περιβάλλον με το οποίο ο χρήστης ή μια εξωτερική εφαρμογή μπορεί να επικοινωνήσει με το Docker Server και να επηρεάσει τη λειτουργία των containers.

Docker Engine

Το σύνολο της client-server εφαρμογής που περιλαμβάνει

  • Docker Server
  • Docker Client
  • Docker APIs

https://docs.docker.com/engine/

Docker images

Βασικά πακέτα πάνω στα οποία μπορεί κανείς να βασιστεί και να φτιάξει containers ή πιο σύνθετα images. Είναι δυνατό να φτιαχτούν πολύπλοκα σύνολα λογισμικού με αντίστοιχα πολύπλοκο τρόπο. Επίσης μπορεί ένα image να φτιαχτεί με layers. Ο τρόπος που φτιάχνεται ένα image από στοιχειώδη συστατικά μπορεί να προδιαγραφεί απόλυτα με την χρήση των dockerfiles. Η διαδικασία της κατασκευής του image ονομάζεται build. Η δυνατότητα ορισμού των προδιαγραφών του build για ένα image δίνει τη δυνατότητα της χρήσης των containers ως Infrastructure as Code (περιγράφω απλώς πως θέλω να είναι το image και αυτό χτίζεται κατά τις προδιαγραφές μου αυτόματα). Έχει σημασία η προσοχή στις διαδικασίες που ορίζονται στα dockerfile καθώς κάθε εντολή καταλήγει στο να προσθέσει ένα ακόμα layer στο image. Τα layers από τη στιγμή που θα προστεθούν είναι immutable. Γι αυτό και πολλές φορές οι εντολές σε κάθε βήμα ενός Dockerfile καταλήγουν να είναι αρκετά πολύπλοκες, καθώς δεν μπορεί κανείς να διαγράψει στην πράξη σε ένα επόμενο layer αρχεία που προστέθηκαν σε προηγούμενο layer. Επειδή τα images αποθηκεύονται σε κεντρικά σημεία - Docker registry - και γίνονται download από εκεί, το μέγεθος των images έχει σημασία για την αποδοτικότητα της υποδομής.

https://circleci.com/blog/tips-for-optimizing-docker-builds/

Docker Hub

Η κεντρική αποθήκη της Docker για τα images. Είναι ο δημόσιος “κάταλογος” - Registry για τα images και μπορεί ο καθένας να δημοσιεύσει τα δικά του, είτε εταιρείες/ιδρύματα είτε ιδιώτες. Μπορεί φυσικά κανείς να διαθέτει και private registry που φιλοξενείται στη δική του ιδιωτική υποδομή.

https://hub.docker.com/

Docker containers

Τα αγαπημένα μας κουτάκια που φτιάχνονται κατ'ομοίωση των images αλλά μπορούν να επηρεαστούν κατά τη δημιουργία τους ώστε να υπάρξουν τροποιήσεις. Επίσης κατά τη δημιουργία των containers από κάποιο image, όπου το container είναι πλέον σαν ένα ξεχωριστό σύνολο από processes και εφαρμογές, μπορούν να οριστούν και διάφορες παράμετροι λειτουργίας, όπως μέρη του filesystem του host στα οποία έχει πρόσβαση το container με συγκεκριμένα δικαιώματα, τα network ports τα οποία ορίζονται ως σημεία πρόσβασης για το container είτε από το εξωτερικό δίκτυο είτε από το εσωτερικό “εικονικό” δίκτυο του docker host.

Docker networking

Γενικά μπορούμε να σκεφτούμε το τρόπο που επικοινωνούν τα containers μεταξύ τους αλλά και με το υπόλοιπο δίκτυο ως bridging. Δημιουργούνται εικονικά bridges στον Docker host που μπορούν να έχουν ή να μην έχουν επικοινωνία με το εξωτερικό δίκτυο. Ένα container μπορεί να επικοινωνεί με περισσότερα από ένα bridges. Αυτό δίνει τη δυνατότητα για πολύπλοκους συνδυασμούς ώστε κάποια containers π.χ. να επικοινωνούν μόνο μεταξύ τους και να χρησιμοποιούν τρίτο container για να δώσουν services προς το εξωτερικό δίκτυο. Φυσικά τέτοιες αρχιτεκτονικές είναι αρκετά πολύπλοκες και η χρήση τους γίνεται αρκετά απλούστερη με τη χρήση εργαλείων για orchestration. Η επικοινωνία μεταξύ containers μπορεί αν χρειαστει να ξεπεράσει τα όρια ενός docker host, κάτι το οποίο θεωρείται αρκετά πολύπλοκο σαν αρχιτεκτονική και πέρα από τη λογική ενός εισαγωγικού post.

Χρήση

Η χρήση των containers μπορεί να αφορά από την αυτοματοποίηση των διαδικασιών χτησίματος μιας πλατφόρμας ή μιας εφαρμογής μέχρι την πλήρη χρήση Infrastructure as Code. Μπορούν να θεωρηθούν, όταν οι εφαρμογές που υλοποιούν διαχωρίζονται απόλυτα ως προς τα services σε ξεχωριστά containers, ότι αποτελούν βασικό συστατικό του Microservices Architecture, ειδικά με το συνδυασμό με εργαλεία orchestration, όπου μπορεί κανείς να χρησιμοποιήσει υποδομές CI/CD για να ενημερώνει τον κώδικα των εφαρμογών, να χτίζει τα κατάλληλα images, να σηκώνει τα containers, να κάνει τις δοκιμές κλπ δημιουργώντας πλήρεις κύκλους ανάπτυξης και λειτουργίας λογισμικού και υπηρεσιών. Το orchestration γενικά μπορεί να διευκολύνει αρκετά τη χρήση των containers σε κάθε σενάριο. Εδώ και κάποια χρόνια η χρήση των containers εξετάζεται και σε περιπτώσεις edge computing στο δίκτυο, καθώς πολλές πλατφόρμες networking υποστηρίζουν containers όπως π.χ. τα Cisco Catalyst 9K και όχι μόνο.. https://blogs.cisco.com/developer/minecraft-on-catalyst-switch Can You Play Minecraft on a Cisco Switch? Flo Pachinger

Docker-compose

Προδιαγραφές καταγεγραμμένες σε αρχεία ρυθμίσεων, μπορούν να χρησιμοποιηθούν απο κατάλληλα εργαλεία για να επιτευχθεί η αυτοματοποίηση της δημιουργίας images και containers. Ένα τέτοιο εργαλείο για την πλατφόρμα Docker με απλή λειτουργία, κυρίως για λόγους test & development (χωρίς να αποκλείεται περιορισμένη χρήση σε production) είναι το docker-compose.

Στο docker-compose χρησιμοποιούνται αρχεια yaml για τον ορισμό services τα οποία χτίζονται με containers αλλά και για τον ορισμό της επικοινωνίας αυτών των services μεταξύ τους και με τον εξωτερικό κόσμο. Το docker-compose σαν λογισμικό βασίζεται σε ένα αριθμό από εντολών και είναι αντίστοιχο με το docker client runtime σε σχέση με το τί μπορεί να εκτελεστεί για να επηρεάσουμε τη λειτουργία των services βασισμένα στα docker containers ή να κάνουμε συγκεκιμένους ελέγχους. Η χρήση της πλατφόρμας Docker απλοποιείται εξαιρετικά με τη χρήση του docker-compose. Βασικό μειονέκτημα του docker-compose είναι η έλλειψη υποστήριξης scale out δηλαδή να μπορεί κανείς να προσθέτει/αφαιρεί nodes οριζόντια για όποιο service χρειάζεται ώστε να ανταποκρίνεται στο φόρτο και τις ανάγκες για τις συγκεκριμένες εφαρμογές. Για τέτοιες περιπτώσεις είναι απαραίτητες διαφορετικά εργαλεία όπως το docker swarm ή το Kubernetes

Kubernetes

Το απόλυτο εργαλείο για υποστήριξη microservices architecture και scalable υποδομών εφαρμογών σε περιβάλλοντα cloud. Βασικό του συστατικό είναι το pod το οποίο μπορεί να περιλαμβάνει ένα ή περισσότερα services. Η προσθήκη ή αφαίρεση pods είναι ο τρόπος που μια τέτοια υποδομή αντιμετωπίζει την αύξηση/μείωση του load για τις εφαρμογές που χτίζονται πάνω στα containers. Πρόσφατα ανακοινώθηκε ότι το Kubernetes δεν θα υποστηρίζει πλέον docker containers αλλά η ακριβής ερμηνεία αυτής της ανακοίνωσης αφήνεται σε πιο ειδικούς από μένα (“ναι μεν αλλά…") https://youtu.be/7KUdmFyefSA - Kubernetes is dropping Docker support - What does it mean for YOU?

Στο παρακάτω post εξηγούνται οι διαφορές Docker & Kuburnetes με παραδείγματα:

https://www.freecodecamp.org/news/kubernetes-vs-docker-whats-the-difference-explained-with-examples/

Κι αυτό λίγο πιο παλιό :

https://containerjournal.com/topics/container-ecosystems/kubernetes-vs-docker-a-primer/amp/

Εγκατάσταση

Παρατίθενται δύο δημοφιλή post για

Networking

Παρατίθενται links που εξηγούν πως επικοινωνούν τα containers και πως αυτό μπορεί να ορισθεί μέσω του docker client ή του docker-compose.

Μερικές πολύ καλές παρουσιάσεις από Cisco Live On Demand Library (χρειάζεστε λογαριασμό):

Logging

Η παρατήρηση των logs είναι εξίσου σημαντική στην πλατφόρμα docker & docker-compose όσο και στο linux. Αν δεν βλέπεις logs χάνεις τουλάχιστον το 50% της εικόνας

https://sematext.com/blog/docker-logs-location/

Debugging

Τί γίνεται όταν κάτι δεν παέι καλά; Προσωπικά θα διάβαζα κάποιο βιβλίο (π.χ. https://www.oreilly.com/library/view/troubleshooting-docker/9781783552344/) ή θα παρακολουθούσα κάποιο course στη θέση σας, όμως ορίστε ένα μικρό post με σχετικές συμβουλές. Ειδικά το docker top, πολύ σημαντική εντολή.

https://medium.com/@betz.mark/ten-tips-for-debugging-docker-containers-cde4da841a1d

κι αυτό από τη Digital Ocean: https://www-digitalocean-com.cdn.ampproject.org/v/s/www.digitalocean.com/community/tutorials/how-to-debug-and-fix-common-docker-issues.amp?amp_gsa=1&amp_js_v=a6&usqp=mq331AQHKAFQArABIA%3D%3D#amp_tf=From%20%251%24s&aoh=16087631049485&referrer=https%3A%2F%2Fwww.google.com&ampshare=https%3A%2F%2Fwww.digitalocean.com%2Fcommunity%2Ftutorials%2Fhow-to-debug-and-fix-common-docker-issues

κι ένα video:

IMAGE ALT TEXT HERE

Διαβάστε οπωσδήποτε τη σειρά των posts από Julio Gomes και Rodie Hassan. Η πρώτη έχει απίστευτο ταξίδι στον κόσμο του Devops. Η δεύτερη εκτείνεται σε μια σειρά από άρθρα εξειδικευμένα κατά αντικείμενο. Παρατίθενται χωριστά.

  • https://12factor.net/ The Twelve Factor App Methodology, Βασικό διάβασμα για να καταλάβει κανείς τί ενέπνευσε αυτή την τεχνολογία.

Η Σειρά του Julio Gomez - Programmability Lead in Cisco EMEAR (εκπληκτικός τύπος)

Rodie Hasan:

Cisco Learning Labs on Devnet (χρειάζεται εγγραφή στο Devnet):

Docker Cheatsheet (πάλι):

Blog Posts & Youtube Videos:

Καλή επιτυχία!! Αν χρειαστείτε βοήθεια, επικοινωνήστε μαζί μας! Σε επόμενο άρθρο θα μιλήσουμε για χρήση της πλατφόρμας docker & docker-compose στην εγκατάσταση και λειτουργία δημοφιλών λύσεων και εφαρμογών για μηχανικούς ΙΤ.