LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์‹œ์Šคํ…œ์„ ํ”๋“ค์ง€ ์•Š๊ณ  ๋ชจ๋‘ ํ•ด์ฒดํ•˜์ง€ ์•Š๋„๋ก Linux์—์„œ ์ฝ”๋“œ ๋˜๋Š” ์‹œ์Šคํ…œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‹คํ—˜ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์—์„œ ๋‹ค์–‘ํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋ฐฑ ๋˜๋Š” ์ฒœ?

ํ•˜์ดํผ๋ฐ”์ด์ €๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๊ฒฐํ•˜๊ฒ ์ง€๋งŒ ๋น„์šฉ์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด Alpine Linux ๋ฐฐํฌํŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” LXD์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ตœ์†Œํ•œ 7.60MB RAM, ์‹œ์ž‘ ํ›„ ๋ฃจํŠธ ํŒŒํ‹ฐ์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ์œ„์น˜ 9.5MB! ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”, ์—˜๋ก  ๋จธ์Šคํฌ? ์ฒดํฌ ์•„์›ƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค LXD์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ - Linux์˜ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ

LXD ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช…ํ™•ํ•ด์ง„ ํ›„, ๋” ๋‚˜์•„๊ฐ€ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ , UI-์œ„์ ฏ์„ ์ฝ”๋“œ์™€ ๋™์ ์œผ๋กœ(๋Œ€ํ™”์‹์œผ๋กœ) ์—ฐ๊ฒฐํ•˜๊ณ , ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐํ•ฉ ํ”Œ๋žซํผ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ธ”๋ž™์žญ ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œโ€ฆ ์„œ์‹ ์ง€์ •? ์ผ์ข…์˜ ๋Œ€ํ™”ํ˜• ๋ธ”๋กœ๊ทธ? ์™€... ๊ฐ–๊ณ ์‹ถ๋‹ค! ์›ํ•˜๋‹ค! ๐Ÿ™‚

์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹œ์ž‘ํ•  ๊ณ ์–‘์ด ์•„๋ž˜๋ฅผ๋ณด์‹ญ์‹œ์˜ค. ์ฃผํ”ผํ„ฐ๋žฉ - ๊ตฌ์‹ Jupyter Notebook ๋Œ€์‹  ์ฐจ์„ธ๋Œ€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ Python ๋ชจ๋“ˆ๋„ ์„ค์น˜ ๋ˆ” ํŒŒ์ด, ํŒ๋‹ค, ๋งคํŠธํ”Œ๋กฏ๋ฆฝ, IPyWidget ๊ทธ๋Ÿฌ๋ฉด ์œ„์˜ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  IPython ๋žฉํ†ฑ์ด๋ผ๋Š” ํŠน์ˆ˜ ํŒŒ์ผ์— ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

์ด๋ฅ™ ๊ณ„ํš ^

LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

์œ„์˜ ๊ณ„ํš์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ„๋‹จํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐํฌํŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค. ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ด ๋ฐฐํฌ ํ‚คํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์žฅ ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋งŒ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ ๊ฐ€์ƒ ๋””์Šคํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. hostfs ๋ฃจํŠธ FS์— ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋Š” ํ˜ธ์ŠคํŠธ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ฒด๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ์˜ ์ผ๋ฐ˜ ๋„คํŠธ์›Œํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Bash, sudo, ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜, ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฐ ๊ตฌ์„ฑ
  • Python, ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ข…์†์„ฑ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์น˜ ๋ฐ ์‹คํ–‰ ์ฃผํ”ผํ„ฐ๋žฉ, ๋ชจ์–‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ณ  ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  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 ๋ณธ ์–ด๊ฒŒ์ธ ์…ธ

bash ์™„์„ฑ
bash ์…ธ์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ์™„์„ฑ

sudo๋Š”
ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ๋ถ€ ๋ช…๋ น์„ ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต

๊ทธ๋ฆผ์ž
์„€๋„์šฐ ํŒŒ์ผ ๋ฐ PAM์„ ์ง€์›ํ•˜๋Š” ์•”ํ˜ธ ๋ฐ ๊ณ„์ • ๊ด€๋ฆฌ ๋„๊ตฌ ์„ธํŠธ

์ธ ๋ฐ์ดํ„ฐ
์‹œ๊ฐ„๋Œ€ ๋ฐ ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์†Œ์Šค

๋‚˜๋…ธ
ํ–ฅ์ƒ๋œ Pico ํŽธ์ง‘๊ธฐ ํด๋ก 

๋˜ํ•œ ๋‹ค์Œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€ ์‹œ์Šคํ…œ์— ์ง€์›์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. man man-pages mdocml-apropos less

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

์‚ฌ์šฉํ•œ ๋ช…๋ น๊ณผ ํ‚ค๋ฅผ ๋ถ„์„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • lxc - LXD ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ถœ
  • exec - ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” LXD ํด๋ผ์ด์–ธํŠธ ๋ฐฉ์‹
  • jupyterlab โ€” ์ปจํ…Œ์ด๋„ˆ ID
  • -- โ€” ์ถ”๊ฐ€ ํ‚ค๋ฅผ ๋‹ค์Œ์— ๋Œ€ํ•œ ํ‚ค๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•˜๋Š” ํŠน์ˆ˜ ํ‚ค 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๋ฅผ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์€ Manjaro Linux์ด๊ณ  ๋ณต์‚ฌ๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors ์›์น™์ ์œผ๋กœ Alpine Linux์— ์ ํ•ฉํ•˜๊ณ  ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฐํฌํŒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ Bash๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

skel ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ด์‡  --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

๊ธฐ์กด ๋ฃจํŠธ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฉ๊ธˆ ๋ณต์‚ฌํ•œ 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 ๋‚˜์ค‘์— ๊ตฌ์„ฑํ•  ํ•ญ๋ชฉ ์ฃผํ”ผํ„ฐ๋žฉ:

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 ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋ฏ€๋กœ ๋จผ์ € ์ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฃผํ”ผํ„ฐ๋žฉ ์šฐ๋ฆฌ๋Š” ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค 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. ๋ฌธ์ œ๋Š” ์‹œ์ž‘ ๋ช…๋ น์— ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ณ€์ˆ˜ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ช…๋ น์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. 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 - UI ํ…Œ๋งˆ
  • jupyterlab_neon_theme - UI ํ…Œ๋งˆ
  • 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 ๊ถค๋„์— Jupyter ์‹œ์ž‘

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ „์ฒด๋ฅผ ๊ฒฉ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผํ”ผํ„ฐ๋žฉ 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์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ - Linux ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ.

์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ์ž๊ฐ€ ๋  ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์„ค์ • 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 ๊ถค๋„์— Jupyter ์‹œ์ž‘

๊ทธ๋Ÿฐ ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ํ•„๋“œ์— ํด๋ž˜์‹์„ ์ถœ๋ ฅํ•  Python ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. Hello World!. ์ž…๋ ฅ์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. CTRL+ENTER ๋˜๋Š” ์ƒ๋‹จ ๋„๊ตฌ ๋ชจ์Œ์˜ "์žฌ์ƒ" ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ JupyterLab์—์„œ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

์ด๊ฒƒ์€ ๊ฑฐ์˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€๋งŒ Python์˜ ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ Python ๋ชจ๋“ˆ(๋ณธ๊ฒฉ์ ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ)์„ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํฅ๋ฏธ๋กญ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผํ”ผํ„ฐ๋žฉ๊ทธ๋ž˜์„œ ๊ณ„์† ์ง„ํ–‰ํ•ฉ์‹œ๋‹ค ๐Ÿ™‚

PS ํฅ๋ฏธ๋กœ์šด ์ ์€ ์ด์ „ ๊ตฌํ˜„์ด ์ฃผํ”ผํ„ฐ ์ฝ”๋“œ๋ช…์œผ๋กœ ์ฃผํ”ผํ„ฐ ์ˆ˜์ฒฉ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๋ณ‘ํ–‰ํ•˜์—ฌ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผํ”ผํ„ฐ๋žฉ. ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ์ฃผ์†Œ์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งํฌ๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค./tree, ์ƒˆ ๋ฒ„์ „์œผ๋กœ์˜ ์ „ํ™˜์€ ์ ‘๋ฏธ์‚ฌ์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. /lab, ๊ทธ๋Ÿฌ๋‚˜ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ ํ™•์žฅ ^

์ด ์„น์…˜์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ Python ์–ธ์–ด ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ” ํŒŒ์ด, ํŒ๋‹ค, ๋งคํŠธํ”Œ๋กฏ๋ฆฝ, IPyWidget ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋…ธํŠธ๋ถ์— ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผํ”ผํ„ฐ๋žฉ.

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ๋‚˜์—ด๋œ Python ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ธฐ ์ „์— pip ๋จผ์ € Alpine Linux์—์„œ ์‹œ์Šคํ…œ ์ข…์†์„ฑ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • g++ - ๋ชจ๋“ˆ ์ค‘ ์ผ๋ถ€๋Š” ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜๋ฏ€๋กœ ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. C + + ๋Ÿฐํƒ€์ž„ ์‹œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“ˆ๋กœ Python์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • freetype-dev - Python ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๋งคํŠธํ”Œ๋กฏ๋ฆฝ

์ข…์†์„ฑ ์„ค์น˜:

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

ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Alpine Linux ๋ฐฐํฌํŒ์˜ ํ˜„์žฌ ์ƒํƒœ์—์„œ๋Š” NumPy์˜ ์ƒˆ ๋ฒ„์ „์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ERROR: PEP 517์„ ์‚ฌ์šฉํ•˜๊ณ  ์ง์ ‘ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋Š” numpy์šฉ ํœ ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ชจ๋“ˆ์„ ์ด๋ฏธ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋Š” ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€๋กœ ์„ค์น˜ํ•˜์ง€๋งŒ ํ˜„์žฌ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IPyWidget ์†Œ์Šค ์ฝ”๋“œ์™€ ๋Œ€ํ™”์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” UI ์š”์†Œ๋ฅผ ํŽ˜์ด์ง€์— ์ƒ์„ฑํ•˜๊ณ  ๋งคํŠธํ”Œ๋กฏ๋ฆฝ ์ฝ”๋“œ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜์˜ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

๋งŽ์€ ์˜ˆ IPyWidget ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—

๋˜ ๋ญ์•ผ? ^

๋‹น์‹ ์ด ๋จธ๋ฌผ๋ €๊ณ  ๊ธฐ์‚ฌ์˜ ๋งจ ๋์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด ๋‹น์‹ ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋  ๊ธ€ ๋ง๋ฏธ์— ์™„์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ผ๋ถ€๋Ÿฌ ์˜ฌ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฃผํ”ผํ„ฐ๋žฉ ์—ด์‹ฌํžˆ ์ผํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณด์ƒํ•˜๊ธฐ ์œ„ํ•ด "ํ•œ ๋ฒˆ์˜ ํด๋ฆญ"์œผ๋กœ ๐Ÿ™‚ ๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ น์„ ๋‹จ์ผ Bash ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

๋‹น์‹ ์€ ๋˜ํ•œ ์ˆ˜:

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ IP ์ฃผ์†Œ ๋Œ€์‹  ์ปจํ…Œ์ด๋„ˆ์˜ ๋„คํŠธ์›Œํฌ ์ด๋ฆ„์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. /etc/hosts ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค http://jupyter.local:8888
  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ๊ฐ€์ง€๊ณ  ๋†€์•„๋ณด์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ LXD ๊ธฐ๋Šฅ ๋˜๋Š” LXD ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค.
  • ํ…Œ๋งˆ ๋ณ€๊ฒฝ:

LXD ๊ถค๋„์— Jupyter ์‹œ์ž‘

๊ทธ๋ฆฌ๊ณ  ํ›จ์”ฌ ๋” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๊ฒŒ ๋‹ค์•ผ. ๋‚˜๋Š” ๋‹น์‹ ์ด ์„ฑ๊ณต์„ ๊ธฐ์›ํ•ฉ๋‹ˆ๋‹ค!

์—…๋ฐ์ดํŠธ: 15.04.2020๋…„ 18์›” 30์ผ XNUMX:XNUMX - "Hello, World!" ์˜ค๋ฅ˜ ์ˆ˜์ •
์—…๋ฐ์ดํŠธ: 16.04.2020๋…„ 10์›” 00์ผ ์˜ค์ „ XNUMX:XNUMX - ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ์ž ํ™œ์„ฑํ™” ์„ค๋ช…์˜ ํ…์ŠคํŠธ ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€ ์ฃผํ”ผํ„ฐ๋žฉ
์—…๋ฐ์ดํŠธ: 16.04.2020๋…„ 10์›” 40์ผ ์˜ค์ „ XNUMX์‹œ XNUMX๋ถ„ - ํ…์ŠคํŠธ์—์„œ ๋ฐœ๊ฒฌ๋œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  "๊ธฐ๋ณธ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์„ค์น˜" ์ฑ•ํ„ฐ๋ฅผ ์•ฝ๊ฐ„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€