ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

คุณเคยทดลองกับโค้ดหรือยูทิลิตี้ระบบใน Linux เพื่อที่จะไม่ต้องกังวลกับระบบฐานและไม่ต้องรื้อทุกอย่างในกรณีที่มีข้อผิดพลาดในโค้ดที่ควรทำงานด้วยสิทธิ์รูทหรือไม่?

แต่แล้วข้อเท็จจริงที่สมมติว่าคุณต้องทดสอบหรือรันไมโครเซอร์วิสต่างๆ ทั้งคลัสเตอร์บนเครื่องเดียวล่ะ? ร้อยหรือพัน?

ด้วยเครื่องเสมือนที่จัดการโดยไฮเปอร์ไวเซอร์ ปัญหาดังกล่าวสามารถแก้ไขได้และจะแก้ไข แต่จะมีค่าใช้จ่ายเท่าไร? ตัวอย่างเช่น คอนเทนเนอร์ใน LXD ที่ใช้การกระจาย Alpine Linux จะใช้เท่านั้น 7.60MB RAM และตำแหน่งที่พาร์ติชันรูทอยู่หลังจากเริ่มต้นระบบ 9.5MB! คุณชอบสิ่งนั้นมากแค่ไหน Elon Musk? ฉันแนะนำให้เช็คเอาท์ ความสามารถพื้นฐานของ LXD - ระบบคอนเทนเนอร์ใน Linux

หลังจากที่ชัดเจนโดยทั่วไปแล้วว่าคอนเทนเนอร์ LXD คืออะไร เรามาดูกันดีกว่าว่าจะมีแพลตฟอร์มเครื่องเก็บเกี่ยวที่คุณสามารถเรียกใช้โค้ดสำหรับโฮสต์ได้อย่างปลอดภัย สร้างกราฟ เชื่อมโยงวิดเจ็ต UI แบบไดนามิก (เชิงโต้ตอบ) กับโค้ดของคุณ เสริมโค้ดด้วยข้อความที่มีแบล็คแจ็ค... การจัดรูปแบบ? บล็อกเชิงโต้ตอบบางประเภทเหรอ? ว้าว... อยากได้! ต้องการ! 🙂

ดูใต้แมวที่เราจะปล่อยในภาชนะ จูปิเตอร์แล็บ - ส่วนต่อประสานผู้ใช้รุ่นต่อไปแทนที่จะเป็น Jupyter Notebook ที่ล้าสมัย และเราจะติดตั้งโมดูล Python เช่น นำพาย, นุ่น, Matplotlib, IPyWidgets ซึ่งจะช่วยให้คุณสามารถทำทุกอย่างที่ระบุไว้ข้างต้นและบันทึกทั้งหมดไว้ในไฟล์พิเศษ - แล็ปท็อป IPython

ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

แผนการบินขึ้นของวงโคจร ^

ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

มาร่างแผนปฏิบัติการสั้นๆ เพื่อให้เราดำเนินการตามแผนข้างต้นได้ง่ายขึ้น:

  • มาติดตั้งและเปิดใช้งานคอนเทนเนอร์ตามชุดการแจกจ่ายกันดีกว่า อัลไพน์ลินุกซ์. เราจะใช้การแจกจ่ายนี้เนื่องจากมีจุดมุ่งหมายเพื่อความเรียบง่ายและจะติดตั้งเฉพาะซอฟต์แวร์ที่จำเป็นที่สุดเท่านั้นไม่มีอะไรฟุ่มเฟือย
  • มาเพิ่มดิสก์เสมือนเพิ่มเติมในคอนเทนเนอร์แล้วตั้งชื่อให้ - hostfs และเมานต์เข้ากับระบบไฟล์รูท ดิสก์นี้จะทำให้สามารถใช้ไฟล์บนโฮสต์จากไดเรกทอรีที่กำหนดภายในคอนเทนเนอร์ได้ ดังนั้นข้อมูลของเราจะไม่ขึ้นอยู่กับคอนเทนเนอร์ หากคอนเทนเนอร์ถูกลบ ข้อมูลจะยังคงอยู่ในโฮสต์ นอกจากนี้ แบบแผนนี้ยังมีประโยชน์สำหรับการแบ่งปันข้อมูลเดียวกันระหว่างคอนเทนเนอร์จำนวนมากโดยไม่ต้องใช้กลไกเครือข่ายมาตรฐานของการกระจายคอนเทนเนอร์
  • มาติดตั้ง 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 ซึ่งเราลิงค์ไปที่สวิตซ์ (network bridge) 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 shell

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 — รหัสคอนเทนเนอร์
  • -- - คีย์พิเศษที่ระบุว่าจะไม่ตีความคีย์เพิ่มเติมว่าเป็นคีย์สำหรับ 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 ดังนั้นเราต้องติดตั้งล่ามนี้ก่อน อีกด้วย, จูปิเตอร์แล็บ เราจะติดตั้งโดยใช้ตัวจัดการแพ็คเกจ Python pipและไม่ใช่ระบบเนื่องจากอาจล้าสมัยในพื้นที่เก็บข้อมูลของระบบดังนั้นเราจึงต้องแก้ไขการขึ้นต่อกันด้วยตนเองโดยการติดตั้งแพ็คเกจต่อไปนี้: python3 python3-dev gcc libc-dev zeromq-dev:

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

มาอัปเดตโมดูลหลามและตัวจัดการแพ็คเกจกันดีกว่า 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 — ธีม 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"

ตอนนี้ให้รันคำสั่งสองคำสั่งต่อไปนี้เพื่อรันเป็นครั้งแรก จูปิเตอร์แล็บ. เป็นไปได้ที่จะเปิดใช้งานด้วยคำสั่งเดียว แต่ในกรณีนี้ คำสั่งเรียกใช้ซึ่งยากต่อการจดจำในใจของคุณจะถูกจดจำด้วยการทุบตีในคอนเทนเนอร์ ไม่ใช่บนโฮสต์ ซึ่งมีคำสั่งเพียงพออยู่แล้ว เพื่อบันทึกไว้ในประวัติศาสตร์ :)

เข้าสู่ระบบคอนเทนเนอร์ในฐานะผู้ใช้ jupyter:

lxc exec jupyterlab -- su -l jupyter

ต่อไปวิ่ง จูปิเตอร์แล็บ พร้อมคีย์และพารามิเตอร์ตามที่ระบุ:

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

ไปที่ที่อยู่ในเว็บเบราว์เซอร์ของคุณ http://10.0.5.5:8888 และในหน้าที่เปิดเข้าไป โทเค็น การเข้าถึงที่คุณจะเห็นในคอนโซล คัดลอกและวางลงบนหน้า จากนั้นคลิก เข้าสู่ระบบ. หลังจากเข้าสู่ระบบแล้ว ให้ไปที่เมนูส่วนขยายทางด้านซ้าย ดังแสดงในรูปด้านล่าง ซึ่งเมื่อเปิดใช้งานตัวจัดการส่วนขยาย คุณจะได้รับแจ้งให้รับความเสี่ยงด้านความปลอดภัยโดยการติดตั้งส่วนขยายจากบุคคลที่สามซึ่งคำสั่ง การพัฒนาจูปิเตอร์แล็บ ไม่รับผิดชอบ:

ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

อย่างไรก็ตาม เรากำลังแยกส่วนทั้งหมดออกจากกัน จูปิเตอร์แล็บ และวางไว้ในคอนเทนเนอร์เพื่อให้ส่วนขยายของบุคคลที่สามที่ต้องการและใช้ NodeJS อย่างน้อยไม่สามารถขโมยข้อมูลบนดิสก์อื่นนอกเหนือจากที่เราเปิดภายในคอนเทนเนอร์ได้ รับเอกสารส่วนตัวของคุณบนโฮสต์ใน /home กระบวนการจากคอนเทนเนอร์ไม่น่าจะสำเร็จ และหากเป็นเช่นนั้น คุณจะต้องมีสิทธิ์ในไฟล์บนระบบโฮสต์ เนื่องจากเราเรียกใช้คอนเทนเนอร์ใน โหมดที่ไม่มีสิทธิ์. จากข้อมูลนี้ คุณสามารถประเมินความเสี่ยงในการรวมส่วนขยายเข้าไปได้ จูปิเตอร์แล็บ.

สร้างสมุดบันทึก IPython (หน้าใน จูปิเตอร์แล็บ) จะถูกสร้างขึ้นในโฮมไดเร็กตอรี่ของผู้ใช้ - /home/jupyterแต่แผนของเราคือการแบ่งข้อมูล (แชร์) ระหว่างโฮสต์และคอนเทนเนอร์ ดังนั้นให้กลับไปที่คอนโซลแล้วหยุด จูปิเตอร์แล็บ โดยดำเนินการปุ่มลัด - CTRL+C และตอบ y เมื่อมีการร้องขอ. จากนั้นยุติเซสชันโต้ตอบของผู้ใช้ jupyter เสร็จสิ้นปุ่มลัด CTRL+D.

การแชร์ข้อมูลกับโฮสต์ ^

หากต้องการแชร์ข้อมูลกับโฮสต์ คุณต้องสร้างอุปกรณ์ในคอนเทนเนอร์ที่อนุญาตให้คุณทำเช่นนี้ได้ และในการดำเนินการนี้ ให้รันคำสั่งต่อไปนี้โดยที่เราระบุคีย์ต่อไปนี้:

  • lxc config device add — คำสั่งเพิ่มการกำหนดค่าอุปกรณ์
  • jupyter — ID ของคอนเทนเนอร์ที่มีการเพิ่มการกำหนดค่า
  • hostfs — รหัสอุปกรณ์ คุณสามารถตั้งชื่อใดก็ได้
  • disk — มีการระบุประเภทของอุปกรณ์
  • path — ระบุเส้นทางในคอนเทนเนอร์ที่ LXD จะต่อเชื่อมอุปกรณ์นี้
  • source — ระบุแหล่งที่มา เส้นทางไปยังไดเร็กทอรีบนโฮสต์ที่คุณต้องการแชร์กับคอนเทนเนอร์ ระบุเส้นทางตามความต้องการของคุณ
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooks

สำหรับแค็ตตาล็อก /home/dv/projects/ipython-notebooks ต้องตั้งค่าการอนุญาตให้กับผู้ใช้คอนเทนเนอร์ที่ปัจจุบันมี UID เท่ากับ SubUID + UIDให้ดูบทที่ ความปลอดภัย. สิทธิพิเศษของคอนเทนเนอร์ ในบทความ คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux.

ตั้งค่าการอนุญาตบนโฮสต์ โดยที่เจ้าของจะเป็นผู้ใช้คอนเทนเนอร์ jupyterและตัวแปร $USER จะระบุผู้ใช้โฮสต์ของคุณเป็นกลุ่ม:

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

สวัสดีชาวโลก! ^

หากคุณยังคงมีเซสชันคอนโซลเปิดอยู่ในคอนเทนเนอร์ด้วย จูปิเตอร์แล็บจากนั้นรีสตาร์ทด้วยรหัสใหม่ --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 ได้อย่างมาก จูปิเตอร์แล็บเรามาต่อกันดีกว่า :)

ป.ล. สิ่งที่น่าสนใจก็คือการใช้งานแบบเก่า ดาวพฤหัสบดี ภายใต้สมญานาม โน้ตบุ๊ค Jupyter มิได้หายไปและดำรงอยู่ควบคู่กับ จูปิเตอร์แล็บ. หากต้องการเปลี่ยนไปใช้เวอร์ชันเก่า ให้ไปที่ลิงก์โดยเพิ่มส่วนต่อท้ายในที่อยู่/treeและการเปลี่ยนไปใช้เวอร์ชันใหม่จะดำเนินการโดยใช้คำต่อท้าย /labแต่ไม่จำเป็นต้องระบุ:

ขยายขีดความสามารถของ Python ^

ในส่วนนี้ เราจะติดตั้งโมดูลภาษา Python ที่ทรงพลังเช่น นำพาย, นุ่น, Matplotlib, IPyWidgets ผลลัพธ์ที่ได้รวมอยู่ในแล็ปท็อป จูปิเตอร์แล็บ.

ก่อนที่จะติดตั้งโมดูล Python ที่แสดงผ่านตัวจัดการแพ็คเกจ pip ก่อนอื่นเราต้องแก้ไขการพึ่งพาระบบใน Alpine Linux:

  • g++ — จำเป็นสำหรับการรวบรวมโมดูล เนื่องจากบางโมดูลถูกนำไปใช้ในภาษา C + + และเชื่อมต่อกับ Python ณ รันไทม์เป็นโมดูลไบนารี
  • freetype-dev - การพึ่งพาโมดูล Python Matplotlib

การติดตั้งการอ้างอิง:

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

มีปัญหาหนึ่ง: ในสถานะปัจจุบันของการแจกจ่าย Alpine Linux จะไม่สามารถคอมไพล์ NumPy เวอร์ชันใหม่ได้ ข้อผิดพลาดในการคอมไพล์จะปรากฏขึ้นโดยฉันไม่สามารถแก้ไขได้:

ข้อผิดพลาด: ไม่สามารถสร้างล้อสำหรับ numpy ที่ใช้ PEP 517 และไม่สามารถติดตั้งโดยตรงได้

ดังนั้นเราจะติดตั้งโมดูลนี้เป็นแพ็คเกจระบบที่เผยแพร่เวอร์ชันที่คอมไพล์แล้ว แต่เก่ากว่าที่มีอยู่ในไซต์ปัจจุบันเล็กน้อย:

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

ถัดไป ติดตั้งโมดูล Python ผ่านตัวจัดการแพ็คเกจ pip. โปรดอดใจรอเนื่องจากบางโมดูลจะรวบรวมและอาจใช้เวลาสักครู่ บนเครื่องของฉัน การรวบรวมใช้เวลาประมาณ 15 นาที:

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

การล้างแคชการติดตั้ง:

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

การทดสอบโมดูลใน JupyterLab ^

หากคุณกำลังวิ่ง จูปิเตอร์แล็บให้รีสตาร์ทเพื่อให้โมดูลที่ติดตั้งใหม่เปิดใช้งานได้ เมื่อต้องการทำเช่นนี้ ในเซสชันคอนโซล คลิก 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 สร้างองค์ประกอบ UI บนหน้าที่โต้ตอบกับซอร์สโค้ดและด้วย Matplotlib แสดงผลลัพธ์ของโค้ดในรูปของรูปภาพเป็นกราฟฟังก์ชัน:

ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

ตัวอย่างมากมาย IPyWidgets คุณสามารถค้นหาได้ในบทช่วยสอน ที่นี่

อะไรอีก? ^

ทำได้ดีมากถ้าคุณอยู่และมาถึงส่วนท้ายสุดของบทความ ฉันไม่ได้ตั้งใจโพสต์สคริปต์สำเร็จรูปในตอนท้ายของบทความที่จะติดตั้ง จูปิเตอร์แล็บ ใน "คลิกเดียว" เพื่อให้กำลังใจคนงาน :) แต่คุณสามารถทำได้ด้วยตัวเองเนื่องจากคุณรู้วิธีอยู่แล้วโดยรวบรวมคำสั่งไว้ในสคริปต์ Bash เดียว :)

นอกจากนี้คุณยังสามารถ:

  • ตั้งชื่อเครือข่ายสำหรับคอนเทนเนอร์แทนที่อยู่ IP โดยการเขียนด้วยวิธีง่ายๆ /etc/hosts และพิมพ์ที่อยู่ในเบราว์เซอร์ http://jupyter.local:8888
  • ลองเล่นกับขีดจำกัดทรัพยากรสำหรับคอนเทนเนอร์ เพื่ออ่านเนื้อหาในบทนี้ ความสามารถพื้นฐานของ LXD หรือรับข้อมูลเพิ่มเติมเกี่ยวกับไซต์นักพัฒนา LXD
  • เปลี่ยนธีม:

ส่งดาวพฤหัสบดีขึ้นสู่วงโคจร LXD

และอีกมากมายที่คุณสามารถทำได้! นั่นคือทั้งหมดที่ ฉันขอให้คุณประสบความสำเร็จ!

อัปเดต: 15.04.2020/18/30 XNUMX:XNUMX - แก้ไขข้อผิดพลาดในบท “Hello, World!”
อัปเดต: 16.04.2020/10/00 XNUMX:XNUMX — แก้ไขและเพิ่มข้อความในคำอธิบายการเปิดใช้งานตัวจัดการส่วนขยาย จูปิเตอร์แล็บ
อัปเดต: 16.04.2020/10/40 XNUMX:XNUMX — พบข้อผิดพลาดที่แก้ไขในข้อความและเปลี่ยนแปลงเล็กน้อยให้ดีขึ้นในบท “การติดตั้งซอฟต์แวร์พื้นฐานและการตั้งค่าระบบ”

ที่มา: will.com

เพิ่มความคิดเห็น