Πώς να χρησιμοποιήσετε κοντέινερ Linux με LXC και LXD

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

Αυτές τις μέρες μπορώ να πω στον εαυτό μου "Δεν με πειράζει να το δοκιμάσω σε έναν διακομιστή που εκτελεί μια συγκεκριμένη έκδοση του CentOS" και - ανάλογα με μια σειρά μεταβλητών και υποθέτοντας ότι η αρχική εικόνα έχει ήδη ληφθεί - μπορώ να έχω μια πλήρως λειτουργική εικονικό σύστημα έτοιμο εντός 30 δευτερολέπτων. Τα ακριβή αποτελέσματά σας μπορεί να διαφέρουν, αλλά όχι τόσο πολύ.

Μπορείτε να δείτε πώς λειτουργεί όλα αυτά στο νέο μάθημα Pluralsight "Linux System Optimization" - στο οποίο βασίζεται αυτό το άρθρο.

Τι οδήγησε όλη αυτή την αλλαγή; Εικονικοποίηση. Και, ειδικότερα, εικονικοποίηση κοντέινερ.

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

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

Σε γενικές γραμμές, υπάρχουν δύο είδη συστημάτων λογισμικού που χρησιμοποιούνται για τη διαχείριση εικονικοποίησης διακομιστή: hypervisor και container.

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

Εικονικοποίηση κοντέινερ

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

Πολλή προσοχή που σχετίζεται με τα κοντέινερ τα τελευταία χρόνια επικεντρώθηκε στο Docker και, πιο πρόσφατα, στο εργαλείο ενορχήστρωσης κοντέινερ της Google, Kubernetes. Στην πραγματικότητα, το Kubernetes είναι κατάλληλο για αρχιτεκτονικές μικροεπηρεσιών σε κλίμακα επιχειρήσεων.

Αλλά υπάρχει μια παλαιότερη και, αναμφισβήτητα, πιο ώριμη εφαρμογή του μοντέλου κοντέινερ που δεν έχει πάει πουθενά. Το Linux Container Project, LXC, και το πιο πρόσφατο σετ εργαλείων του, LXD, έχουν πλεονεκτήματα που πολλοί υποστηρίζουν ότι το καθιστούν καλύτερο υποψήφιο για ορισμένες περιπτώσεις χρήσης από το Kubernetes. Συγκεκριμένα, η LXC υπερέχει στην κατασκευή ελαφρών και γρήγορων περιβάλλοντων με άμμο για δοκιμές και ανάπτυξη εφαρμογών.

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

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

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

Κατασκευή εμπορευματοκιβωτίων LXD

Θα λειτουργήσει το LXC σε μια νέα εγκατάσταση ενός μηχανήματος Ubuntu 18.04. Σε αυτήν την επίδειξη, θα εγκαταστήσουμε και θα προετοιμάσουμε ένα περιβάλλον LXD και στη συνέχεια θα χρησιμοποιήσουμε την έκδοση LXD της διεπαφής γραμμής εντολών LXC για λήψη και εκκίνηση ενός κοντέινερ Alpine Linux. Θα επιβεβαιώσουμε ότι όλα λειτουργούσαν και στη συνέχεια θα ρίξουμε μια ματιά γύρω για να δούμε πώς κατοικείται το περιβάλλον.

Θα χρησιμοποιήσω το πρόγραμμα διαχείρισης πακέτων snap για να εγκαταστήσω το LXD γιατί αυτή είναι πλέον η επίσημη πρόταση. Και όχι μόνο για το LXD, έχετε υπόψη σας: όλα τα είδη εφαρμογών μεταφέρονται σε εναλλακτικούς διαχειριστές όπως snap ή AppImmage και Flatpak. Αγαπώ ακόμα την ικανότητα του Debian, αλλά δεν μπορείς να πολεμήσεις ολόκληρο τον κόσμο.

$ sudo snap install lxd 

Το LXD - το οποίο, πάλι, είναι ένα ενημερωμένο σύνολο εργαλείων που έχει σχεδιαστεί για τη διαχείριση του API LXC - έρχεται σε ένα πακέτο που περιλαμβάνει όλες τις κανονικές εξαρτήσεις LXC. Μια εντολή εγκατάστασης και τελειώσαμε.

Είναι σημαντικό να αρχικοποιήσετε το περιβάλλον LXC χρησιμοποιώντας την εντολή lxd init. Θα μπορούσατε να ρυθμίσετε τα πράγματα μόνοι σας, αλλά είναι πιο πιθανό να τα πάρετε όλα καλά με αυτόν τον τρόπο. Η διαδικασία init θα σας κάνει πολλές ερωτήσεις και, τουλάχιστον τώρα, όλες οι προεπιλεγμένες απαντήσεις θα λειτουργήσουν.

$ sudo lxd init 

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

Θα χρησιμοποιήσω την τελευταία έκδοση του Alpine Linux γιατί είναι πολύ μικρό. Μη διστάσετε να χρησιμοποιήσετε οποιαδήποτε εικόνα θέλετε - συμπεριλαμβανομένων των μεγάλων αγοριών όπως το Ubuntu και το CentoOS. Το Alpine, φυσικά, θα κατεβάσει πολύ γρήγορα.

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

Όπως μπορείτε να δείτε σε αυτό το στιγμιότυπο οθόνης από τον ιστότοπο LXD, μπορείτε να λάβετε τρεις πληροφορίες που θα χρειαστείτε από την ίδια τη σελίδα: το όνομα της διανομής - Alpine, σε αυτήν την περίπτωση - τον αριθμό κυκλοφορίας - 3.10 - και την αρχιτεκτονική . Είμαστε μετά το amd64.

Είμαστε τώρα έτοιμοι να ενεργοποιήσουμε τη λήψη εκτελώντας την launchεντολή:

$ sudo lxc launch images:alpine/3.10/amd64 demo 

Παρατηρήστε πώς η σύνταξη είναι "lxc" παρόλο που αυτό είναι τεχνικά μια διεπαφή LXD. Το "images" λέει στην LXC ότι η εικόνα μας ζει στο δημόσιο repo που είδαμε νωρίτερα. Τα τρία κομμάτια δεδομένων μας - το όνομα διανομής, ο αριθμός κυκλοφορίας και η αρχιτεκτονική, εισάγονται διαχωρισμένα με κάθετες. Θα χρησιμοποιήσω το "demo" ως το όνομα του κοντέινερ μου. Αυτό πρέπει να είναι το μόνο που χρειαζόμαστε.

You can see how small Alpine is by how quickly it downloads. My internet connection isn't that fast and I haven't played any games with the recording. To confirm that it worked, I'll run "lxc ls" to list all the containers currently installed. There's just the one. And its current status is "running".

sudo lxc ls +------+---------+----------------------+------------+-----------+ | NAME | STATE | IPV4 | TYPE | SNAPSHOTS | +------+---------+----------------------+------------+-----------+ | demo | RUNNING | 10.125.45.119 (eth0) | PERSISTENT | 0 | +------+---------+----------------------+------------+-----------+ 

You can open a non-login root session in a container using the "lxc exec" command. Just specify the container name and then tell LXC that you want to run a shell using the sh interpreter (you might prefer /bin/bash if you're working with an Ubuntu or CentOS container - your call either way). As you'll be able to see for yourself if you're following along at home, we've got a normal Linux command prompt and anything Linux-y is now possible.

$ sudo lxc exec demo sh ~ # 

You could also run a single command without opening a full shell by typing the command instead of this sh.

$ sudo lxc exec demo ls / bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr 

You can bail out of the shell any time you like using exit and return to your host. Here, besides listing running containers, I can also list any storage pools. The default pool that was created during initialization is there, and we can see where the disk image is stored. /var/lib/lxd is, by default, where all LXC resources are kept.

$ sudo lxc storage ls +---------+-------------+--------+--------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------+---------+ | default | | btrfs | /var/lib/lxd/disks/default.img | 3 | +---------+-------------+--------+--------------------------------+---------+ 

I can similarly list all my networks. There happen to be a few network bridges on this system (I've been playing around a bit, as you can see). There's also the physical enp0s3 bridge used by the host Ubuntu server. Although between you and me, that one's not physical either, as this is actually a VM running in Oracle's Virtual Box.

$ lxc network ls +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | enp0s3 | physical | NO | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | mynet | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ | testbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ 

If we needed to, we could easily add a new virtual interface to our container using the "lxc network attach" command. Here, I'll specify the physical network and then the name of our container.

$ lxc network attach enp0s3 demo 

With that done, you could open a new shell in the container to see what's changed. There should now be an eth1 interface listed. You may need to reboot for all the changes to take full effect. By doing that you can also marvel at just how fast this thing can reboot itself - for all intents and purposes, it'll happen faster than you can type your exec command to open a new shell.

Enjoy your new environment!

This article is based on content in my Pluralsight course, "Linux System Optimization." There's much more administration goodness in the form of books, courses, and articles available at bootstrap-it.com.