Πως χρησιμοποιούμε περιέκτες LXD (LXD containers) στο Ubuntu και άλλες διανομές

Ξέρουμε για τις εικονικές μηχανές (virtual machines) όπως Virtualbox και VMWare, υπάρχουν όμως και οι περιέκτες (containers) όπως Docker και LXD (προφέρεται λεξ ντι).

Εδώ θα δούμε για τους περιέκτες LXD (LXD containers), με την υποστήριξη να είναι ήδη διαθέσιμη σε όσους έχουν Ubuntu 16.04 ή νεότερο. Για τις υπόλοιπες διανομές χρειάζεται εγκατάσταση του πακέτου LXD.

Συγκεκριμένα, σήμερα θα δούμε:

  1. Τι είναι και τι προσφέρει το LXD;
  2. Πως κάνουμε την αρχική ρύθμιση του LXD σε Ubuntu Desktop (ή Ubuntu Server);
  3. Πως δημιουργούμε τον πρώτο μας περιέκτη;
  4. Πως εγκαθιστούμε τον nginx μέσα σε περιέκτη;
  5. Ποιες είναι κάποιες από τις άλλες πρακτικές χρήσεις των περιεκτών LXD;

Για τα παρακάτω, θεωρούμε ότι έχουμε Ubuntu 16.04 ή νεότερο. Ubuntu Desktop ή Ubuntu Server είναι μια χαρά.

Τι είναι και τι προσφέρει το LXD;

Υπάρχει ο όρος περιέκτες Linux (Linux containers, LXC) που περιγράφει τη νέα δυνατότητα που προσφέρει ο πυρήνας του Linux να περιορίζεται η εκτέλεση μιας θυγατρικής διεργασίας (μέσω namespaces, cgroups) ώστε να επιτρέπεται να γίνονται μόνο όσα έχουμε δηλώσει. Με το Docker, μπορούμε να τρέξουμε (τυπικά) μια διεργασία κάτω από περιορισμούς (process container). Με το LXD όμως, μπορούμε να τρέξουμε μια ολόκληρη διανομή κάτω από περιορισμούς (machine container).

Το LXD είναι λογισμικό επόπτη (hypervisor) που επιτρέπει τον πλήρη έλεγχο του κύκλου ζωής των περιεκτών. Συγκεκριμένα,

  • επιτρέπει την αρχικοποίηση των ρυθμίσεων καθώς και του χώρου όπου θα αποθηκεύονται οι περιέκτες. Μετά την αρχικοποίηση, δεν χρειάζεται να ασχοληθούμε ξανά με αυτές τις λεπτομέρειες.
  • παρέχει αποθετήρια με έτοιμες εικόνες (images) από μια σειρά διανομών. Υπάρχει Ubuntu (από 12.04 έως 17.04, Ubuntu Core), Alpine, Debian (strech, wheezy), Fedora (22, 23, 24, 25), Gentoo, OpenSUSE, Oracle, Plamo και Sabayon. Αυτά είναι διαθέσιμα στις αρχιτεκτονικές amd64, i386, armhf, armel, powerpc, ppc64el και s390x.
  • επιτρέπει την εκκίνηση μιας εικόνας μέσα σε λίγα δευτερόλεπτα. Μια εικόνα που έχει εκκινηθεί, αποτελεί έναν περιέκτη.
  • μπορούμε να πάρουμε αντίγραφο ασφάλειας ενός περιέκτη, να τον μεταφέρουμε μέσω δικτύου σε άλλη εγκατάσταση LXD, κτλ.

Η τυπική χρήση των περιεκτών LXD είναι στο να τρέχουμε υπηρεσίες διαδικτύου όπως WordPress, με στόχο να έχουμε σε ξεχωριστό περιέκτη κάθε διαφορετικό δικτυακό τόπο. Έτσι, απομονώνουμε τις υπηρεσίες και μπορούμε να τις διαχειριστούμε καλύτερα. Σε σχέση με τις εικονικές μηχανές, οι περιέκτες LXD απαιτούν πολύ λιγότερους πόρους. Για παράδειγμα, σε υπολογιστή με Ubuntu Desktop και 4GB RAM, μπορούμε να τρέξουμε άνετα και δέκα περιέκτες LXD.

Αρχικές ρυθμίσεις του LXD

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

Θα εκτελέσουμε την εντολή lxd init ως διαχειριστές ώστε να γίνει η αρχική ρύθμιση του LXD.

$ sudo lxd init
Name of the storage backend to use (dir or zfs): dir
Would you like LXD to be available over the network (yes/no)? no
Do you want to configure the LXD bridge (yes/no)? yes 
> Θα ρωτήσει για ρυθμίσεις δικτύου. Αποδεχόμαστε ό,τι προταθεί και συνεχίζουμε.
Warning: Stopping lxd.service, but it can still be activated by:
 lxd.socket
 LXD has been successfully configured.
$ _

Μας ρώτησε για το storage backend (υποστήριξη αποθήκευσης) και επιλέξαμε dir. Αυτή είναι η πιο απλή επιλογή, και τα αρχεία κάθε περιέκτη θα τοποθετηθούν σε υποκατάλογο στο /var/lib/lxd/. Για πιο σοβαρή χρήση, θα επιλέγαμε zfs. Αν θέλετε να δοκιμάσετε με zfs, αποδεχτείτε ό,τι προταθεί και επιλέξτε να διαθέσετε τουλάχιστον 15GB χώρο.

Με τη ρύθμιση της γέφυρας LXD (LXD bridge), γίνεται η ρύθμιση του διαδικτύου για τους περιέκτες. Αυτό που θα γίνει, είναι ότι το LXD θα παρέχει έναν εξυπηρετητή DHCP (τον dnsmasq) για τους περιέκτες ώστε να τους αποδώσει διεθύνσεις IP τύπου 10.x.x.x και να επιτρέψει την πρόσβαση στο διαδίκτυο.

Τώρα είμαστε σχεδόν έτοιμοι να τρέξουμε εντολές lxc για τη διαχείρηση εικόνων και περιεκτών LXD. Ας επιβεβαιώσουμε ότι ο λογαριασμός χρήση μπορεί να τρέξει εντολές για το LXD. Εδώ χρειάζεται ο χρήστης μας να ανήκει την ομάδα (group) με όνομα lxd. Δηλαδή,

$ groups myusername
myusername : myusername adm cdrom sudo vboxusers lxd

Αν δεν είμασταν μέλη της ομάδας lxd, τότε θα χρειαζόταν να τρέξουμε

$ sudo usermod --append --groups lxd myusername
$ _

και μετά να αποσυνδεθούμε (log out) και να συνδεθούμε (log in) ξανά.

Πως δημιουργούμε έναν περιέκτη

Πρώτα ας τρέξουμε την εντολή που δείχνει τι περιέκτες υπάρχουν. Θα δείξει κενό.

$ lxc list
If this is your first time using LXD, you should also run: lxd init
To start your first container, try: lxc launch ubuntu:16.04
+---------+---------+-----------------+-------------------+------------+-----------+
|  NAME   |  STATE  |      IPV4       |       IPV6        |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------+-------------------+------------+-----------+
+---------+---------+-----------------+-------------------+------------+-----------+

Όλες οι εντολές διαχείρισης περιεκτών LXD ξεκινούν με lxc και μετά ακολουθεί ένα ρήμα. Το lxc list (ρήμα: list) δείχνει τους διαθέσιμους περιέκτες.

Βλέπουμε ήδη ότι το ρήμα για να ξεκινήσουμε τον πρώτο περιέκτη, είναι το launch. Μετά ακολουθεί το όνομα του αποθετηρίου, το ubuntu:, και τέλος το αναγνωριστικό της εικόνας (16.04).

Υπάρχουν δύο διαθέσιμα αποθετήρια με εικόνες, το ubuntu: και το images:. Για να δούμε τις διαθέσιμες εικόνες στο ubuntu:, τρέχουμε

$ lxc image list ubuntu:
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
|       ALIAS        | FINGERPRINT  | PUBLIC |                   DESCRIPTION                   |  ARCH   |   SIZE   |          UPLOAD DATE          |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
...+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| x (9 more)         | 8fa08537ae51 | yes    | ubuntu 16.04 LTS amd64 (release) (20170516)     | x86_64  | 153.70MB | May 16, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
...$ _

Βλέπουμε ότι το Ubuntu 16.04 έχει αρκετά ψευδώνυμα, και εκτός από το «16.04», υπάρχει και το «x» (από το xenial).

Ας χρησιμοποιήσουμε την εικόνα του Ubuntu 16.04 (ubuntu:x) για να δημιουργήσουμε και να εκκινήσουμε έναν περιέκτη.

$ lxc launch ubuntu:x mycontainer
Creating mycontainer
Starting mycontainer
$ _

Εδώ χρησιμοποιήσαμε ως μήτρα την εικόνα ubuntu:x για να δημιουργήσουμε και να εκκινήσουμε έναν περιέκτη με όνομα mycontainer, που τρέχει Ubuntu 16.04.

$ lxc list
+-------------+---------+---------------------+-----------------------------------------------+------------+-----------+
|    NAME     |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+-------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| mycontainer | RUNNING | 10.0.180.12 (eth0)  | fd42:accb:3958:4ca6:216:57ff:f0ff:1afa (eth0) | PERSISTENT | 0         |
+-------------+---------+---------------------+-----------------------------------------------+------------+-----------+
$ _

Και αυτός είναι ο πρώτος μας περιέκτης! Είναι σε εκτέλεση, και έχει και διευθύνση IP. Ας δοκιμάσουμε:

$ ping 10.0.180.12
PING 10.0.180.12 (10.0.180.12) 56(84) bytes of data.
64 bytes from 10.0.180.12: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 10.0.180.12: icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from 10.0.180.12: icmp_seq=3 ttl=64 time=0.035 ms
^C
--- 10.0.180.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2028ms
rtt min/avg/max/mdev = 0.035/0.035/0.036/0.004 ms
$ _

Ας εκτελέσουμε μια εντολή μέσα στον περιέκτη!

$ lxc exec mycontainer -- uname -a
Linux mycontainer 4.8.0-53-generic #56~16.04.1-Ubuntu SMP Tue May 16 01:18:56 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ _

Εδώ χρησιμοποιήσαμε το ρήμα exec, που δέχεται ως παράμετρο το όνομα του περιέκτη, και μετά την εντολή που θα τρέξει μέσα στον περιέκτη. Αυτό το αποτελεί αναγνωριστικό για το φλοιό μας ώστε να σταματήσει να ψάχνει για παραμέτρους. Αν δεν βάζαμε το –, τότε ο φλοιός bash θα θεωρούσε ότι το -a είναι μια παράμετρος για την εντολή lxc και θα υπήρχε πρόβλημα.

Βλέπουμε ότι οι περιέκτες τρέχουν τον πυρήνα του συστήματός μας. Όταν εκκινούμε έναν περιέκτη, ξεκινά η εκτέλεση του λογισμικού χρήστη (user-space) μιας εικόνας διανομής. Δεν ξεκινά η εκτέλεση ενός νέου πυρήνα, με αποτέλεσμα να μοιράζονται όλοι οι περιέκτες τον ίδιο πυρήνα, ακόμα και αν ανήκουν σε διαφορετικές διανομές.

Ας δημιουργήσουμε έναν φλοιό στον περιέκτη ώστε να τρέξουμε περισσότερες εντολές!

$ lxc exec mycontainer -- /bin/bash
root@mycontainer:~# exit
$

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

Οι εικόνες Ubuntu έρχονται με ένα απλό λογαριασμό με όνομα ubuntu, οπότε μπορούμε να συνδεόμαστε και με το λογαριασμό αυτό. Να πως,

$ lxc exec mycontainer -- sudo --user ubuntu --login
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@mycontainer:~$ exit
$

Αυτό που κάναμε, ήταν να τρέξουμε την εντολή sudo ώστε να γίνουμε χρήστης ubuntu, και να λάβουμε έναν φλοιό εισόδου (login).

Πως εγκαθιστούμε μια υπηρεσία δικτύου σε ένα περιέκτη LXD

Ας εγκαταστήσουμε έναν εξυπηρετητή Web στον περιέκτη.

$ lxc exec mycontainer -- sudo --user ubuntu --login
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@mycontainer:~$ sudo apt update
...ubuntu@mycontainer:~$ sudo apt install nginx
...ubuntu@mycontainer:~$ sudo lsof -i
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient  231     root    6u  IPv4 141913      0t0  UDP *:bootpc 
sshd      323     root    3u  IPv4 142683      0t0  TCP *:ssh (LISTEN)
sshd      323     root    4u  IPv6 142692      0t0  TCP *:ssh (LISTEN)
nginx    1183     root    6u  IPv4 151536      0t0  TCP *:http (LISTEN)
nginx    1183     root    7u  IPv6 151537      0t0  TCP *:http (LISTEN)
nginx    1184 www-data    6u  IPv4 151536      0t0  TCP *:http (LISTEN)
nginx    1184 www-data    7u  IPv6 151537      0t0  TCP *:http (LISTEN)
nginx    1185 www-data    6u  IPv4 151536      0t0  TCP *:http (LISTEN)
nginx    1185 www-data    7u  IPv6 151537      0t0  TCP *:http (LISTEN)
nginx    1186 www-data    6u  IPv4 151536      0t0  TCP *:http (LISTEN)
nginx    1186 www-data    7u  IPv6 151537      0t0  TCP *:http (LISTEN)
nginx    1187 www-data    6u  IPv4 151536      0t0  TCP *:http (LISTEN)
nginx    1187 www-data    7u  IPv6 151537      0t0  TCP *:http (LISTEN)
ubuntu@mycontainer:~$

Ενημερώσαμε τη λίστα πακέτων μέσα στον περιέκτη και εγκαταστήσαμε το πακέτο nginx (άλλη επιλογή: apache2). Μετά τρέξαμε την εντολή lsof -i ώστε να επιβεβαιώσουμε ότι η υπηρεσία είναι σε λειτουργία.

Βλέπουμε ότι τρέχει από προεπιλογή ο sshd. Ωστόσο χρειάζεται να βάλουμε οι ίδιοι τιμές στο ~/.ssh/authorized_keys ώστε να μπορέσουμε να συνδεθούμε. Οι λογαριασμοί root και ubuntu είναι κλειδωμένοι από προεπιλογή.

Βλέπουμε ακόμα ότι είναι σε λειτουργία και ο εξυπηρετητής Web nginx.

Και πράγματι, είναι προσβάσιμος από τον περιηγητή μας.

Εδώ κάνουμε ό,τι άλλους πειραματισμούς θέλουμε. Για πληρότητα, ας δούμε πως σταματάμε τον περιέκτη και τον σβήνουμε.

ubuntu@mycontainer:~$ exit
logout
$ lxc stop mycontainer
$ lxc delete mycontainer
$

Αυτό ήταν! Σταματήσαμε τον περιέκτη mycontainer και έπειτα τον σβήσαμε.

Πρακτικές χρήσεις περιεκτών LXD

Ας δούμε μερικές πρακτικές χρήσεις περιεκτών LXD,

  1. Θέλουμε στο φορητό μας να εγκαταστήσουμε μια υπηρεσία δικτύου αλλά δεν θέλουμε μετά να ξεμείνουν τα εγκατεστημένα πακέτα. Εγκαθιστούμε σε περιέκτη και μετά τον σταματάμε (ή σβήνουμε)
  2. Θέλουμε να δοκιμάσουμε μια παλιά εφαρμογή PHP που για κάποιο λόγο δεν τρέχει σε PHP7 (Ubuntu 16.04). Εγκαθιστούμε σε έναν περιέκτη το Ubuntu 14.04 («ubuntu:t»), οπότε θα έχει PHP 5.x.
  3. Θέλουμε να εγκαταστήσουμε μια εφαρμογή στο Wine αλλά ΔΕΝ ΘΕΛΟΥΜΕ να εγκατασταθούν όλα αυτά τα πακέτα που φέρνει το Wine. Εγκαθιστούμε το Wine σε περιέκτη LXD.
  4. Θέλουμε να εγκαταστήσουμε μια εφαρμογή γραφικού περιβάλλοντος με χρήση επιτάχυνσης υλικού για γραφικά, αλλά να μην μπλέξει με το σύστημά μας. Εγκαθιστούμε την εφαρμογή γραφικού περιβάλλοντος σε περιέκτη LXD.
  5. Έχουμε δύο λογαριασμούς Steam. Πως; Εγκαθιστούμε το Steam δύο φορές σε δύο περιέκτες.
  6. Θέλουμε να φιλοξενήσουμε πολλούς διαδικτυακούς τόπους στο VPS μας, και θέλουμε να υπάρχει διαχωρισμός μεταξύ τους. Εγκαθιστούμε κάθε δικτυακό τόπο σε ξεχωριστό περιέκτη.

Αν έχετε απορίες ή θέλετε υποστήριξη, ρωτήστε εδώ ή στις άλλες υπηρεσίες της κοινότητας Ubuntu Greece.

Leave a Reply

%d bloggers like this: