ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ื”ืื ืื™ ืคืขื ื ืืœืฆืชื ืœื”ืชื ืกื•ืช ืขื ืงื•ื“ ืื• ื›ืœื™ ืขื–ืจ ืœืžืขืจื›ืช ื‘ืœื™ื ื•ืงืก ืžื‘ืœื™ ืœื“ืื•ื’ ืœืžืขืจื›ืช ื”ื‘ืกื™ืกื™ืช ื•ืœืงืจื•ืข ื”ื›ืœ ื‘ืžืงืจื” ืฉืœ ืฉื’ื™ืื” ื‘ืงื•ื“ ืฉืืžื•ืจ ืœืคืขื•ืœ ืขื ื”ืจืฉืื•ืช ืฉื•ืจืฉ?

ืื‘ืœ ืžื” ืœื’ื‘ื™ ื”ืขื•ื‘ื“ื” ืฉื ื ื™ื— ืฉืืชื” ืฆืจื™ืš ืœื‘ื“ื•ืง ืื• ืœื”ืคืขื™ืœ ืืฉื›ื•ืœ ืฉืœื ืฉืœ ืžื™ืงืจื•-ืฉื™ืจื•ืชื™ื ืฉื•ื ื™ื ื‘ืžื›ื•ื ื” ืื—ืช? ืžืื” ืื• ืืคื™ืœื• ืืœืฃ?

ืขื ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ืžื ื•ื”ืœื•ืช ืขืœ ื™ื“ื™ ื”ื™ืคืจื•ื•ื™ื–ืจ, ื‘ืขื™ื•ืช ื›ืืœื” ื™ื›ื•ืœื•ืช ื•ื™ื™ืคืชืจื•, ืื‘ืœ ื‘ืื™ื–ื” ืžื—ื™ืจ? ืœื“ื•ื’ืžื”, ืžื™ื›ืœ ื‘-LXD ื”ืžื‘ื•ืกืก ืขืœ ื”ื”ืคืฆื” ืฉืœ Alpine Linux ืฆื•ืจืš ื‘ืœื‘ื“ 7.60MB ื–ื™ื›ืจื•ืŸ RAM, ื•ื”ื™ื›ืŸ ืžื—ื™ืฆืช ื”ืฉื•ืจืฉ ืชื•ืคืกืช ืœืื—ืจ ื”ื”ืคืขืœื” 9.5MB! ืื™ืš ืืชื” ืื•ื”ื‘ ืืช ื–ื”, ืื™ืœื•ืŸ ืžืืกืง? ืื ื™ ืžืžืœื™ืฅ ืœื‘ื“ื•ืง ื™ื›ื•ืœื•ืช ื‘ืกื™ืกื™ื•ืช ืฉืœ LXD - ืžืขืจื›ืช ืงื•ื ื˜ื™ื™ื ืจ ื‘ืœื™ื ื•ืงืก

ืื—ืจื™ ืฉื”ืชื‘ืจืจ ื‘ืื•ืคืŸ ื›ืœืœื™ ืžื” ื–ื” ืžื›ื•ืœื•ืช LXD, ื‘ื•ืื• ื ืžืฉื™ืš ื•ื ื—ืฉื•ื‘, ืžื” ืื ื”ื™ื™ืชื” ืคืœื˜ืคื•ืจืžืช ืงืฆื™ืจ ื›ื–ื• ืฉื‘ื” ืชื•ื›ืœื• ืœื”ืจื™ืฅ ื‘ื‘ื˜ื—ื” ืงื•ื“ ืขื‘ื•ืจ ื”ืžืืจื—, ืœื™ืฆื•ืจ ื’ืจืคื™ื, ืœืงืฉืจ ื‘ืื•ืคืŸ ื“ื™ื ืžื™ (ืื™ื ื˜ืจืืงื˜ื™ื‘ื™) UI- widgets ืขื ื”ืงื•ื“ ืฉืœื›ื, ืœื”ืฉืœื™ื ืืช ื”ืงื•ื“ ื‘ื˜ืงืกื˜ ืขื ื‘ืœืืง ื’'ืง... ืขื™ืฆื•ื‘? ืื™ื–ื” ื‘ืœื•ื’ ืื™ื ื˜ืจืืงื˜ื™ื‘ื™? ื•ื•ืื•... ืื ื™ ืจื•ืฆื” ืืช ื–ื”! ืจื•ืฆื”! ๐Ÿ™‚

ืชืกืชื›ืœ ืžืชื—ืช ืœื—ืชื•ืœ ืื™ืคื” ื ืฉื™ืง ื‘ืžื™ื›ืœ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ - ื”ื“ื•ืจ ื”ื‘ื ืฉืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ ื‘ืžืงื•ื ื”-Jupyter Notebook ื”ืžื™ื•ืฉืŸ, ื•ืื ื—ื ื• ื ืชืงื™ืŸ ื’ื ืžื•ื“ื•ืœื™ื ืฉืœ Python ื›ื’ื•ืŸ ืจื“ื•ื, ืคื ื“ื•ืช, ืžื˜ืคืœื•ื˜ืœื™ื‘, IPyWidgets ืžื” ืฉื™ืืคืฉืจ ืœื›ื ืœืขืฉื•ืช ืืช ื›ืœ ืžื” ืฉืจืฉื•ื ืœืžืขืœื” ื•ืœืฉืžื•ืจ ื”ื›ืœ ื‘ืงื•ื‘ืฅ ืžื™ื•ื—ื“ - ืžื—ืฉื‘ ื ื™ื™ื“ IPython.

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ืชื•ื›ื ื™ืช ื”ืžืจืื” ืžืกืœื•ืœื™ืช ^

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ื‘ื•ืื• ื ืชืืจ ืชื•ื›ื ื™ืช ืคืขื•ืœื” ืงืฆืจื” ื›ื“ื™ ืœื”ืงืœ ืขืœื™ื ื• ืœื™ื™ืฉื ืืช ื”ืชื•ื›ื ื™ืช ืœืขื™ืœ:

  • ื‘ื•ืื• ืœื”ืชืงื™ืŸ ื•ืœื”ืฉื™ืง ืงื•ื ื˜ื™ื™ื ืจ ื”ืžื‘ื•ืกืก ืขืœ ืขืจื›ืช ื”ื”ืคืฆื” ืœื™ื ื•ืงืก ืืœืคื™ื ื™. ืื ื• ื ืฉืชืžืฉ ื‘ื”ืคืฆื” ื”ื–ื• ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืžื›ื•ื•ื ืช ืœืžื™ื ื™ืžืœื™ื–ื ื•ื ืชืงื™ืŸ ื‘ื” ืจืง ืืช ื”ืชื•ื›ื ื” ื”ื ื—ื•ืฆื” ื‘ื™ื•ืชืจ, ืฉื•ื ื“ื‘ืจ ืžื™ื•ืชืจ.
  • ื‘ื•ืื• ื ื•ืกื™ืฃ ื“ื™ืกืง ื•ื™ืจื˜ื•ืืœื™ ื ื•ืกืฃ ื‘ืงื•ื ื˜ื™ื™ื ืจ ื•ื ื™ืชืŸ ืœื• ืฉื - hostfs ื•ื”ืขืœื” ืื•ืชื• ืœืžืขืจื›ืช ืงื‘ืฆื™ ื”ืฉื•ืจืฉ. ื“ื™ืกืง ื–ื” ื™ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืงื‘ืฆื™ื ืขืœ ื”ืžืืจื— ืžืกืคืจื™ื™ื” ื ืชื•ื ื” ื‘ืชื•ืš ื”ืงื•ื ื˜ื™ื™ื ืจ. ืœืคื™ื›ืš, ื”ื ืชื•ื ื™ื ืฉืœื ื• ื™ื”ื™ื• ื‘ืœืชื™ ืชืœื•ื™ื™ื ื‘ืžื™ื›ืœ. ืื ื”ืžื™ื›ืœ ื™ื™ืžื—ืง, ื”ื ืชื•ื ื™ื ื™ื™ืฉืืจื• ื‘ืžืืจื—. ื›ืžื• ื›ืŸ, ืกื›ื™ืžื” ื–ื• ืฉื™ืžื•ืฉื™ืช ืœืฉื™ืชื•ืฃ ื ืชื•ื ื™ื ื–ื”ื™ื ื‘ื™ืŸ ืงื•ื ื˜ื™ื™ื ืจื™ื ืจื‘ื™ื ืžื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘ืžื ื’ื ื•ื ื™ ื”ืจืฉืช ื”ืกื˜ื ื“ืจื˜ื™ื™ื ืฉืœ ื”ืคืฆืช ื”ืงื•ื ื˜ื™ื™ื ืจ.
  • ื‘ื•ืื• ื ืชืงื™ืŸ ืืช Bash, sudo, ืืช ื”ืกืคืจื™ื•ืช ื”ื“ืจื•ืฉื•ืช, ื ื•ืกื™ืฃ ื•ื ืงื‘ืข ืžืฉืชืžืฉ ืžืขืจื›ืช
  • ื‘ื•ืื• ื ืชืงื™ืŸ ืืช Python, ืžื•ื“ื•ืœื™ื ื•ื ืจื›ื™ื‘ ืขื‘ื•ืจื ืชืœื•ืช ื‘ื™ื ืืจื™ืช
  • ื‘ื•ืื• ื ืชืงื™ืŸ ื•ื ืคืขื™ืœ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ, ื”ืชืื ืื™ืฉื™ืช ืืช ื”ืžืจืื”, ื”ืชืงืŸ ืขื‘ื•ืจื• ื”ืจื—ื‘ื•ืช.

ื‘ืžืืžืจ ื–ื” ื ืชื—ื™ืœ ืขื ื”ืฉืงืช ื”ืงื•ื ื˜ื™ื™ื ืจ, ืœื ื ืฉืงื•ืœ ื”ืชืงื ื” ื•ื”ื’ื“ืจื” ืฉืœ LXD, ืืช ื›ืœ ื–ื” ืชื•ื›ืœื• ืœืžืฆื•ื ื‘ืžืืžืจ ืื—ืจ - ืชื›ื•ื ื•ืช ื‘ืกื™ืกื™ื•ืช ืฉืœ LXD - ืžืขืจื›ื•ืช ืžื™ื›ืœ ืœื™ื ื•ืงืก.

ื”ืชืงื ื” ื•ืชืฆื•ืจื” ืฉืœ ื”ืžืขืจื›ืช ื”ื‘ืกื™ืกื™ืช ^

ืื ื• ื™ื•ืฆืจื™ื ืžื™ื›ืœ ืขื ื”ืคืงื•ื“ื” ืฉื‘ื” ืื ื• ืžืฆื™ื™ื ื™ื ืืช ื”ืชืžื•ื ื” - 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 - ืžืขืจื›ื•ืช ืžื™ื›ืœ ืœื™ื ื•ืงืก.

ื ืฉื ื” ืืช ื›ืชื•ื‘ืช ื”-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

tzdata
ืžืงื•ืจื•ืช ืœื ืชื•ื ื™ ืื–ื•ืจ ื–ืžืŸ ื•ืฉืขื•ืŸ ืงื™ืฅ

ื ื ื•
ืฉื™ื‘ื•ื˜ ืขื•ืจืš 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 ืขื‘ื•ืจ ืžืฉืชืžืฉื™ื ื—ื“ืฉื™ื ื‘ืงื•ื ื˜ื™ื™ื ืจ, ื‘ืฉืœื‘ื™ื ื”ื‘ืื™ื ื ืขืชื™ืง ืืœื™ื• ืงื‘ืฆื™ skel ืžื•ื›ื ื™ื ืžื”ืžืขืจื›ืช ื”ืžืืจื—ืช. ื–ื” ื™ืืคืฉืจ ืœืš ืœื™ื™ืคื•ืช ืืช Bash ื‘ืžื™ื›ืœ ื‘ืื•ืคืŸ ืื™ื ื˜ืจืืงื˜ื™ื‘ื™. ื”ืžืขืจื›ืช ื”ืžืืจื—ืช ืฉืœื™ ื”ื™ื ืžื ื’'ืจื• ืœื™ื ื•ืงืก ื•ื”ืงื‘ืฆื™ื ื”ืžื•ืขืชืงื™ื /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

ืขื‘ื•ืจ ืžืฉืชืžืฉ ืฉื•ืจืฉ ืฉื›ื‘ืจ ืงื™ื™ื, ื”ืขืชืง ืืช ืงื‘ืฆื™ ื”ืกืงืœ ืฉื”ื•ืขืชืงื• ื–ื” ืขืชื” ืœืชื•ืš ื”ืžื™ื›ืœ ืœืกืคืจื™ื™ืช ื”ื‘ื™ืช:

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 ืขื‘ื•ืจื• ื ืชืงื™ืŸ ื‘ื”ืžืฉืš ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ:

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 ^

ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื”ื•ื ื™ื™ืฉื•ื Python, ืœื›ืŸ ืขืœื™ื ื• ืœื”ืชืงื™ืŸ ืชื—ื™ืœื” ืืช ื”ืžืชื•ืจื’ืžืŸ ื”ื–ื”. ื’ึทื, ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื ืชืงื™ืŸ ื‘ืืžืฆืขื•ืช ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช ืฉืœ 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

ืœื”ืชืงื™ืŸ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื“ืจืš ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช pip:

lxc exec jupyterlab -- python3 -m pip install jupyterlab

ืžืื– ื”ื”ืจื—ื‘ื•ืช ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื”ื ื ื™ืกื™ื•ื ื™ื™ื ื•ืื™ื ื ื ืฉืœื—ื™ื ืจืฉืžื™ืช ืขื ื—ื‘ื™ืœืช jupyterlab, ื•ืœื›ืŸ ืขืœื™ื ื• ืœื”ืชืงื™ืŸ ื•ืœื”ื’ื“ื™ืจ ืื•ืชื” ื‘ืื•ืคืŸ ื™ื“ื ื™.

ื‘ื•ืื• ื ืชืงื™ืŸ ืืช NodeJS ื•ืืช ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช ืขื‘ื•ืจื• - NPM, ืžืื– ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ืžืฉืชืžืฉ ื‘ื”ื ืขื‘ื•ืจ ื”ื”ืจื—ื‘ื•ืช ืฉืœื•:

lxc exec jupyterlab -- apk add nodejs npm

ืœื”ืจื—ื‘ื•ืช ืขื‘ื•ืจ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ืื•ืชื ื ืชืงื™ืŸ ืขื‘ื“ื•, ื™ืฉ ืœื”ืชืงื™ืŸ ืื•ืชื ื‘ืกืคืจื™ื™ืช ื”ืžืฉืชืžืฉ ืžืื—ืจ ืฉื”ืืคืœื™ืงืฆื™ื” ืชื•ืคืขืœ ืžื”ืžืฉืชืžืฉ jupyter. ื”ื‘ืขื™ื” ื”ื™ื ืฉืื™ืŸ ืคืจืžื˜ืจ ื‘ืคืงื•ื“ืช launch ืฉื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ืœืกืคืจื™ื™ื”, ื”ืืคืœื™ืงืฆื™ื” ืžืงื‘ืœืช ืจืง ืžืฉืชื ื” ืกื‘ื™ื‘ื” ื•ืœื›ืŸ ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ ืื•ืชื•. ืœืฉื ื›ืš, ื ื›ืชื•ื‘ ืืช ืคืงื•ื“ืช ื”ื™ื™ืฆื•ื ื”ืžืฉืชื ื” JUPYTERLAB_DIR ื‘ืกื‘ื™ื‘ืช ื”ืžืฉืชืžืฉ jupyter, ืœืชื™ื™ืง .bashrcืฉืžืชื‘ืฆืข ื‘ื›ืœ ืคืขื ืฉื”ืžืฉืชืžืฉ ืžืชื—ื‘ืจ:

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

ื”ืคืงื•ื“ื” ื”ื‘ืื” ืชืชืงื™ืŸ ื”ืจื—ื‘ื” ืžื™ื•ื—ื“ืช - ืžื ื”ืœ ื”ืจื—ื‘ื•ืช ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ:

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

ืขื›ืฉื™ื• ื”ื›ืœ ืžื•ื›ืŸ ืœื”ืฉืงื” ื”ืจืืฉื•ื ื” ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ, ืื‘ืœ ืื ื—ื ื• ืขื“ื™ื™ืŸ ื™ื›ื•ืœื™ื ืœื”ืชืงื™ืŸ ื›ืžื” ื”ืจื—ื‘ื•ืช ืฉื™ืžื•ืฉื™ื•ืช:

  • 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"

ื›ืขืช ื”ืคืขืœ ืืช ืฉืชื™ ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช ื›ื“ื™ ืœื”ืคืขื™ืœ ืื•ืชื• ื‘ืคืขื ื”ืจืืฉื•ื ื” ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ. ืืคืฉืจ ื™ื”ื™ื” ืœื”ืคืขื™ืœ ืื•ืชื• ื‘ืคืงื•ื“ื” ืื—ืช, ืื‘ืœ ื‘ืžืงืจื” ื–ื”, ืคืงื•ื“ืช ื”ื”ืฉืงื”, ืฉืงืฉื” ืœื–ื›ื•ืจ ื‘ืจืืฉ ืฉืœืš, ืชื™ื–ื›ืจ ื‘-bash ื‘ืžื™ื›ืœ, ื•ืœื ื‘ืžืืจื—, ืฉื‘ื• ื™ืฉ ื›ื‘ืจ ืžืกืคื™ืง ืคืงื•ื“ื•ืช ืœืจืฉื•ื ืื•ืชื ื‘ื”ื™ืกื˜ื•ืจื™ื” :)

ื”ื™ื›ื ืก ืœืžื™ื›ืœ ื›ืžืฉืชืžืฉ jupyter:

lxc exec jupyterlab -- su -l jupyter

ืœืื—ืจ ืžื›ืŸ, ืจื•ืฅ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ืขื ืžืคืชื—ื•ืช ื•ืคืจืžื˜ืจื™ื ื›ืžืฆื•ื™ืŸ:

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

ืขื‘ื•ืจ ืœื›ืชื•ื‘ืช ื‘ื“ืคื“ืคืŸ ื”ืื™ื ื˜ืจื ื˜ ืฉืœืš http://10.0.5.5:8888 ื•ื‘ืขืžื•ื“ ืฉื ืคืชื— ื”ื›ื ืก ืืกื™ืžื•ืŸ ื’ื™ืฉื” ืฉืชืจืื” ื‘ืžืกื•ืฃ. ื”ืขืชืง ื•ื”ื“ื‘ืง ืื•ืชื• ื‘ื“ืฃ ื•ืœืื—ืจ ืžื›ืŸ ืœื—ืฅ ื”ืชื—ื‘ืจื•ืช. ืœืื—ืจ ื”ื›ื ื™ืกื”, ืขื‘ื•ืจ ืœืชืคืจื™ื˜ ื”ื”ืจื—ื‘ื•ืช ืžืฉืžืืœ, ื›ืคื™ ืฉืžื•ืฆื’ ื‘ืื™ื•ืจ ืœืžื˜ื”, ืฉื ืชืชื‘ืงืฉ, ื‘ืขืช ื”ืคืขืœืช ืžื ื”ืœ ื”ื”ืจื—ื‘ื•ืช, ืœืงื—ืช ืกื™ื›ื•ื ื™ ืื‘ื˜ื—ื” ืขืœ ื™ื“ื™ ื”ืชืงื ืช ื”ืจื—ื‘ื•ืช ืžืฆื“ื“ื™ื ืฉืœื™ืฉื™ื™ื ืฉืขื‘ื•ืจื ื”ืคืงื•ื“ื” ืคื™ืชื•ื— JupyterLab ืื™ื ื• ืื—ืจืื™:

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ืขื ื–ืืช, ืื ื• ืžื‘ื•ื“ื“ื™ื ืืช ื›ื•ืœื• ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื•ืœืžืงื ืื•ืชื• ื‘ืงื•ื ื˜ื™ื™ื ืจ ื›ืš ืฉื”ืจื—ื‘ื•ืช ืฉืœ ืฆื“ ืฉืœื™ืฉื™ ืฉื“ื•ืจืฉื•ืช ื•ืžืฉืชืžืฉื•ืช ื‘-NodeJS ืœื ื™ื›ื•ืœื•ืช ืœืคื—ื•ืช ืœื’ื ื•ื‘ ื ืชื•ื ื™ื ื‘ื“ื™ืกืง ืžืœื‘ื“ ืืœื• ืฉืื ื• ืคื•ืชื—ื™ื ื‘ืชื•ืš ื”ืงื•ื ื˜ื™ื™ื ืจ. ืงื‘ืœ ืœืžืกืžื›ื™ื ื”ืคืจื˜ื™ื™ื ืฉืœืš ื‘ืžืืจื— ื‘ /home ืœื ืกื‘ื™ืจ ืฉืชื”ืœื™ื›ื™ื ืžื”ืžื›ืœ ื™ืฆืœื™ื—ื•, ื•ืื ื”ื ื™ืฆืœื™ื—ื•, ืื– ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ื‘ืขืœ ื”ืจืฉืื•ืช ืขืœ ืงื‘ืฆื™ื ื‘ืžืขืจื›ืช ื”ืžืืจื—ืช, ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžืคืขื™ืœื™ื ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ื‘ ืžืฆื‘ ืœื ืžื•ื’ืŸ. ื‘ื”ืชื‘ืกืก ืขืœ ืžื™ื“ืข ื–ื”, ืืชื” ื™ื›ื•ืœ ืœื”ืขืจื™ืš ืืช ื”ืกื™ื›ื•ืŸ ืฉืœ ื”ื›ืœืœืช ื”ืจื—ื‘ื•ืช ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ.

ื™ืฆืจ ืžื—ื‘ืจื•ืช IPython (ืขืžื•ื“ื™ื ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ) ื™ื™ื•ื•ืฆืจ ื›ืขืช ื‘ืกืคืจื™ื™ืช ื”ื‘ื™ืช ืฉืœ ื”ืžืฉืชืžืฉ - /home/jupyter, ืื‘ืœ ื”ืชื•ื›ื ื™ื•ืช ืฉืœื ื• ื”ืŸ ืœืคืฆืœ ืืช ื”ื ืชื•ื ื™ื (ืฉื™ืชื•ืฃ) ื‘ื™ืŸ ื”ืžืืจื— ืœืžื›ื•ืœื”, ืื– ื—ื–ื•ืจ ืœืžืกื•ืฃ ื•ื”ืคืกืง ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ืขืœ ื™ื“ื™ ื”ืคืขืœืช ืžืงืฉ ืงื™ืฆื•ืจ - CTRL+C ื•ืขื•ื ื” y ืขืœ ืคื™ ื‘ืงืฉื”. ืœืื—ืจ ืžื›ืŸ ืกื™ื™ื ืืช ื”ื”ืคืขืœื” ื”ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช ืฉืœ ื”ืžืฉืชืžืฉ jupyter ื”ืฉืœืžืช ืžืงืฉ ืงื™ืฆื•ืจ CTRL+D.

ืฉื™ืชื•ืฃ ื ืชื•ื ื™ื ืขื ื”ืžืืจื— ^

ื›ื“ื™ ืœืฉืชืฃ ื ืชื•ื ื™ื ืขื ื”ืžืืจื—, ืขืœื™ืš ืœื™ืฆื•ืจ ืžื›ืฉื™ืจ ื‘ืžื™ื›ืœ ื”ืžืืคืฉืจ ืœืš ืœืขืฉื•ืช ื–ืืช ื•ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื”ืจืฅ ืืช ื”ืคืงื•ื“ื” ื”ื‘ืื” ืฉื‘ื” ืื ื• ืžืฆื™ื™ื ื™ื ืืช ื”ืžืคืชื—ื•ืช ื”ื‘ืื™ื:

  • lxc config device add โ€” ื”ืคืงื•ื“ื” ืžื•ืกื™ืคื” ืืช ืชืฆื•ืจืช ื”ืžื›ืฉื™ืจ
  • jupyter - ืžื–ื”ื” ื”ืžื™ื›ืœ ืฉืืœื™ื• ืžืชื•ื•ืกืคืช ื”ืชืฆื•ืจื”
  • 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 - ืžืขืจื›ื•ืช ืžื™ื›ืœ ืœื™ื ื•ืงืก.

ื”ื’ื“ืจ ืืช ื”ื”ืจืฉืื” ืขืœ ื”ืžืืจื—, ืฉื‘ื• ื”ื‘ืขืœื™ื ื™ื”ื™ื” ืžืฉืชืžืฉ ื”ืžื›ื™ืœ jupyter, ื•ื”ืžืฉืชื ื” $USER ื™ืฆื™ื™ืŸ ืืช ื”ืžืฉืชืžืฉ ื”ืžืืจื— ืฉืœืš ื›ืงื‘ื•ืฆื”:

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

ืฉืœื•ื ืขื•ืœื! ^

ืื ืขื“ื™ื™ืŸ ื™ืฉ ืœืš ื”ืคืขืœืช ืงื•ื ืกื•ืœื” ืคืชื•ื—ื” ื‘ืžื™ื›ืœ ืขื ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ, ื•ืœืื—ืจ ืžื›ืŸ ื”ืคืขืœ ืื•ืชื• ืžื—ื“ืฉ ืขื ืžืคืชื— ื—ื“ืฉ --notebook-dir ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ื”ืขืจืš /mnt/hostfs ื‘ืชื•ืจ ื”ื ืชื™ื‘ ืœืฉื•ืจืฉ ื”ืžื—ืฉื‘ื™ื ื”ื ื™ื™ื“ื™ื ื‘ืžื™ื›ืœ ืœืžื›ืฉื™ืจ ืฉื™ืฆืจื ื• ื‘ืฉืœื‘ ื”ืงื•ื“ื:

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

ืœืื—ืจ ืžื›ืŸ ืขื‘ื•ืจ ืœื“ืฃ http://10.0.5.5:8888 ื•ืฆื•ืจ ืืช ื”ืžื—ืฉื‘ ื”ื ื™ื™ื“ ื”ืจืืฉื•ืŸ ืฉืœืš ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ื‘ืขืžื•ื“ ื›ืคื™ ืฉืžื•ืฆื’ ื‘ืชืžื•ื ื” ืœืžื˜ื”:

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ืœืื—ืจ ืžื›ืŸ, ื‘ืฉื“ื” ื‘ืขืžื•ื“, ื”ื–ื™ื ื• ืืช ืงื•ื“ Python ืฉื™ืฆื™ื’ ืืช ื”ืงืœืืกื™ Hello World!. ืœืื—ืจ ืฉืชืกื™ื™ื ืœื”ื–ื™ืŸ, ืœื—ืฅ CTRL+ENTER ืื• ื›ืคืชื•ืจ "ื”ืคืขืœ" ื‘ืกืจื’ืœ ื”ื›ืœื™ื ื‘ื—ืœืง ื”ืขืœื™ื•ืŸ ื›ื“ื™ ืœื’ืจื•ื ืœ-JupyterLab ืœืขืฉื•ืช ื–ืืช:

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ื‘ืฉืœื‘ ื–ื”, ื›ืžืขื˜ ื”ื›ืœ ืžื•ื›ืŸ ืœืฉื™ืžื•ืฉ, ืืš ืœื ื™ื”ื™ื” ืžืขื ื™ื™ืŸ ืื ืœื ื ืชืงื™ืŸ ืžื•ื“ื•ืœื™ Python ื ื•ืกืคื™ื (ืืคืœื™ืงืฆื™ื•ืช ืžืŸ ื”ืžื ื™ื™ืŸ) ืฉื™ื›ื•ืœื™ื ืœื”ืจื—ื™ื‘ ืžืฉืžืขื•ืชื™ืช ืืช ื”ื™ื›ื•ืœื•ืช ื”ืกื˜ื ื“ืจื˜ื™ื•ืช ืฉืœ Python ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจืœื›ืŸ, ื‘ื•ืื• ื ืžืฉื™ืš :)

ื .ื‘ ื”ื“ื‘ืจ ื”ืžืขื ื™ื™ืŸ ื”ื•ื ืฉื”ื™ื™ืฉื•ื ื”ื™ืฉืŸ ื™ื•ืคื™ื˜ืจ ืชื—ืช ืฉื ืงื•ื“ ืžื—ื‘ืจืช ืฆื“ืง ืœื ื ืขืœื ื•ื”ื•ื ืงื™ื™ื ื‘ืžืงื‘ื™ืœ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ. ื›ื“ื™ ืœืขื‘ื•ืจ ืœื’ืจืกื” ื”ื™ืฉื ื”, โ€‹โ€‹ืœื—ืฅ ืขืœ ื”ืงื™ืฉื•ืจ ื”ืžื•ืกื™ืฃ ืืช ื”ืกื™ื•ืžืช ื‘ื›ืชื•ื‘ืช/tree, ื•ื”ืžืขื‘ืจ ืœื’ืจืกื” ื”ื—ื“ืฉื” ืžืชื‘ืฆืข ืขื ื”ืกื™ื•ืžืช /lab, ืื‘ืœ ื–ื” ืœื ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžืฆื•ื™ืŸ:

ื”ืจื—ื‘ืช ื”ื™ื›ื•ืœื•ืช ืฉืœ Python ^

ื‘ืกืขื™ืฃ ื–ื”, ื ืชืงื™ืŸ ืžื•ื“ื•ืœื™ ืฉืคืช Python ื—ื–ืงื™ื ื›ืžื• ืจื“ื•ื, ืคื ื“ื•ืช, ืžื˜ืคืœื•ื˜ืœื™ื‘, IPyWidgets ืฉืชื•ืฆืื•ืชื™ื”ื ืžืฉื•ืœื‘ื•ืช ื‘ืžื—ืฉื‘ื™ื ื ื™ื™ื“ื™ื ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ.

ืœืคื ื™ ื”ืชืงื ืช ืžื•ื“ื•ืœื™ Python ื”ืจืฉื•ืžื™ื ื“ืจืš ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช pip ืขืœื™ื ื• ืœืคืชื•ืจ ืชื—ื™ืœื” ืชืœื•ืช ืžืขืจื›ืช ื‘-Alpine Linux:

  • g++ - ื“ืจื•ืฉ ืœื”ื™ื“ื•ืจ ืžื•ื“ื•ืœื™ื, ืžื›ื™ื•ื•ืŸ ืฉื—ืœืงื ืžื™ื•ืฉืžื™ื ื‘ืฉืคื” C + + ื•ืœื”ืชื—ื‘ืจ ืœืคื™ื™ืชื•ืŸ ื‘ื–ืžืŸ ืจื™ืฆื” ื›ืžื•ื“ื•ืœื™ื ื‘ื™ื ืืจื™ื™ื
  • freetype-dev - ืชืœื•ืช ืขื‘ื•ืจ ืžื•ื“ื•ืœ Python ืžื˜ืคืœื•ื˜ืœื™ื‘

ื”ืชืงื ืช ืชืœื•ืช:

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

ื™ืฉ ื‘ืขื™ื” ืื—ืช: ื‘ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ื”ืคืฆื” ื”ืืœืคื™ื ื™ืช ืœื™ื ื•ืงืก, ืœื ื ื™ืชืŸ ื™ื”ื™ื” ืœื”ืจื›ื™ื‘ ืืช ื”ื’ืจืกื” ื”ื—ื“ืฉื” ืฉืœ NumPy; ืชื•ืคื™ืข ืฉื’ื™ืืช ืงื•ืžืคื™ืœืฆื™ื” ืฉืœื ื”ืฆืœื—ืชื™ ืœืคืชื•ืจ:

ERROR: ืœื ื ื™ืชืŸ ืœื‘ื ื•ืช ื’ืœื’ืœื™ื ืขื‘ื•ืจ 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 ^

ืื ืืชื” ืจืฅ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ, ื”ืคืขืœ ืื•ืชื• ืžื—ื“ืฉ ื›ืš ืฉื”ืžื•ื“ื•ืœื™ื ื”ื—ื“ืฉื™ื ืฉื”ื•ืชืงื ื• ื™ื•ืคืขืœื•. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื‘ื”ืคืขืœืช ืžืกื•ืฃ, ืœื—ืฅ CTRL+C ืื™ืคื” ื–ื” ืคื•ืขืœ ื•ื”ื™ื›ื ืก y ื›ื“ื™ ืœื”ืคืกื™ืง ืืช ื”ื‘ืงืฉื” ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืชื—ื™ืœ ืฉื•ื‘ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ื”ื—ืฅ ืœืžืขืœื” ื‘ืžืงืœื“ืช ื›ื“ื™ ืœื ืœื”ื–ื™ืŸ ืืช ื”ืคืงื•ื“ื” ืฉื•ื‘ ื•ืื– 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 ื™ื•ืฆืจ ืืœืžื ื˜ ืžืžืฉืง ืžืฉืชืžืฉ ื‘ื“ืฃ ืฉืžืงื™ื™ื ืื™ื ื˜ืจืืงืฆื™ื” ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช ืขื ืงื•ื“ ื”ืžืงื•ืจ, ื•ื’ื ืžื˜ืคืœื•ื˜ืœื™ื‘ ืžืฆื™ื’ ืืช ื”ืชื•ืฆืื” ืฉืœ ื”ืงื•ื“ ื‘ืฆื•ืจื” ืฉืœ ืชืžื•ื ื” ื›ื’ืจืฃ ืคื•ื ืงืฆื™ื•ืช:

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ื“ื•ื’ืžืื•ืช ืจื‘ื•ืช IPyWidgets ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ืืช ื–ื” ื‘ืžื“ืจื™ื›ื™ื ื›ืืŸ

ืžื” ืขื•ื“? ^

ื›ืœ ื”ื›ื‘ื•ื“ ืื ื ืฉืืจืชื ื•ื”ื’ืขืชื ืœืกื•ืฃ ื”ืžืืžืจ. ื‘ื›ื•ื•ื ื” ืœื ืคืจืกืžืชื™ ืกืงืจื™ืคื˜ ืžื•ื›ืŸ ื‘ืกื•ืฃ ื”ืžืืžืจ ืฉื™ืชืงื™ืŸ ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ ื‘"ืœื—ื™ืฆื” ืื—ืช" ื›ื“ื™ ืœืขื•ื“ื“ ืขื•ื‘ื“ื™ื :) ืื‘ืœ ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื–ื” ื‘ืขืฆืžืš, ืžื›ื™ื•ื•ืŸ ืฉืืชื” ื›ื‘ืจ ื™ื•ื“ืข ืื™ืš, ืœืื—ืจ ืฉืืกืคืช ืืช ื”ืคืงื•ื“ื•ืช ืœืกืงืจื™ืคื˜ ืื—ื“ ืฉืœ Bash :)

ืืชื” ื™ื›ื•ืœ ื’ื:

  • ื”ื’ื“ืจ ืฉื ืจืฉืช ืขื‘ื•ืจ ื”ืžื›ื•ืœื” ื‘ืžืงื•ื ื›ืชื•ื‘ืช IP ืขืœ ื™ื“ื™ ื›ืชื™ื‘ืชื• ื‘ืฆื•ืจื” ืคืฉื•ื˜ื” /etc/hosts ื•ื”ืงืœื“ ืืช ื”ื›ืชื•ื‘ืช ื‘ื“ืคื“ืคืŸ http://jupyter.local:8888
  • ืฉื—ืง ืขื ืžื’ื‘ืœืช ื”ืžืฉืื‘ื™ื ืขื‘ื•ืจ ื”ืžื™ื›ืœ, ื‘ืฉื‘ื™ืœ ื–ื” ืงืจื ืืช ื”ืคืจืง ื‘ ื™ื›ื•ืœื•ืช LXD ื‘ืกื™ืกื™ื•ืช ืื• ืœืงื‘ืœ ืžื™ื“ืข ื ื•ืกืฃ ื‘ืืชืจ ื”ืžืคืชื—ื™ื ืฉืœ LXD.
  • ืฉื ื” ืืช ื”ื ื•ืฉื:

ืฉื™ื’ื•ืจ ื™ื•ืคื™ื˜ืจ ืœืžืกืœื•ืœ LXD

ื•ืขื•ื“ ื”ืจื‘ื” ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช! ื–ื” ื”ื›ืœ. ืื ื™ ืžืื—ืœ ืœืš ื”ืฆืœื—ื”!

ืขื“ื›ื•ืŸ: 15.04.2020/18/30 XNUMX:XNUMX - ืชื™ืงื•ืŸ ืฉื’ื™ืื•ืช ื‘ืคืจืง "ืฉืœื•ื ืขื•ืœื!"
ืขื“ื›ื•ืŸ: 16.04.2020/10/00 XNUMX:XNUMX - ื˜ืงืกื˜ ืžืชื•ืงืŸ ื•ื ื•ืกืฃ ื‘ืชื™ืื•ืจ ื”ืคืขืœืช ืžื ื”ืœ ื”ื”ืจื—ื‘ื•ืช ืžืขื‘ื“ืช ื’'ื•ืคื™ื˜ืจ
ืขื“ื›ื•ืŸ: 16.04.2020/10/40 XNUMX:XNUMX - ืชื•ืงื ื” ืฉื’ื™ืื•ืช ืฉื ืžืฆืื• ื‘ื˜ืงืกื˜ ื•ืฉื•ื ื• ืžืขื˜ ืœื˜ื•ื‘ื” ื‘ืคืจืง "ื”ืชืงื ืช ืชื•ื›ื ื” ื‘ืกื™ืกื™ืช ื•ื”ื’ื“ืจืช ื”ืžืขืจื›ืช"

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”