Jeste li ikada eksperimentirali s kodom ili sistemskim alatima u Linuxu na način da ne brinete za osnovni sistem i ne uništite sve u slučaju greške kod koji bi trebao biti pokrenut s root privilegijama?
A šta ako treba testirati ili pokrenuti čitav klaster raznih mikroservisa na jednoj mašini? Stotinu ili čak tisuću?
S virtualnim mašinama upravljanim hipervizorom, takve zadatke možda biste mogli riješiti, ali po kojoj cijeni? Na primjer, kontejner u LXD temeljen na distribuciji Alpine Linux minimalno troši samo 7.60MB RAM-a, a gdje korijenski dio nakon pokretanja zauzima 9.5MB! Šta misliš o tome, Ilone Muske? Preporučujem da se upoznaš s osnovnim mogućnostima LXD — sustav kontenjera u Linuxu.
Nakon što je generalno jasno što su LXD kontejneri, idemo dalje i razmislimo o tome, što ako bi postojala platforma kombinator koja bi omogućila sigurno pokretanje koda za domaćina, generiranje grafikona, dinamčke (interaktivne) poveznice UI-widgeta s vašim kodom, dodavanje teksta s blackjackom… formatiranjem? Nešto poput interaktivnog bloga? Vau… Želim! Želim! 🙂
Zavirite ispod gdje ćemo pokrenuti u kontejneru JupyterLab — sljedeća generacija korisničkog sučelja umjesto zastarjelog Jupyter Notebook-a, a također ćemo instalirati module Pythona kao NumPy, Pandas, Matplotlib, IPyWidgets koji će omogućiti izvođenje svega navedenog i spremanje svega u poseban fajl — IPython-bilježnici.

Navigacija
- Plan uzletanja u orbitu
- Instalacija i konfiguracija osnovnog sistema
- Instalacija osnovnog softvera i konfiguracija sistema
- Instalacija i konfiguracija JupyterLab-a
- Dijelimo podatke s domaćinom
- Hello, World!
- Proširujemo mogućnosti Pythona
- Testiranje modula u JupyterLab-u
- Šta još?
Plan uzletanja u orbitu ^

Nacrtajmo kratak plan akcije kako bismo lakše realizirali gornju shemu:
- Instalirati ćemo i pokrenuti kontejner temeljen na distribuciji Alpine Linux. Koristićemo ovu distribuciju jer je usmjerena na minimalizam i instalirat ćemo samo najpotrebniji softver, ništa suvišno.
- Dodati ćemo dodatni virtuelni disk u kontejneru kojem ćemo dati ime —
hostfsi montirat ćemo ga na korijenski FS. Ova disk će omogućiti korištenje datoteka na hostu iz određenog direktorija unutar kontejnera. Na taj način podaci će biti neovisni o kontejneru. U slučaju uklanjanja kontejnera, podaci će ostati na hostu. Ova shema je također korisna za dijeljenje podataka između više kontejnera bez korištenja standardnih mrežnih mehanizama distribucije kontejnera. - Instalirat ćemo Bash, sudo, potrebne biblioteke, dodati i konfigurirati sistemskog korisnika
- Instalirat ćemo Python, module i kompajlirati za njih binarne ovisnosti
- Instalirat ćemo i pokrenuti JupyterLab, konfigurirati izgled, instalirati ekstenzije za njega.
U ovom članku ćemo započeti s pokretanjem kontejnera, nećemo razmatrati instalaciju i konfiguraciju LXD, sve to možete pronaći u drugom članku — Osnovne mogućnosti LXD — sustava kontejnera u Linuxu.
Instalacija i konfiguracija osnovnog sistema ^
Stvaramo kontejner naredbom u kojoj navodimo sliku — alpine3, identifikator za kontejner — jupyterlab i po potrebi profile konfiguracije:
lxc init alpine3 jupyterlab --profile=default --profile=hddrootOvdje koristim profil konfiguracije hddroot koji odredjuje stvaranje kontejnera s root-proširenjem u Storage Pool smještenom na fizičkom HDD disku:
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:
- noneTo mi daje priliku da eksperimentiram s kontejnerima na HDD disku, štedeći resurse SSD diska koji također postoji u mom sustavu 🙂 za koji sam stvorio zaseban profil konfiguracije ssdroot.
Nakon stvaranja kontejnera, on se nalazi u stanju STOPPED, stoga ga trebamo pokrenuti pokretanjem init-sustava unutar njega:
lxc start jupyterlabIspisat ćemo popis kontejnera u LXD koristeći ključ -c koji određuje koje cstupce ispisati na ekran:
lxc list -c ns4b
+------------+---------+-------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool |
+------------+---------+-------------------+--------------+Prilikom stvaranja kontejnera, IP adresa je odabrana nasumično, jer smo koristili profil konfiguracije default koji je ranije konfiguriran u članku Osnovne mogućnosti LXD — sustava kontejnera u Linuxu.
Promijenit ćemo ovu IP adresu na lako pamtljivu, stvarajući mrežni sučelje na razini kontejnera, a ne na razini konfiguracijskog profila kao što je to sada u trenutnoj konfiguraciji. Nije obavezno to raditi, možete to preskočiti.
Stvaranje mrežnog sučelja eth0 koje povezuemo s preklopnikom (mrežnim mostom) lxdbr0 u kojem smo omogućili NAT prema prethodnom članku i kontejner će sada imati pristup internetu, a također dodjeljujemo statičku IP adresu sučelju — 10.0.5.5:
lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5Nakon dodavanja uređaja, kontejner je potrebno restartati:
lxc restart jupyterlabProvjera statusa kontejnera:
lxc list -c ns4b
+------------+---------+------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0) | hddpool |
+------------+---------+------------------+--------------+Instalacija osnovnog softvera i konfiguracija sistema ^
Za administraciju našeg kontejnera potrebno je instalirati sljedeći softver:
Paket
Opis
bash
GNU Bourne Again ljuska
bash-completion
Programabilno dovršavanje za bash ljusku
sudo
Dajte određenim korisnicima mogućnost pokretanja nekih naredbi kao root
shadow
Alat za upravljanje korisničkim računima i lozinkama s podrškom za shadow datoteke i PAM
tzdata
Izvori za podatke o vremenskim zonama i ljetnom računanju vremena
nano
Klonski uređivač Pico s poboljšanjima
Dodatno, možete instalirati podršku za sustav man-pages instaliranjem sljedećih paketa — man man-pages mdocml-apropos less
lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nanoRazložimo naredbe i opcije koje smo koristili:
lxc— Pozivanje LXD klijentaexec— Metoda LXD klijenta koja pokreće naredbu u kontejnerujupyterlab— Identifikator kontejnera--— Posebna opcija koja ukazuje na to da se daljnje opcije ne interpretiraju kao opcije zalxci proslijediti cijeli ostatak niza kao što jest u kontejnerapk— Paketni menadžer Alpine Linux distribucijeadd— Metoda paketnog menadžera koja instalira navedene pakete nakon naredbe
Dalje, postavit ćemo vremensku zonu u sustavu Europe/Moscow:
lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtimeNakon postavljanja vremenske zone, paket tzdata više nije potreban u sustavu, zauzimat će prostor, stoga ćemo ga ukloniti:
lxc exec jupyterlab -- apk del tzdataProvjera vremenske zone:
lxc exec jupyterlab -- date
Wed Apr 15 10:49:56 MSK 2020Da ne bismo trošili puno vremena na postavljanje Basha za nove korisnike unutar kontejnera, sljedećim koracima kopirat ćemo gotove skel-fajlove iz host-sustava. To će omogućiti da Bash postane interaktivan unutar kontejnera. Moj host-sustav je Manjaro Linux, a kopirani fajlovi /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors praktički odgovaraju Alpine Linuxu i ne prouzrokuju ozbiljne probleme, ali kod vas može biti drugačija distribucija i trebat ćete sami riješiti eventualne greške prilikom pokretanja Basha unutar kontejnera.
Kopiramo skel-fajlove u kontejner. Ključ --create-dirs stvorit će potrebne direktorije ako ne postoje:
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_colorsZa već postojećeg root-korisnika kopirat ćemo u njegovu domaću direktoriju upravo kopirane skel-fajlove u kontejner:
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_colorsU Alpine Linuxu za korisnike se postavlja sistemska ljuska /bin/sh, zamijenit ćemo je kod root korisnika s Bashom:
lxc exec jupyterlab -- usermod --shell=/bin/bash rootDa root korisnik ne bi bio bez lozinke, treba postaviti lozinku. Sljedeća komanda generirat će i postaviti novu slučajnu lozinku koju ćete vidjeti na ekranu konzole nakon njezinog izvršenja:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "Nova lozinka: $PASSWD""
Nova lozinka: sFiXEvBswuWATakođer, stvorit ćemo novog sistemskog korisnika — jupyter za kojeg ćemo kasnije postaviti JupyterLab:
lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyterGenerirat ćemo i postaviti mu lozinku:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "Nova lozinka: $PASSWD""
Nova lozinka: ZIcbzWrF8tkiSljedeće, izvest ćemo dvije komande, prva će stvoriti sistemsku grupu sudo, a druga će dodati korisnika u nju jupyter:
lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyterPogledajmo u koje grupe ulazi korisnik jupyter:
lxc exec jupyterlab -- id -Gn jupyter
jupyter sudoSve — u redu, idemo dalje.
Omogućit ćemo svim korisnicima koji su u grupi sudo da koriste komandu sudo. Za to izvršite sljedeći skript, gdje sed komentarizira liniju parametra u konfiguracijskoj datoteci /etc/sudoers:
lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"Instalacija i konfiguracija JupyterLab-a ^
JupyterLab — je to Python aplikacija, pa prvo moramo instalirati ovaj interpreter. Također, JupyterLab instalirat ćemo pomoću Python paketa menadžera pip, a ne sistemskog, jer u sistemskom repozitoriju može biti zastario, stoga moramo ručno riješiti zavisnosti instalacijom sljedećih paketa — python3 python3-dev gcc libc-dev zeromq-dev:
lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-devAžurirat ćemo Python module i paket menadžer pip na najnoviju verziju:
lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheelInstaliramo JupyterLab putem paketnog menadžera pip:
lxc exec jupyterlab -- python3 -m pip install jupyterlabKako su ekstenzije u JupyterLab eksperimentalne i nisu službeno isporučene s jupyterlab paketom, stoga ćemo ih morati instalirati i konfigurirati ručno.
Instalirat ćemo NodeJS i njegov paket menadžer — NPM, jer JupyterLab koristi ih za svoje ekstenzije:
lxc exec jupyterlab -- apk add nodejs npmDa bi ekstenzije za JupyterLab koje ćemo instalirati radile, treba ih instalirati u korisnički direktorij jer će aplikacija raditi pod korisnikom jupyter. Problem je u tome što ne postoji opcija u komandi za pokretanje kojom se može proći direktorij, aplikacija priznaje samo varijablu okruženja i stoga je moramo definirati. Za to ćemo unijeti komandu za izvoz varijable JUPYTERLAB_DIR u korisničkom okruženju jupyter, u datoteku .bashrc, koja se izvršava svaki put kada se korisnik prijavi:
lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"Sljedećom komandom instaliramo posebnu ekstenziju — menadžer ekstenzija u 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"Sada je sve spremno za prvo pokretanje JupyterLab, ali možemo još instalirati nekoliko korisnih ekstenzija:
toc— Način sadržaja, generira popis naslova u članku/notebookujupyterlab-horizon-theme— UI temajupyterlab_neon_theme— UI temajupyterlab-ubu-theme— Još jedna tema autora ovog članka 🙂 Ali u ovom slučaju, bit će prikazana instalacija iz GitHub repozitorija
Dakle, slijedite sljedeće komande kako biste instalirali ove ekstenzije:
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"Nakon instalacije ekstenzija moramo ih kompajlirati, jer smo ranije prilikom instalacije naveli ključ --no-build radi uštede vremena. Sada ćemo značajno ubrzati proces kompajliranjem svih odjednom:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"Sada izvršite sljedeće dvije komande za prvo pokretanje JupyterLab. Mogli bismo ga pokrenuti jednom komandom, ali u tom slučaju, komanda pokretanja koju umom pamtite, bit će pohranjena u bash-u unutar kontejnera, a ne na hostu, gdje već ima dovoljno komandi za pohranu u historiju 🙂
Prijavite se u kontejner kao korisnik jupyter:
lxc exec jupyterlab -- su -l jupyterZatim pokrenite JupyterLab s ključevima i parametrima kao što je naznačeno:
[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browserIdite u web preglednik na adresu http://10.0.5.5:8888 i na otvorenoj stranici unesite token pristupa koji ćete vidjeti u konzoli. Kopirajte ga i zalijepite na stranici, zatim kliknite Prijava. Nakon prijave, idite lijevo u meni ekstenzija, kao što je prikazano na slici ispod, gdje ćete biti zatraženi da, prilikom aktivacije menadžera ekstenzija, preuzmete rizike po pitanju sigurnosti instalirajući ekstenzije trećih strana za koje ekipa JupyterLab razvoj ne preuzima odgovornost:

Međutim, mi potpuno izoliramo JupyterLab i stavljamo ga u kontejner, kako bi treće strane ekstenzije koje zahtijevaju i koriste NodeJS ne mogle najmanje ukrasti podatke na disku osim onih koje otvorimo unutar kontejnera. Teško da će moći pristupiti vašim privatnim dokumentima na hostu iz /home kontejnerskih procesa, a ako i mogu, za to će trebati privilegije na datotekama u host sistemu, budući da pokrećemo kontejner u neprivilegiranom režimu. Na osnovu ovih informacija možete procijeniti rizik uključivanja ekstenzija u JupyterLab.
Stvoreni IPython bilježnici (stranice u JupyterLab) sada će se stvarati u domaćoj direktoriji korisnika — /home/jupyter, ali u našim planovima je da podijelimo podatke (dijelimo) između hosta i kontejnera, stoga se vratite u konzolu i zaustavite JupyterLab izvršavanjem prečaca — CTRL+C i odgovarajući y na zahtjev. Zatim prekinite interaktivnu sesiju korisnika jupyter izvršavanjem prečaca CTRL+D.
Dijelimo podatke s domaćinom ^
Da biste podijelili podatke s hostom, morate u kontejneru stvoriti takvu napravu koja to omogućava i za to izvršite sljedeću naredbu u kojoj navodimo sljedeće ključeve:
lxc config device add— Naredba dodaje konfiguraciju uređajajupyter— Identifikator kontejnera u koji se dodaje konfiguracijahostfs— Identifikator uređaja. Možete zadati bilo koje ime.disk— Navodi se tip uređajapath— Navodi se putanja u kontejneru na koju LXD montira ovaj uređajsource— Navodi se izvor, putanja do direktorija na hostu koji želite podijeliti s kontejnerom. Odredite putanju prema svojim željama
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooksZa direktorij /home/dv/projects/ipython-notebooks treba biti postavljena dozvola za korisnika kontejnera koji trenutno ima UID jednak SubUID + UID, pogledajte poglavlje Sigurnost. Privilegije kontejnera u članku Osnovne mogućnosti LXD — sustava kontejnera u Linuxu.
Postavimo dozvolu na hostu, gdje će vlasnik biti korisnik kontejnera jupyter, a varijabla $USER označava vašeg host korisnika kao grupu:
sudo chown 1001000:$USER /home/dv/projects/ipython-notebooksHello, World! ^
Ako još uvijek imate otvorenu konzolnu sesiju u kontejneru s JupyterLab, ponovno ju pokrenite s novim ključem --notebook-dir navodeći vrijednost /mnt/hostfs kao put do korijena bilježnica u kontejneru za uređaj koji smo stvorili u prethodnom koraku:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfsZatim idite na stranicu http://10.0.5.5:8888 i kreirajte svoju prvu bilježnicu klikom na gumb na stranici kao što je prikazano na slici ispod:

Zatim u polju na stranici unesite kod u Pythonu koji će ispisati klasičnu Hello World!. Nakon unosa pritisnite CTRL+ENTER ili gumb «play» na alatnoj traci iznad kako bi JupyterLab to izveo:

Gotovo je sve spremno za korištenje, ali neće biti zanimljivo ako ne instaliramo dodatne Python module (cjelovite aplikacije) koji omogućuju značajno proširivanje standardnih mogućnosti Pythona u JupyterLab, stoga idemo dalje 🙂
P.S. Zanimljivo je to da stara implementacija Jupyter pod kodnim nazivom Jupyter Notebook nije nestala i ona postoji paralelno s JupyterLab. Za pristup staroj verziji idite na link dodajući sufiks u adresu/tree, a prijelaz na novu verziju ostvaruje se s sufiksom /lab, ali nije obavezno navesti:
- Jupyter Notebook — http://10.0.5.5:8888/tree
- Jupyter Lab — http://10.0.5.5:8888/lab
Proširujemo mogućnosti Pythona ^
U ovom odjeljku ćemo instalirati moćne module programskog jezika Python kao što su NumPy, Pandas, Matplotlib, IPyWidgets čiji rezultati integriraju u bilježnice. JupyterLab.
Prije nego što instaliramo navedene Python module putem upravitelja paketa, pip najprije moramo riješiti sistemske ovisnosti u Alpine Linux-u:
g++— potreban za kompajliranje modula, budući da su neki od njih implementirani u jeziku C++ i povezuju se s Python-om u vrijeme izvođenja kao binarni moduli.freetype-dev— ovisnost za Python modul. Matplotlib
Instaliramo ovisnosti:
lxc exec jupyterlab -- apk add g++ freetype-devPostoji jedan problem, u trenutnom stanju distribucije Alpine Linux neće biti moguće kompajlirati novu verziju NumPy-a; doći će do greške pri kompajliranju koju nisam uspio riješiti:
GREŠKA: Nije moguće izraditi kotačiće za numpy koji koriste PEP 517 i ne mogu se izravno instalirati.
Zbog toga ćemo ovaj modul instalirati kao sistemski paket koji već distribuira prethodno kompajliranu verziju, ali nešto stariju od one koja je trenutno dostupna na web stranici:
lxc exec jupyterlab -- apk add py3-numpy py3-numpy-devNakon toga instaliramo Python module putem upravitelja paketa. pipBudite strpljivi, jer će se neki moduli kompajlirati i to će trajati nekoliko minuta. Na mojoj mašini kompajliranje je trajalo ~15 minuta:
lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlibOčistimo keš instalacija:
lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*Testiranje modula u JupyterLab-u ^
Ako imate pokrenuto JupyterLab, ponovno ga pokrenite kako bi novi instalirani moduli bili aktivirani. Za to u konzoli pritisnite CTRL+C tamo gdje je pokrenut i upišite y na zahtjev za zaustavljanje, a zatim ga ponovno pokrenite JupyterLab pritiskom na strelicu prema gore na tipkovnici kako ne biste morali ponovno unositi naredbu i zatim Enter da pokrenete:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfsIdite na stranicu http://10.0.5.5:8888/lab ili osvježite stranicu u pregledniku, a zatim upišite sljedeći kod u novu ćeliju bilježnice:
%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_plotTrebali biste dobiti rezultat kao na slici ispod, gdje IPyWidgets generira UI element na stranici koji interaktivno komunicira s izvorni kodom, a također Matplotlib izlaz rezultata koda u obliku slike kao graf funkcije:

Mnoga primjer IPyWidgets možete pronaći u tutorijalima. ovdje
Šta još? ^
Čestitamo vam što ste ostali i stigli do samog kraja članka. Namerno nisam dodao gotov skript na kraju članka koji bi instalirao JupyterLab s „jednim klikom“, da bih nagradio radne ljude 🙂 No, to možete učiniti sami, jer već znate kako, okupljajući komande u jedan Bash skript 🙂
Također, možete:
- Postaviti mrežno ime za kontejner umesto IP adrese tako što ćete ga upisati u običan
/etc/hostsi u pretraživaču ukucati adresu http://jupyter.local:8888 - Igrajte se s ograničenjem resursa za kontejner, za to pročitajte poglavlje u osnovnim mogućnostima LXD ili saznajte više informacija na sajtu developera LXD.
- Promenite temu dizajna:

I mnogo toga još možete! To je to. Želim vam puno uspeha!
UPDATE: 15.04.2020 18:30 — Ispravio sam greške u poglavlju 'Hello, World!'
UPDATE: 16.04.2020 10:00 — Ispravio i dodao tekst u opisu aktivacije menadžera ekstenzija JupyterLab
UPDATE: 16.04.2020 10:40 — Ispravio pronađene greške u tekstu i malo poboljšao poglavlje 'Instalacija osnovnog softvera i podešavanje sistema'
Izvor: habr.com
