Czy kiedykolwiek eksperymentowałeś z kodem lub systemowymi narzędziami w systemie Linux w taki sposób, aby nie bać się o podstawowy system i nie zniszczyć wszystkiego w przypadku błędu kodu, który powinien działać z uprawnieniami root?
A co, jeśli trzeba przetestować lub uruchomić cały klaster różnych mikroserwisów na jednej maszynie? Sto lub nawet tysiąc?
Z wirtualnymi maszynami zarządzanymi przez hipernadzorcę można by to osiągnąć, ale jakim kosztem? Na przykład kontener w LXD oparty na dystrybucji Alpine Linux minimalnie zużywa 7.60MB RAM, a po uruchomieniu, partycja główna zajmuje 9.5MB! Co ty na to, Elon Musk? Polecam zapoznać się z podstawowymi możliwościami LXD — systemy kontenerów w Linuxie.
Po tym, jak ogólnie stało się jasne, czym są kontenery LXD, przejdźmy dalej i pomyślmy, co by było, gdyby istniała platforma-kombajn, w której można bezpiecznie uruchamiać kod dla hosta, generować wykresy, dynamicznie (interaktywnie) łączyć widgety interfejsu użytkownika z twoim kodem, uzupełniać kod tekstem z blackjackiem… formatowaniem? Coś jak interaktywny blog? Wow… Chcę! Chcę! 🙂
Zajrzyj pod załącznik, gdzie uruchomimy w kontenerze JupyterLab — następna generacja interfejsu użytkownika zamiast przestarzałego Jupyter Notebook, a także zainstalujemy takie moduły Pythona jak NumPy, Pandas, Matplotlib, IPyWidgets które pozwolą nam na wszystko, o czym mówiliśmy wcześniej i zapisać to wszystko w specjalnym pliku — notatniku IPython.

Nawigacja
- Plan startu na orbitę
- Instalacja i konfiguracja podstawowego systemu
- Instalacja podstawowego oprogramowania i konfiguracja systemu
- Instalacja i konfiguracja JupyterLab
- Udostępnianie danych z hostem
- Witaj, świecie!
- Rozszerzamy możliwości Pythona
- Testowanie modułów w JupyterLab
- Co jeszcze?
Plan startu na orbitę ^

Sporządźmy krótki plan działań, aby ułatwić sobie realizację powyższej schemy:
- Zainstalujemy i uruchomimy kontener oparty na dystrybucji Alpine Linux. Użyjemy tej dystrybucji, ponieważ jest ukierunkowana na minimalizm i zainstalujemy w niej tylko najpotrzebniejsze oprogramowanie, nic ponad to.
- Dodamy dodatkowy wirtualny dysk w kontenerze, któremu nadamy nazwę —
hostfsi zamontujemy do systemu plików. Ten dysk umożliwi korzystanie z plików na hoście z określonego katalogu wewnątrz kontenera. Dzięki temu dane będą niezależne od kontenera. W przypadku usunięcia kontenera, dane pozostaną na hoście. Schemat ten jest także przydatny do dzielenia danych między wieloma kontenerami bez użycia standardowych mechanizmów sieciowych dystrybucji kontenera. - Zainstalujemy Bash, sudo, niezbędne biblioteki, dodamy i skonfigurujemy użytkownika systemowego.
- Zainstalujemy Pythona, moduły i skompilujemy dla nich zależności binarne.
- Zainstalujemy i uruchomimy. JupyterLab, skonfigurujemy wygląd, zainstalujemy dla niego rozszerzenia.
W tym artykule rozpoczniemy od uruchomienia kontenera, nie będziemy omawiać instalacji i konfiguracji LXD, wszystko to można znaleźć w innym artykule — Podstawowe możliwości LXD — systemu kontenerów w Linuxie.
Instalacja i konfiguracja podstawowego systemu ^
Tworzymy kontener za pomocą polecenia, w którym wskazujemy obraz — alpine3, identyfikator kontenera — jupyterlab i, jeśli to konieczne, profile konfiguracji:
lxc init alpine3 jupyterlab --profile=default --profile=hddrootTutaj używam profilu konfiguracji hddroot , który wskazuje na utworzenie kontenera z partycją root na Pula pamięci masowej umiejscowioną na fizycznym dysku 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:
- noneDaje mi to możliwość eksperymentowania z kontenerami na dysku HDD, oszczędzając zasoby dysku SSD, który również jest w moim systemie 🙂, dla którego stworzyłem oddzielny profil konfiguracji. ssdroot.
Po utworzeniu kontenera znajduje się on w stanie STOPPED, dlatego musimy go uruchomić, uruchamiając w nim system init:
lxc start jupyterlabWyświetlimy listę kontenerów w LXD, używając klucza -c , który wskazuje, które ckolumny wyświetlić na ekranie:
lxc list -c ns4b
+------------+---------+-------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool |
+------------+---------+-------------------+--------------+Przy tworzeniu kontenera adres IP został wybrany losowo, ponieważ używaliśmy profilu konfiguracji default , który został wcześniej skonfigurowany w artykule. Podstawowe możliwości LXD — systemu kontenerów w Linuxie.
Zmienimy ten adres IP na bardziej zapamiętywalny, tworząc interfejs sieciowy na poziomie kontenera, a nie na poziomie profilu konfiguracji, jak to ma miejsce w bieżącej konfiguracji. Nie jest to konieczne, możesz to pominąć.
Tworzymy interfejs sieciowy eth0 który łączymy z przełącznikiem (mostem sieciowym) lxdbr0 w którym włączyliśmy NAT zgodnie z poprzednim artykułem i kontener będzie teraz miał dostęp do Internetu, a także interfejsowi przypisujemy statyczny adres IP — 10.0.5.5:
lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5Po dodaniu urządzenia, kontener należy zrestartować:
lxc restart jupyterlabSprawdzamy status kontenera:
lxc list -c ns4b
+------------+---------+------------------+--------------+
| NAZWA | STAN | IPV4 | PULPIT MAGAZYNOWY |
+------------+---------+------------------+--------------+
| jupyterlab | DZIAŁA | 10.0.5.5 (eth0) | hddpool |
+------------+---------+------------------+--------------+Instalacja podstawowego oprogramowania i konfiguracja systemu ^
Aby zarządzać naszym kontenerem, musimy zainstalować następujące oprogramowanie:
Pakiet
Opis
bash
GNU Bourne Again shell
bash-completion
Programowalne uzupełnianie dla powłoki bash
sudo
Daj niektórym użytkownikom możliwość uruchamiania niektórych poleceń jako root
shadow
Zestaw narzędzi do zarządzania hasłami i kontami z obsługą plików shadow i PAM
tzdata
Zasoby dla strefy czasowej i danych o czasie letnim
nano
Klon edytora Pico z ulepszeniami
Dodatkowo, możesz zainstalować obsługę systemu man-pages, instalując następujące pakiety — man man-pages mdocml-apropos less
lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nanoPrzeanalizujmy polecenia i opcje, które wykorzystaliśmy:
lxc— Wywołanie klienta LXDexec— Metoda klienta LXD, która uruchamia polecenie w kontenerzejupyterlab— Identyfikator kontenera--— Specjalny klucz, który wskazuje, aby nie interpretować dalszych kluczy jako kluczy dlalxci przekazać całą resztę linii jako jest do konteneraapk— Menedżer pakietów dystrybucji Alpine Linuxadd— Metoda menedżera pakietów, która instaluje wymienione pakiety po poleceniu
Następnie zainstalujemy strefę czasową w systemie Europe/Moscow:
lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtimePo zainstalowaniu strefy czasowej, pakiet tzdata w systemie jest już niepotrzebny, zajmie miejsce, więc go usuniemy:
lxc exec jupyterlab -- apk del tzdataSprawdzamy strefę czasową:
lxc exec jupyterlab -- date
Wed Apr 15 10:49:56 MSK 2020Aby nie tracić dużo czasu na konfigurację Bash dla nowych użytkowników w kontenerze, w następnych krokach skopiujemy gotowe pliki skel z systemu hosta. Pozwoli to na upiększenie Bash w kontenerze w trybie interaktywnym. Mój system hosta to Manjaro Linux, a kopiowane pliki to /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors zasadniczo nadają się do Alpine Linux i nie powodują krytycznych problemów, ale może być to inna dystrybucja i musisz samodzielnie poradzić sobie w przypadku błędu uruchamianego Bash w kontenerze.
Kopiujemy pliki skel do kontenera. Klucz --create-dirs utworzy niezbędne katalogi, jeśli nie istnieją:
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_colorsDla już istniejącego użytkownika root skopiujemy do jego katalogu domowego właśnie skopiowane do kontenera pliki 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_colorsW Alpine Linux dla użytkowników ustawia się powłokę systemową /bin/sh, zamienimy ją u root użytkownika na Bash:
lxc exec jupyterlab -- usermod --shell=/bin/bash rootAby root użytkownik nie miał hasła, musi ustawić hasło. Poniższa komenda wygeneruje i ustawi nowe losowe hasło, które zobaczysz na ekranie konsoli po jej wykonaniu:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "Nowe hasło: $PASSWD""
Nowe hasło: sFiXEvBswuWAUtworzymy także nowego użytkownika systemowego — jupyter dla którego później skonfigurujemy JupyterLab:
lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyterWygenerujemy i ustawimy mu hasło:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "Nowe hasło: $PASSWD""
Nowe hasło: ZIcbzWrF8tkiNastępnie wykonamy dwie komendy, pierwsza utworzy grupę systemową sudo, a druga doda do niej użytkownika jupyter:
lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyterSprawdźmy, do jakich grup należy użytkownik jupyter:
lxc exec jupyterlab -- id -Gn jupyter
jupyter sudoWszystko — w porządku, przechodzimy dalej.
Pozwólmy wszystkim użytkownikom, którzy należą do grupy sudo korzystać z polecenia sudo. W tym celu wykonaj następujący skrypt, który sed odkomentuje linię parametru w pliku konfiguracyjnym /etc/sudoers:
lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"Instalacja i konfiguracja JupyterLab ^
JupyterLab — to aplikacja Python, dlatego najpierw musimy zainstalować ten interpreter. Ponadto, JupyterLab będziemy instalować za pomocą menedżera pakietów Pythona, pip, a nie systemowego, ponieważ w systemowym repozytorium może być przestarzały, dlatego musimy ręcznie zezwolić na jego zależności, instalując następujące pakiety — python3 python3-dev gcc libc-dev zeromq-dev:
lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-devZaktualizujemy moduły Pythona i menedżera pakietów pip do najnowszej wersji:
lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheelInstalujemy JupyterLab przez menedżera pakietów pip:
lxc exec jupyterlab -- python3 -m pip install jupyterlabPonieważ rozszerzenia w JupyterLab są eksperymentalne i nie są dostarczane razem z pakietem jupyterlab, musimy zainstalować i skonfigurować je ręcznie.
Zainstalujemy NodeJS i menedżera pakietów dla niego — NPM, ponieważ JupyterLab używa ich do swoich rozszerzeń:
lxc exec jupyterlab -- apk add nodejs npmAby zainstalowane rozszerzenia dla JupyterLab działały, muszą być instalowane w katalogu użytkownika, ponieważ aplikacja będzie uruchamiana z uprawnieniami użytkownika jupyter. Problem polega na tym, że nie ma parametru w poleceniu uruchomienia, którego można by użyć do przekazania katalogu, aplikacja przyjmuje tylko zmienną środowiskową, dlatego musimy ją zdefiniować. W tym celu napiszemy polecenie eksportu zmiennej JUPYTERLAB_DIR w środowisku użytkownika jupyter, w pliku .bashrc, który jest wykonywany za każdym razem, gdy użytkownik loguje się do systemu:
lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"Następnym poleceniem zainstalujemy specjalne rozszerzenie — menedżera rozszerzeń w JupyterLab:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"Teraz wszystko jest gotowe do pierwszego uruchomienia JupyterLab, ale możemy jeszcze zainstalować kilka przydatnych rozszerzeń:
toc— Spis Treści, generuje listę nagłówków w artykule/notatnikujupyterlab-horizon-theme— Temat UIjupyterlab_neon_theme— Temat UIjupyterlab-ubu-theme— Jeszcze jeden temat od autora tego artykułu 🙂 Ale w tym przypadku instalacja będzie pokazana z repozytorium GitHub
Więc, wykonaj kolejno następujące polecenia, aby zainstalować te rozszerzenia:
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"Po zainstalowaniu rozszerzeń musimy je skompilować, ponieważ wcześniej przy instalacji podano klucz --no-build aby zaoszczędzić czas. Teraz znacznie przyspieszymy, kompilując je razem za jednym razem:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"Teraz wykonaj następujące dwa polecenia dla pierwszego uruchomienia JupyterLab. Można by go uruchomić jednym poleceniem, ale w takim przypadku polecenie uruchomienia, które będziemy trzymać w pamięci, zostanie zapamiętane przez bash w kontenerze, a nie na hoście, gdzie i tak jest wystarczająco dużo poleceń do zapisania w historii 🙂
Logujemy się do kontenera jako użytkownik jupyter:
lxc exec jupyterlab -- su -l jupyterNastępnie uruchom JupyterLab z kluczami i parametrami, jak podano:
[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browserPrzejdź w przeglądarce internetowej pod adres http://10.0.5.5:8888 i na otwartej stronie wpisz token dostęp, który zobaczysz na konsoli. Skopiuj go i wklej na stronie, a następnie naciśnij Zaloguj się. Po zalogowaniu przejdź do menu rozszerzeń po lewej stronie, jak pokazano na poniższym obrazku, gdzie zostaniesz poproszony o zaakceptowanie ryzyka związanego z bezpieczeństwem przy aktywacji menedżera rozszerzeń instalując rozszerzenia od osób trzecich, za które zespół JupyterLab development nie ponosi odpowiedzialności:

Jednak właśnie w tym celu całkowicie izolujemy JupyterLab i umieszczamy go w kontenerze, aby zewnętrzne rozszerzenia wymagające i korzystające z NodeJS nie mogły przynajmniej ukraść danych na dysku poza tymi, które otworzymy wewnątrz kontenera. Dotarcie do twoich prywatnych dokumentów na hoście /home z procesów w kontenerze raczej się nie uda, a jeśli tak, to potrzebne są odpowiednie uprawnienia do plików w systemie hosta, ponieważ uruchamiamy kontener w trybie bez uprawnień. Na podstawie tych informacji możesz ocenić ryzyko związane z włączeniem rozszerzeń w JupyterLab.
Tworzone notatniki IPython (strony w JupyterLab) będą teraz tworzone w katalogu domowym użytkownika — /home/jupyter, ale mamy w planach podzielić dane (udostępnić) między hostem a kontenerem, dlatego wróć do konsoli i zatrzymaj JupyterLab używając skrótu — CTRL+C i odpowiadając y na zapytanie. Następnie zakończ interaktywną sesję użytkownika jupyter używając skrótu CTRL+D.
Udostępnianie danych z hostem ^
Aby podzielić dane z hostem, musisz stworzyć w kontenerze takie urządzenie, które to umożliwia, i aby to zrobić, wykonaj następujące polecenie, w którym wskazujemy następujące klucze:
lxc config device add— Polecenie dodaje konfigurację urządzeniajupyter— Identyfikator kontenera, do którego dodawana jest konfiguracjahostfs— Id urządzenia. Możesz nadać dowolną nazwę.dysk— Wskazuje typ urządzeniapath— Wskazuje ścieżkę w kontenerze, do którego LXD zamontuje to urządzeniesource— Wskazuje źródło, ścieżkę do katalogu na hoście, który chcesz podzielić z kontenerem. Podaj ścieżkę zgodnie z własnymi preferencjami
lxc config device add jupyterlab hostfs disk path=\/mnt\/hostfs source=\/home\/dv\/projects\/ipython-notebooksDla katalogu /home/dv/projects/ipython-notebooks musi być przypisane uprawnienie użytkownikowi kontenera, który obecnie ma UID równy SubUID + UID, zobacz rozdział Bezpieczeństwo. Uprawnienia kontenerów w artykule Podstawowe możliwości LXD — systemu kontenerów w Linuxie.
Przypisujemy uprawnienia na hoście, gdzie właścicielem będzie użytkownik kontenera jupyter, a zmienna $USER wskaże twojego użytkownika hosta jako grupę:
sudo chown 1001000:$USER \/home\/dv\/projects\/ipython-notebooksWitaj, świecie! ^
Jeśli wciąż masz otwartą sesję konsolową w kontenerze z JupyterLab, to zrestartuj ją z nowym kluczem --notebook-dir ustawiając wartość /mnt/hostfs jako ścieżkę do katalogu głównego notatników w kontenerze dla urządzenia, które utworzyliśmy w poprzednim kroku:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=\/mnt\/hostfsNastępnie przejdź do strony http://10.0.5.5:8888 i stwórz swój pierwszy notatnik, klikając przycisk na stronie, jak pokazano na poniższym obrazku:

Następnie w polu na stronie wpisz kod w języku Python, który wyświetli klasyczny Hello World!. Po zakończeniu wpisywania naciśnij CTRL+ENTER lub przycisk „play” na górnym pasku narzędzi, aby JupyterLab to wykonał:

Na tym prawie wszystko jest gotowe do użycia, ale będzie nudno, jeśli nie zainstalujemy dodatkowych modułów Pythona (pełnych aplikacji), które znacznie rozszerzają standardowe możliwości Pythona w JupyterLab, więc idziemy dalej 🙂
P.S. Ciekawe, że stara wersja Jupyter pod nazwą kodową Jupyter Notebook wcale nie zniknęła i istnieje równolegle z JupyterLab. Aby przejść do starej wersji, idź do linku, dodając do adresu sufiks/tree, a przejście do nowej wersji odbywa się z sufiksem /lab, ale nie trzeba go podawać:
- Jupyter Notebook — http://10.0.5.5:8888/tree
- Jupyter Lab — http://10.0.5.5:8888/lab
Rozszerzamy możliwości Pythona ^
W tej sekcji zainstalujemy potężne moduły języka Python, których wyniki będą integrowane w notatnikach NumPy, Pandas, Matplotlib, IPyWidgets Zanim zainstalujemy wymienione moduły Pythona przez menedżera pakietów JupyterLab.
musimy najpierw rozwiązać zależności systemowe w Alpine Linux: pip — Potrzebny do kompilacji modułów, ponieważ niektóre z nich są zrealizowane w języku
g++— Potrzebny do kompilacji modułów, ponieważ niektóre z nich są zrealizowane w języku C++ i łączą się z Pythonem w czasie wykonywania jako moduły binarnefreetype-dev— zależność dla modułu Pythona Matplotlib
Instalujemy zależności:
lxc exec jupyterlab -- apk add g++ freetype-devJest jeden problem, w obecnym stanie dystrybucji Alpine Linux nie uda się skompilować nowej wersji NumPy, wystąpi błąd kompilacji, którego nie udało mi się rozwiązać:
ERROR: Nie można zbudować kółek dla numpy, które używają PEP 517 i nie można ich zainstalować bezpośrednio
Dlatego ten moduł zainstalujemy jako pakiet systemowy, który dystrybuuje już skompilowaną wersję, ale nieco starszą niż ta dostępna obecnie na stronie:
lxc exec jupyterlab -- apk add py3-numpy py3-numpy-devNastępnie instalujemy moduły Pythona za pośrednictwem menedżera pakietów pip. Miej trochę cierpliwości, ponieważ niektóre moduły będą kompilowane i to zajmie kilka minut. Na mojej maszynie kompilacja zajęła około 15 minut:
lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlibCzyścimy pamięci podręczne instalacji:
lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*Testowanie modułów w JupyterLab ^
Jeśli masz uruchomiony JupyterLab, zrestartuj go, aby nowe zainstalowane moduły aktywowały się. W tym celu w sesji konsolowej naciśnij CTRL+C tam, gdzie jest uruchomiony i wpisz y na prośbę o zatrzymanie, a następnie uruchom ponownie JupyterLab naciskając strzałkę w górę na klawiaturze, aby nie wpisywać komendy ponownie, a potem Enter aby uruchomić:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=\/mnt\/hostfsPrzejdź na stronę http://10.0.5.5:8888/lab lub odśwież stronę w przeglądarce, a następnie wpisz następujący kod w nowej komórce notatnika:
%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_plotPowinieneś uzyskać wynik jak na poniższym obrazku, gdzie IPyWidgets generuje element UI na stronie, który działa interaktywnie z kodem źródłowym oraz Matplotlib wyświetla wynik kodu w postaci obrazu jak wykres funkcji:

Wiele przykładów IPyWidgets możesz znaleźć w samouczkach tutaj
Co jeszcze? ^
Jesteście świetni, jeśli zostaliście i dotarliście do samego końca artykułu. Specjalnie nie zamieściłem gotowego skryptu na końcu artykułu, który zainstalowałby JupyterLab w „jednym kliknięciu”, aby zachęcić pracowników 🙂 Ale możecie to zrobić sami, ponieważ już wiecie jak, zbierając komendy w jeden skrypt Bash 🙂
Możesz także:
- Nadać nazwę sieciową dla kontenera zamiast adresu IP, wpisując go w prostym
/etc/hostsi w przeglądarce wpisywać adres http://jupyter.local:8888 - Zabawa z ograniczeniem zasobów dla kontenera, w tym celu przeczytaj rozdział w podstawowych możliwościach LXD lub uzyskaj więcej informacji na stronie dewelopera LXD.
- Zmień motyw:

I wiele więcej możesz zrobić! To wszystko. Życzę powodzenia!
AKTUALIZACJA: 15.04.2020 18:30 — Poprawiłem błędy w rozdziale „Hello, World!”
AKTUALIZACJA: 16.04.2020 10:00 — Skorygowałem i dodałem tekst w opisie aktywacji menedżera rozszerzeń JupyterLab
AKTUALIZACJA: 16.04.2020 10:40 — Poprawiłem znalezione błędy w tekście i nieco poprawiłem rozdział „Instalacja podstawowego oprogramowania i konfiguracja systemu”
Źródło: habr.com
