Εκτόξευση του Jupyter σε τροχιά LXD

Χρειάστηκε ποτέ να πειραματιστείτε με κώδικα ή βοηθητικά προγράμματα συστήματος στο Linux, ώστε να μην ανησυχείτε για το βασικό σύστημα και να μην καταρρίψετε τα πάντα σε περίπτωση σφάλματος στον κώδικα που θα έπρεπε να εκτελείται με δικαιώματα root;

Τι γίνεται όμως με το γεγονός ότι ας υποθέσουμε ότι πρέπει να δοκιμάσετε ή να εκτελέσετε ένα ολόκληρο σύμπλεγμα από διάφορες μικροϋπηρεσίες σε ένα μηχάνημα; Εκατό ή και χίλια;

Με τις εικονικές μηχανές που διαχειρίζεται ένας hypervisor, τέτοια προβλήματα μπορούν και θα λυθούν, αλλά με ποιο κόστος; Για παράδειγμα, ένα κοντέινερ σε LXD που βασίζεται στη διανομή Alpine Linux καταναλώνει μόνο 7.60MB RAM και όπου καταλαμβάνει το ριζικό διαμέρισμα μετά την εκκίνηση 9.5MB! Πώς σου αρέσει αυτό, Έλον Μασκ; Συνιστώ να κάνετε check out βασικές δυνατότητες του LXD - ένα σύστημα κοντέινερ στο Linux

Αφού έγινε σαφές γενικά τι είναι τα κοντέινερ LXD, ας πάμε παρακάτω και ας σκεφτούμε, τι θα γινόταν αν υπήρχε μια τέτοια πλατφόρμα συγκομιδής όπου θα μπορούσατε να εκτελέσετε με ασφάλεια κώδικα για τον κεντρικό υπολογιστή, να δημιουργήσετε γραφήματα, να συνδέσετε δυναμικά (διαδραστικά) γραφικά στοιχεία διεπαφής χρήστη με τον κώδικά σας, συμπλήρωση του κώδικα με κείμενο με blackjack... μορφοποίηση; Κάποιο είδος διαδραστικού ιστολογίου; Ουάου... το θέλω! Θέλω! 🙂

Κοιτάξτε κάτω από τη γάτα όπου θα εκτοξευτούμε σε ένα δοχείο εργαστήριο jupyter - την επόμενη γενιά διεπαφής χρήστη αντί για το ξεπερασμένο Notebook Jupyter και θα εγκαταστήσουμε επίσης λειτουργικές μονάδες Python όπως μουδιασμένος, Πάντα, matplotlib, IPyWidgets που θα σας επιτρέψει να κάνετε όλα όσα αναφέρονται παραπάνω και να τα αποθηκεύσετε όλα σε ένα ειδικό αρχείο - έναν φορητό υπολογιστή IPython.

Εκτόξευση του Jupyter σε τροχιά LXD

Σχέδιο τροχιακής απογείωσης ^

Εκτόξευση του Jupyter σε τροχιά LXD

Ας περιγράψουμε ένα σύντομο σχέδιο δράσης για να μας διευκολύνει να εφαρμόσουμε το παραπάνω σχήμα:

  • Ας εγκαταστήσουμε και ξεκινήσουμε ένα κοντέινερ με βάση το κιτ διανομής Alpine Linux. Θα χρησιμοποιήσουμε αυτή τη διανομή γιατί στοχεύει στον μινιμαλισμό και θα εγκαταστήσουμε μόνο το πιο απαραίτητο λογισμικό σε αυτήν, τίποτα περιττό.
  • Ας προσθέσουμε έναν επιπλέον εικονικό δίσκο στο κοντέινερ και ας του δώσουμε ένα όνομα - hostfs και προσαρτήστε το στο ριζικό σύστημα αρχείων. Αυτός ο δίσκος θα καταστήσει δυνατή τη χρήση αρχείων στον κεντρικό υπολογιστή από έναν δεδομένο κατάλογο μέσα στο κοντέινερ. Έτσι, τα δεδομένα μας θα είναι ανεξάρτητα από το κοντέινερ. Εάν το κοντέινερ διαγραφεί, τα δεδομένα θα παραμείνουν στον κεντρικό υπολογιστή. Επίσης, αυτό το σχήμα είναι χρήσιμο για την κοινή χρήση των ίδιων δεδομένων μεταξύ πολλών κοντέινερ χωρίς τη χρήση των τυπικών μηχανισμών δικτύου της διανομής κοντέινερ.
  • Ας εγκαταστήσουμε το Bash, το sudo, τις απαραίτητες βιβλιοθήκες, να προσθέσουμε και να διαμορφώσουμε έναν χρήστη συστήματος
  • Ας εγκαταστήσουμε Python, modules και μεταγλωττίζουμε δυαδικές εξαρτήσεις για αυτά
  • Ας εγκαταστήσουμε και ξεκινήσουμε εργαστήριο jupyter, προσαρμόστε την εμφάνιση, εγκαταστήστε επεκτάσεις για αυτήν.

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

Εγκατάσταση και διαμόρφωση του βασικού συστήματος ^

Δημιουργούμε ένα κοντέινερ με την εντολή στην οποία καθορίζουμε την εικόνα - alpine3, αναγνωριστικό για το κοντέινερ - jupyterlab και, εάν χρειάζεται, προφίλ διαμόρφωσης:

lxc init alpine3 jupyterlab --profile=default --profile=hddroot

Εδώ χρησιμοποιώ ένα προφίλ διαμόρφωσης hddroot που καθορίζει τη δημιουργία ενός κοντέινερ με ριζικό διαμέρισμα μέσα πισίνα αποθήκευσης που βρίσκεται σε φυσικό δίσκο HDD:

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: hddpool
    type: disk
name: hddroot
used_by: []
lxc storage show hddpool

config:
  size: 10GB
  source: /dev/loop1
  volatile.initial_source: /dev/loop1
description: ""
name: hddpool
driver: btrfs
used_by:
- /1.0/images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
- /1.0/profiles/hddroot
status: Created
locations:
- none

Αυτό μου δίνει την ευκαιρία να πειραματιστώ με κοντέινερ στο δίσκο HDD, εξοικονομώντας τους πόρους του δίσκου SSD, ο οποίος είναι επίσης διαθέσιμος στο σύστημά μου 🙂 για τον οποίο έχω δημιουργήσει ένα ξεχωριστό προφίλ διαμόρφωσης ssdroot.

Αφού δημιουργηθεί το κοντέινερ, βρίσκεται σε κατάσταση STOPPED, οπότε πρέπει να το ξεκινήσουμε εκτελώντας το σύστημα init σε αυτό:

lxc start jupyterlab

Ας εμφανίσουμε μια λίστα κοντέινερ σε LXD χρησιμοποιώντας το κλειδί -c που υποδηλώνει ποια cΕμφάνιση στηλών:

lxc list -c ns4b
+------------+---------+-------------------+--------------+
|    NAME    |  STATE  |       IPV4        | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool      |
+------------+---------+-------------------+--------------+

Κατά τη δημιουργία του κοντέινερ, η διεύθυνση IP επιλέχθηκε τυχαία, καθώς χρησιμοποιήσαμε ένα προφίλ διαμόρφωσης default που είχε ρυθμιστεί προηγουμένως στο άρθρο Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux.

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

Δημιουργία διεπαφής δικτύου eth0 το οποίο συνδέουμε με το διακόπτη (γέφυρα δικτύου) lxdbr0 στο οποίο ενεργοποιήσαμε το NAT σύμφωνα με το προηγούμενο άρθρο και το κοντέινερ θα έχει πλέον πρόσβαση στο Διαδίκτυο και επίσης εκχωρούμε μια στατική διεύθυνση IP στη διεπαφή - 10.0.5.5:

lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

Μετά την προσθήκη μιας συσκευής, το κοντέινερ πρέπει να επανεκκινηθεί:

lxc restart jupyterlab

Έλεγχος της κατάστασης του κοντέινερ:

lxc list -c ns4b
+------------+---------+------------------+--------------+
|    NAME    |  STATE  |       IPV4       | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0)  | hddpool      |
+------------+---------+------------------+--------------+

Εγκατάσταση βασικού λογισμικού και ρύθμιση του συστήματος ^

Για τη διαχείριση του κοντέινερ μας, πρέπει να εγκαταστήσετε το ακόλουθο λογισμικό:

Πακέτο
Περιγραφή

βίαιο χτύπημα
Το κέλυφος GNU Bourne Again

bash-ολοκλήρωση
Προγραμματιζόμενη ολοκλήρωση για το κέλυφος bash

sudo
Δώστε σε ορισμένους χρήστες τη δυνατότητα να εκτελούν ορισμένες εντολές ως root

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

τζντατα
Πηγές για δεδομένα ζώνης ώρας και θερινής ώρας

nano
Κλώνος επεξεργασίας Pico με βελτιώσεις

Επιπλέον, μπορείτε να εγκαταστήσετε υποστήριξη στις σελίδες ανθρώπου του συστήματος εγκαθιστώντας τα ακόλουθα πακέτα − man man-pages mdocml-apropos less

lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nano

Ας δούμε τις εντολές και τα πλήκτρα που χρησιμοποιήσαμε:

  • lxc — Κλήση πελάτη LXD
  • exec - Μέθοδος πελάτη LXD που εκτελεί μια εντολή στο κοντέινερ
  • jupyterlab — Ταυτότητα κοντέινερ
  • -- - Ένα ειδικό κλειδί που καθορίζει να μην ερμηνεύονται άλλα κλειδιά ως κλειδιά για lxc και περάστε το υπόλοιπο κορδόνι όπως είναι στο δοχείο
  • apk — Διαχείριση πακέτων διανομής Alpine Linux
  • add — Μια μέθοδος διαχείρισης πακέτων που εγκαθιστά πακέτα που καθορίζονται μετά την εντολή

Στη συνέχεια, θα ορίσουμε μια ζώνη ώρας στο σύστημα Europe/Moscow:

lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Μετά την εγκατάσταση της ζώνης ώρας, το πακέτο tzdata δεν χρειάζεται πλέον στο σύστημα, θα πιάσει χώρο, οπότε ας το διαγράψουμε:

lxc exec jupyterlab -- apk del tzdata

Έλεγχος ζώνης ώρας:

lxc exec jupyterlab -- date

Wed Apr 15 10:49:56 MSK 2020

Για να μην ξοδέψετε πολύ χρόνο στη ρύθμιση του Bash για νέους χρήστες στο κοντέινερ, στα παρακάτω βήματα θα αντιγράψουμε έτοιμα αρχεία σκελετού από το κεντρικό σύστημα σε αυτό. Αυτό θα σας επιτρέψει να ομορφύνετε το Bash σε ένα κοντέινερ διαδραστικά. Το σύστημα υποδοχής μου είναι το Manjaro Linux και τα αρχεία αντιγράφονται /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors καταρχήν είναι κατάλληλα για Alpine Linux και δεν προκαλούν κρίσιμα προβλήματα, αλλά μπορεί να έχετε διαφορετική διανομή και πρέπει να καταλάβετε ανεξάρτητα εάν υπάρχει σφάλμα κατά την εκτέλεση του Bash στο κοντέινερ.

Αντιγράψτε τα αρχεία σκελετού στο κοντέινερ. Κλειδί --create-dirs θα δημιουργήσει τους απαραίτητους καταλόγους εάν δεν υπάρχουν:

lxc file push /etc/skel/.bash_profile jupyterlab/etc/skel/.bash_profile --create-dirs
lxc file push /etc/skel/.bashrc jupyterlab/etc/skel/.bashrc
lxc file push /etc/skel/.dir_colors jupyterlab/etc/skel/.dir_colors

Για έναν ήδη υπάρχοντα χρήστη root, αντιγράψτε τα αρχεία skel που μόλις αντιγράφηκαν στο κοντέινερ στον αρχικό κατάλογο:

lxc exec jupyterlab -- cp /etc/skel/.bash_profile /root/.bash_profile
lxc exec jupyterlab -- cp /etc/skel/.bashrc /root/.bashrc
lxc exec jupyterlab -- cp /etc/skel/.dir_colors /root/.dir_colors

Το Alpine Linux εγκαθιστά ένα κέλυφος συστήματος για τους χρήστες /bin/sh, θα το αντικαταστήσουμε με root χρήστης στο Bash:

lxc exec jupyterlab -- usermod --shell=/bin/bash root

Ότι root ο χρήστης δεν ήταν χωρίς κωδικό πρόσβασης, πρέπει να ορίσει έναν κωδικό πρόσβασης. Η ακόλουθη εντολή θα δημιουργήσει και θα ορίσει έναν νέο τυχαίο κωδικό πρόσβασης για αυτόν, τον οποίο θα δείτε στην οθόνη της κονσόλας μετά την εκτέλεσή του:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: sFiXEvBswuWA

Επίσης, ας δημιουργήσουμε έναν νέο χρήστη συστήματος - jupyter για το οποίο θα διαμορφώσουμε αργότερα εργαστήριο jupyter:

lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyter

Ας δημιουργήσουμε και ορίσουμε έναν κωδικό πρόσβασης για αυτό:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: ZIcbzWrF8tki

Στη συνέχεια, θα εκτελέσουμε δύο εντολές, η πρώτη θα δημιουργήσει μια ομάδα συστήματος sudo, και το δεύτερο θα προσθέσει έναν χρήστη σε αυτό jupyter:

lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyter

Ας δούμε σε ποιες ομάδες ανήκει ο χρήστης jupyter:

lxc exec jupyterlab -- id -Gn jupyter

jupyter sudo

Όλα είναι εντάξει, ας προχωρήσουμε.

Να επιτρέπεται σε όλους τους χρήστες που είναι μέλη της ομάδας sudo χρήση εντολής sudo. Για να το κάνετε αυτό, εκτελέστε το ακόλουθο σενάριο, όπου sed αποσχολιάζει τη γραμμή παραμέτρων στο αρχείο διαμόρφωσης /etc/sudoers:

lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"

Εγκατάσταση και ρύθμιση παραμέτρων του JupyterLab ^

εργαστήριο jupyter είναι μια εφαρμογή Python, επομένως πρέπει πρώτα να εγκαταστήσουμε αυτόν τον διερμηνέα. Επίσης, εργαστήριο jupyter θα εγκαταστήσουμε χρησιμοποιώντας τον διαχειριστή πακέτων Python pip, και όχι το σύστημα, επειδή μπορεί να είναι ξεπερασμένο στο αποθετήριο συστήματος και επομένως, πρέπει να επιλύσουμε με μη αυτόματο τρόπο τις εξαρτήσεις για αυτό εγκαθιστώντας τα ακόλουθα πακέτα − python3 python3-dev gcc libc-dev zeromq-dev:

lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-dev

Ας ενημερώσουμε τις λειτουργικές μονάδες python και τον διαχειριστή πακέτων pip στην τρέχουσα έκδοση:

lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheel

Σετ εργαστήριο jupyter μέσω του διαχειριστή πακέτων pip:

lxc exec jupyterlab -- python3 -m pip install jupyterlab

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

Ας εγκαταστήσουμε το NodeJS και τον διαχειριστή πακέτων για αυτό - NPM, από τότε εργαστήριο jupyter τα χρησιμοποιεί για τις επεκτάσεις του:

lxc exec jupyterlab -- apk add nodejs npm

Σε επεκτάσεις για εργαστήριο jupyter που θα εγκαταστήσουμε λειτούργησαν, πρέπει να εγκατασταθούν στον κατάλογο χρήστη αφού η εφαρμογή θα εκκινηθεί από τον χρήστη jupyter. Το πρόβλημα είναι ότι δεν υπάρχει παράμετρος στην εντολή εκκίνησης που να μπορεί να περάσει σε έναν κατάλογο· η εφαρμογή δέχεται μόνο μια μεταβλητή περιβάλλοντος και επομένως πρέπει να την ορίσουμε. Για να γίνει αυτό, θα γράψουμε την εντολή μεταβλητής εξαγωγής JUPYTERLAB_DIR στο περιβάλλον του χρήστη jupyter, να αρχειοθετήσω .bashrcπου εκτελείται κάθε φορά που ο χρήστης συνδέεται:

lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"

Η επόμενη εντολή θα εγκαταστήσει μια ειδική επέκταση - διαχειριστής επεκτάσεων εργαστήριο jupyter:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"

Τώρα όλα είναι έτοιμα για την πρώτη εκτόξευση εργαστήριο jupyter, αλλά μπορούμε ακόμα να εγκαταστήσουμε μερικές χρήσιμες επεκτάσεις:

  • toc — Πίνακας περιεχομένων, δημιουργεί μια λίστα επικεφαλίδων σε ένα άρθρο/σημειωματάριο
  • jupyterlab-horizon-theme — Θέμα διεπαφής χρήστη
  • jupyterlab_neon_theme — Θέμα διεπαφής χρήστη
  • jupyterlab-ubu-theme - Αλλο ένα θέμα από τον συγγραφέα αυτό το άρθρο :) Αλλά σε αυτήν την περίπτωση, θα εμφανιστεί η εγκατάσταση από το αποθετήριο GitHub

Επομένως, εκτελέστε τις ακόλουθες εντολές διαδοχικά για να εγκαταστήσετε αυτές τις επεκτάσεις:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyterlab/toc @mohirio/jupyterlab-horizon-theme @yeebc/jupyterlab_neon_theme"
lxc exec jupyterlab -- su -l jupyter -c "wget -c https://github.com/microcoder/jupyterlab-ubu-theme/archive/master.zip"
lxc exec jupyterlab -- su -l jupyter -c "unzip -q master.zip && rm master.zip"
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build jupyterlab-ubu-theme-master"
lxc exec jupyterlab -- su -l jupyter -c "rm -r jupyterlab-ubu-theme-master"

Αφού εγκαταστήσουμε τις επεκτάσεις, πρέπει να τις μεταγλωττίσουμε, αφού προηγουμένως, κατά την εγκατάσταση, καθορίσαμε το κλειδί --no-build για να εξοικονομήσετε χρόνο. Τώρα θα επιταχύνουμε σημαντικά συγκεντρώνοντάς τα μαζί με μία κίνηση:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"

Τώρα εκτελέστε τις ακόλουθες δύο εντολές για να το εκτελέσετε για πρώτη φορά εργαστήριο jupyter. Θα ήταν δυνατό να το εκκινήσετε με μία εντολή, αλλά σε αυτήν την περίπτωση, η εντολή εκκίνησης, που είναι δύσκολο να τη θυμάστε στο μυαλό σας, θα τη θυμάστε από το bash στο κοντέινερ και όχι στον κεντρικό υπολογιστή, όπου υπάρχουν ήδη αρκετές εντολές να τα καταγράψω στην ιστορία :)

Συνδεθείτε στο κοντέινερ ως χρήστης jupyter:

lxc exec jupyterlab -- su -l jupyter

Στη συνέχεια, τρέξτε εργαστήριο jupyter με πλήκτρα και παραμέτρους όπως υποδεικνύονται:

[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browser

Μεταβείτε στη διεύθυνση στο πρόγραμμα περιήγησής σας http://10.0.5.5:8888 και στη σελίδα που ανοίγει εισάγετε ένδειξη πρόσβαση που θα δείτε στην κονσόλα. Αντιγράψτε και επικολλήστε το στη σελίδα και μετά κάντε κλικ Είσοδος. Αφού συνδεθείτε, μεταβείτε στο μενού επεκτάσεων στα αριστερά, όπως φαίνεται στην παρακάτω εικόνα, όπου θα σας ζητηθεί, κατά την ενεργοποίηση του διαχειριστή επεκτάσεων, να αναλάβετε κινδύνους για την ασφάλεια εγκαθιστώντας επεκτάσεις από τρίτα μέρη για τις οποίες η εντολή Ανάπτυξη JupyterLab δεν ευθύνεται:

Εκτόξευση του Jupyter σε τροχιά LXD

Ωστόσο, απομονώνουμε το σύνολο εργαστήριο jupyter και τοποθετήστε το σε ένα κοντέινερ, ώστε οι επεκτάσεις τρίτων που απαιτούν και χρησιμοποιούν το NodeJS να μην μπορούν τουλάχιστον να υποκλέψουν δεδομένα στο δίσκο εκτός από αυτά που ανοίγουμε μέσα στο κοντέινερ. Μεταβείτε στα προσωπικά σας έγγραφα στον κεντρικό υπολογιστή /home οι διεργασίες από το κοντέινερ είναι απίθανο να επιτύχουν, και αν επιτύχουν, τότε θα πρέπει να έχετε δικαιώματα σε αρχεία στο κεντρικό σύστημα, καθώς εκτελούμε το κοντέινερ σε μη προνομιούχος λειτουργία. Με βάση αυτές τις πληροφορίες, μπορείτε να αξιολογήσετε τον κίνδυνο συμπερίληψης επεκτάσεων εργαστήριο jupyter.

Δημιούργησε σημειωματάρια IPython (σελίδες σε εργαστήριο jupyter) θα δημιουργηθεί τώρα στον αρχικό κατάλογο του χρήστη - /home/jupyter, αλλά τα σχέδιά μας είναι να χωρίσουμε τα δεδομένα (κοινή χρήση) μεταξύ του κεντρικού υπολογιστή και του κοντέινερ, επομένως επιστρέψτε στην κονσόλα και σταματήστε εργαστήριο jupyter με την εκτέλεση του πλήκτρου πρόσβασης - CTRL+C και απαντώντας y κατόπιν αιτήσεως. Στη συνέχεια, τερματίστε τη διαδραστική περίοδο λειτουργίας του χρήστη jupyter ολοκλήρωση ενός πλήκτρου πρόσβασης CTRL+D.

Κοινή χρήση δεδομένων με τον κεντρικό υπολογιστή ^

Για να μοιραστείτε δεδομένα με τον κεντρικό υπολογιστή, πρέπει να δημιουργήσετε μια συσκευή στο κοντέινερ που σας επιτρέπει να το κάνετε αυτό και για να το κάνετε αυτό, εκτελέστε την ακόλουθη εντολή όπου καθορίζουμε τα ακόλουθα κλειδιά:

  • lxc config device add — Η εντολή προσθέτει τη διαμόρφωση της συσκευής
  • jupyter — ID του κοντέινερ στο οποίο προστίθεται η διαμόρφωση
  • hostfs — Αναγνωριστικό συσκευής. Μπορείτε να ορίσετε οποιοδήποτε όνομα.
  • disk — Υποδεικνύεται ο τύπος της συσκευής
  • path — Καθορίζει τη διαδρομή στο κοντέινερ στο οποίο η LXD θα τοποθετήσει αυτήν τη συσκευή
  • source — Καθορίστε την πηγή, τη διαδρομή προς τον κατάλογο στον κεντρικό υπολογιστή που θέλετε να μοιραστείτε με το κοντέινερ. Καθορίστε τη διαδρομή σύμφωνα με τις προτιμήσεις σας
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooks

Για τον κατάλογο /home/dv/projects/ipython-notebooks Η άδεια πρέπει να οριστεί στον χρήστη κοντέινερ που έχει αυτήν τη στιγμή ένα UID ίσο με SubUID + UID, βλέπε κεφάλαιο Ασφάλεια. Προνόμια κοντέινερ στο άρθρο Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux.

Ορίστε την άδεια στον κεντρικό υπολογιστή, όπου ο κάτοχος θα είναι ο χρήστης του κοντέινερ jupyterκαι η μεταβλητή $USER θα καθορίσει τον οικοδεσπότη σας ως ομάδα:

sudo chown 1001000:$USER /home/dv/projects/ipython-notebooks

Γειά σου Κόσμε! ^

Εάν εξακολουθείτε να έχετε μια περίοδο λειτουργίας κονσόλας ανοιχτή στο κοντέινερ με εργαστήριο jupyter, στη συνέχεια επανεκκινήστε το με ένα νέο κλειδί --notebook-dir ορίζοντας την τιμή /mnt/hostfs ως τη διαδρομή προς τη ρίζα των φορητών υπολογιστών στο κοντέινερ για τη συσκευή που δημιουργήσαμε στο προηγούμενο βήμα:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

Στη συνέχεια, μεταβείτε στη σελίδα http://10.0.5.5:8888 και δημιουργήστε τον πρώτο σας φορητό υπολογιστή κάνοντας κλικ στο κουμπί στη σελίδα όπως φαίνεται στην παρακάτω εικόνα:

Εκτόξευση του Jupyter σε τροχιά LXD

Στη συνέχεια, στο πεδίο της σελίδας, πληκτρολογήστε τον κώδικα Python που θα εμφανίσει το κλασικό Hello World!. Όταν ολοκληρώσετε την είσοδο, πατήστε CTRL+ENTER ή το κουμπί "play" στη γραμμή εργαλείων στο επάνω μέρος για να κάνει το JupyterLab αυτό:

Εκτόξευση του Jupyter σε τροχιά LXD

Σε αυτό το σημείο, σχεδόν τα πάντα είναι έτοιμα για χρήση, αλλά δεν θα είναι ενδιαφέρον αν δεν εγκαταστήσουμε πρόσθετες λειτουργικές μονάδες Python (πλήρεις εφαρμογές) που μπορούν να επεκτείνουν σημαντικά τις τυπικές δυνατότητες της Python στο εργαστήριο jupyter, λοιπόν, ας προχωρήσουμε :)

Υ.Γ Το ενδιαφέρον είναι ότι η παλιά υλοποίηση jupyter με κωδικό όνομα Jupyter Notebook δεν έχει φύγει και υπάρχει παράλληλα με εργαστήριο jupyter. Για να μεταβείτε στην παλιά έκδοση, ακολουθήστε τον σύνδεσμο προσθέτοντας το επίθημα στη διεύθυνση/tree, και η μετάβαση σε μια νέα έκδοση πραγματοποιείται με το επίθημα /lab, αλλά δεν χρειάζεται να προσδιορίζεται:

Επέκταση των δυνατοτήτων της Python ^

Σε αυτήν την ενότητα, θα εγκαταστήσουμε τόσο ισχυρές ενότητες γλώσσας Python όπως μουδιασμένος, Πάντα, matplotlib, IPyWidgets τα αποτελέσματα των οποίων ενσωματώνονται σε φορητούς υπολογιστές εργαστήριο jupyter.

Πριν εγκαταστήσετε τις αναφερόμενες λειτουργικές μονάδες Python μέσω του διαχειριστή πακέτων pip πρέπει πρώτα να επιλύσουμε τις εξαρτήσεις συστήματος στο Alpine Linux:

  • g++ — Απαιτείται για τη μεταγλώττιση ενοτήτων, καθώς ορισμένες από αυτές υλοποιούνται στη γλώσσα C + + και συνδεθείτε στην Python κατά το χρόνο εκτέλεσης ως δυαδικές μονάδες
  • freetype-dev - εξάρτηση για την ενότητα Python matplotlib

Εγκατάσταση εξαρτήσεων:

lxc exec jupyterlab -- apk add g++ freetype-dev

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

ΣΦΑΛΜΑ: Δεν ήταν δυνατή η κατασκευή τροχών για Numpy που χρησιμοποιούν PEP 517 και δεν μπορούν να εγκατασταθούν απευθείας

Επομένως, θα εγκαταστήσουμε αυτήν την ενότητα ως ένα πακέτο συστήματος που διανέμει μια ήδη μεταγλωττισμένη έκδοση, αλλά λίγο παλαιότερη από αυτήν που είναι διαθέσιμη αυτήν τη στιγμή στον ιστότοπο:

lxc exec jupyterlab -- apk add py3-numpy py3-numpy-dev

Στη συνέχεια, εγκαταστήστε τις λειτουργικές μονάδες Python μέσω του διαχειριστή πακέτων pip. Να είστε υπομονετικοί καθώς ορισμένες ενότητες θα μεταγλωττιστούν και μπορεί να χρειαστούν μερικά λεπτά. Στο μηχάνημά μου, η μεταγλώττιση κράτησε ~15 λεπτά:

lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlib

Εκκαθάριση κρυφής μνήμης εγκατάστασης:

lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*

Δοκιμές ενοτήτων στο JupyterLab ^

Αν τρέχετε εργαστήριο jupyter, επανεκκινήστε το έτσι ώστε να ενεργοποιηθούν οι μονάδες που έχουν εγκατασταθεί πρόσφατα. Για να το κάνετε αυτό, σε μια περίοδο λειτουργίας κονσόλας, κάντε κλικ CTRL+C όπου το έχετε να τρέχει και μπείτε y για να σταματήσετε το αίτημα και μετά να ξεκινήσετε ξανά εργαστήριο jupyter πατώντας το επάνω βελάκι στο πληκτρολόγιο για να μην μπει ξανά η εντολή και μετά Enter για να το ξεκινήσετε:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

Μεταβείτε στη σελίδα http://10.0.5.5:8888/lab ή ανανεώστε τη σελίδα στο πρόγραμμα περιήγησής σας και, στη συνέχεια, εισαγάγετε τον ακόλουθο κώδικα σε ένα νέο κελί σημειωματάριου:

%matplotlib inline

from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np

def f(m, b):
    plt.figure(2)
    x = np.linspace(-10, 10, num=1000)
    plt.plot(x, m * x + b)
    plt.ylim(-5, 5)
    plt.show()

interactive_plot = interactive(f, m=(-2.0, 2.0), b=(-3, 3, 0.5))
output = interactive_plot.children[-1]
output.layout.height = '350px'
interactive_plot

Θα πρέπει να έχετε ένα αποτέλεσμα όπως στην παρακάτω εικόνα, όπου IPyWidgets δημιουργεί ένα στοιχείο διεπαφής χρήστη στη σελίδα που αλληλεπιδρά διαδραστικά με τον πηγαίο κώδικα και επίσης matplotlib εμφανίζει το αποτέλεσμα του κώδικα με τη μορφή εικόνας ως γράφημα συνάρτησης:

Εκτόξευση του Jupyter σε τροχιά LXD

Πολλά παραδείγματα IPyWidgets μπορείτε να το βρείτε σε σεμινάρια εδώ

Τι άλλο? ^

Μπράβο αν έμεινες και έφτασες στο τέλος του άρθρου. Δεν δημοσίευσα επίτηδες ένα έτοιμο σενάριο στο τέλος του άρθρου που θα εγκατασταθεί εργαστήριο jupyter σε "ένα κλικ" για να ενθαρρύνετε τους εργαζόμενους :) Αλλά μπορείτε να το κάνετε μόνοι σας, αφού ξέρετε ήδη πώς, έχοντας συγκεντρώσει τις εντολές σε ένα σενάριο Bash :)

Μπορείτε επίσης να:

  • Ορίστε ένα όνομα δικτύου για το κοντέινερ αντί για μια διεύθυνση IP γράφοντάς το σε ένα απλό /etc/hosts και πληκτρολογήστε τη διεύθυνση στο πρόγραμμα περιήγησης http://jupyter.local:8888
  • Παίξτε γύρω με το όριο πόρων για το κοντέινερ, για αυτό διαβάστε το κεφάλαιο βασικές δυνατότητες LXD ή λάβετε περισσότερες πληροφορίες στον ιστότοπο προγραμματιστών LXD.
  • Αλλάξτε το θέμα:

Εκτόξευση του Jupyter σε τροχιά LXD

Και πολλά περισσότερα μπορείτε να κάνετε! Αυτό είναι όλο. Σου εύχομαι επιτυχία!

ΕΝΗΜΕΡΩΣΗ: 15.04.2020/18/30 XNUMX:XNUMX - Διορθώθηκαν τα λάθη στο κεφάλαιο "Γεια, Κόσμε!"
ΕΝΗΜΕΡΩΣΗ: 16.04.2020/10/00 XNUMX:XNUMX — Διορθώθηκε και προστέθηκε κείμενο στην περιγραφή της ενεργοποίησης του διαχειριστή επέκτασης εργαστήριο jupyter
ΕΝΗΜΕΡΩΣΗ: 16.04.2020/10/40 XNUMX:XNUMX — Διορθώθηκαν τα σφάλματα που βρέθηκαν στο κείμενο και άλλαξαν ελαφρώς προς το καλύτερο το κεφάλαιο «Εγκατάσταση βασικού λογισμικού και ρύθμιση του συστήματος»

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο