Τεχνικές εικονικοποίησης σε επίπεδο λειτουργικού συστήματος: Μελέτη και σενάρια χρήσης-αξιοποίησης μέσω Docker
Operating system virtualization techniques: Study and usage scenarios via Docker
Διπλωματική εργασία
Συγγραφέας
Δρακόπουλος, Παναγιώτης Αίας
Ημερομηνία
2021-10-15Επιβλέπων
Mamalis, BasilisΛέξεις-κλειδιά
Εικονικοποίηση ; Containerization ; Virtual machine ; Docker ; SwarmΠερίληψη
Στη παρακάτω πτυχιακή εργασία του τελειόφοιτου φοιτητή Παναγιώτη –
Αίαντα Δρακόπουλου γίνεται μια συνολική απεικόνιση των εννοιών της
εικονικοποίησης (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
Περίληψη
In the dissertation of the senior student Panagiotis - Ajax Drakopoulos,
an overview is made of the concepts of virtualization, where it occurs,
and what are the categories of virtualization. The concepts of
container and Docker tool are then discussed extensively. The methods
of virtualization and containerization are compared and the
advantages of using Docker-based virtualization are listed. Then the
whole Docker architecture is presented, how the communication of
the containers is achieved between them but also with the outside
world and how the user can proceed to the creation of his own
repository in the Docker Hub. The following is a reference to the swarm
function in the Docker (docker swarm), how a docker swarm is
created, how the orchestration of the containers is achieved, how the
nodes work depending on the role assigned to them and how they are
added to the swarm that has been created. In closing, the creation of
a nginx service on a Docker Swarm cluster is presented.
A physical computer is a hardware-based device, like a personal
computer. The term is generally used to differentiate hardware-based
computers from software-based Virtual Machines. A physical computer
has a processor (CPU), hard drive, RAM and network connection. In the
context of virtualization, the physical computer is called the Host.
Virtualization is the process of using "special software" on a physical
machine to create a virtual machine (VM). This "special software" is
called a Hypervisor and the virtual machine that is created is called a
Guest. Before Hypervisors, most physical computers could only run one
operating system, meaning that hardware only handled requests from
that operating system. The disadvantage of this approach was that it
was a waste of resources as the operating system could not always use
all of its computing power. Hypervisors solve this problem. It is a small
layer of software that allows multiple operating systems to run in
parallel, sharing the same physical resources of computers. These
operating systems are virtual machines (VMs) that mimic an entire
computer hardware environment in software. Although some form of
virtualization has existed since the mid-1960s, it has evolved over time,
but remains close to its roots. Much of the evolution in virtualization has
taken place in recent years, with new types being developed and
commercialized. The different types of virtualization are limited to
Desktop Virtualization, Application Virtualization, Server Virtualization,
Storage Virtualization, and Network Virtualization.
Containerization allows developers to create and develop applications
faster and more securely. With traditional methods, code is developed
12
in a specific computing environment which, when transferred to a new
location, often leads to errors (bugs, errors). For example, when a
programmer transfers code from a desktop computer to a virtual
machine (VM) or from Linux to a Windows operating system.
Containerization eliminates this problem by grouping the application
code along with the relevant configuration files, libraries, and
dependencies required to execute it. This single software package or
container is removed from the host operating system, and therefore, it
is self-contained and becomes portable - capable of running on any
platform or cloud, without any problems. The concept of
containerization is decades old, but the advent of open source Docker
Engine in 2013, an industry standard for containers with simple
programmer tools and a universal packaging approach, accelerated
the adoption of this technology. A container is a standard piece of
software that packs code and all its dependencies so that the
application runs quickly and reliably from one computing environment
to another. A Container Image is a lightweight, standalone,
executable software package that includes everything you need to
run an application: password, runtime, system tools, system libraries,
and settings. Containerization technology offers significant benefits for
developers and development teams. These include portability,
flexibility, speed, fault isolation, ease of management, efficiency and
safety. After looking at each of the technologies separately, the
question is, which one should be preferred? The answer depends on
many different points. Essentially, every business or application has
different needs, requirements and purpose. The choice of virtualization
over containerization depends on the business development, the
business model or the way the applications are written and produced.
Both are software technologies that create standalone virtual
packages, but to choose the one that best suits the user's needs, we
will look at the following points: speed, resource management, security,
portability, application lifecycle and operating system requirements
systemic. However, it is important to note that there are ways to
combine containerization and virtualization so that the advantages of
both technologies are combined.
Docker is an open platform for developing, sending and executing
applications. It allows us to separate the application from the structure,
so that we can deliver the software quickly. With Docker, we can
partition our structure the same way we manage our applications. By
utilizing Docker methodologies for sending, testing, and developing
code, we can significantly reduce the delay between writing code
and executing it in production. Continuing we will look at the Docker
architecture and its related elements. We will also look at how each
13
component works to make Docker work. The Docker architecture
wanted a client server model and included Docker Client, Docker Host,
Network and Storage, and the Docker Registry / Hub. Containers are
encapsulated environments in which applications run. The container is
defined by the image and any additional configuration options
provided at the startup of the container, and is not limited to network
connections and storage options. Containers only have access to
resources defined in the image, unless additional access is specified
when constructing the image in a container. We can also create a
new image based on the current state of a container. Since containers
are much smaller than VMs, they can rotate in a matter of seconds
and have a much better server density. Towards the end of the work,
we meet the concept of swarm and go deeper into how the nodes
work whether it is a manager or worker nodes. The swarm mode allows
us to manage a set of Docker Engines, native to the Docker platform.
We can use Docker CLI to create a swarm, deploy application services
to a swarm, and manage its behavior. In closing, you describe step by
step the creation of a nginx service in a Docker Swarm Cluster.