คุณเคยทดลองกับโค้ดหรือยูทิลิตี้ระบบใน Linux เพื่อที่จะไม่ต้องกังวลกับระบบฐานและไม่ต้องรื้อทุกอย่างในกรณีที่มีข้อผิดพลาดในโค้ดที่ควรทำงานด้วยสิทธิ์รูทหรือไม่?
แต่แล้วข้อเท็จจริงที่สมมติว่าคุณต้องทดสอบหรือรันไมโครเซอร์วิสต่างๆ ทั้งคลัสเตอร์บนเครื่องเดียวล่ะ? ร้อยหรือพัน?
ด้วยเครื่องเสมือนที่จัดการโดยไฮเปอร์ไวเซอร์ ปัญหาดังกล่าวสามารถแก้ไขได้และจะแก้ไข แต่จะมีค่าใช้จ่ายเท่าไร? ตัวอย่างเช่น คอนเทนเนอร์ใน LXD ที่ใช้การกระจาย Alpine Linux จะใช้เท่านั้น 7.60MB
RAM และตำแหน่งที่พาร์ติชันรูทอยู่หลังจากเริ่มต้นระบบ 9.5MB
! คุณชอบสิ่งนั้นมากแค่ไหน Elon Musk? ฉันแนะนำให้เช็คเอาท์ ความสามารถพื้นฐานของ LXD - ระบบคอนเทนเนอร์ใน Linux
หลังจากที่ชัดเจนโดยทั่วไปแล้วว่าคอนเทนเนอร์ LXD คืออะไร เรามาดูกันดีกว่าว่าจะมีแพลตฟอร์มเครื่องเก็บเกี่ยวที่คุณสามารถเรียกใช้โค้ดสำหรับโฮสต์ได้อย่างปลอดภัย สร้างกราฟ เชื่อมโยงวิดเจ็ต UI แบบไดนามิก (เชิงโต้ตอบ) กับโค้ดของคุณ เสริมโค้ดด้วยข้อความที่มีแบล็คแจ็ค... การจัดรูปแบบ? บล็อกเชิงโต้ตอบบางประเภทเหรอ? ว้าว... อยากได้! ต้องการ! 🙂
ดูใต้แมวที่เราจะปล่อยในภาชนะ จูปิเตอร์แล็บ - ส่วนต่อประสานผู้ใช้รุ่นต่อไปแทนที่จะเป็น Jupyter Notebook ที่ล้าสมัย และเราจะติดตั้งโมดูล Python เช่น นำพาย, นุ่น, Matplotlib, IPyWidgets ซึ่งจะช่วยให้คุณสามารถทำทุกอย่างที่ระบุไว้ข้างต้นและบันทึกทั้งหมดไว้ในไฟล์พิเศษ - แล็ปท็อป IPython
การเดินเรือ
- แผนการบินขึ้นของวงโคจร
- การติดตั้งและการกำหนดค่าระบบพื้นฐาน
- ติดตั้งซอฟต์แวร์พื้นฐานและตั้งค่าระบบ
- การติดตั้งและกำหนดค่า JupyterLab
- การแชร์ข้อมูลกับโฮสต์
- สวัสดีชาวโลก!
- ขยายขีดความสามารถของ Python
- การทดสอบโมดูลใน JupyterLab
- อะไรอีก?
แผนการบินขึ้นของวงโคจร ^
มาร่างแผนปฏิบัติการสั้นๆ เพื่อให้เราดำเนินการตามแผนข้างต้นได้ง่ายขึ้น:
- มาติดตั้งและเปิดใช้งานคอนเทนเนอร์ตามชุดการแจกจ่ายกันดีกว่า อัลไพน์ลินุกซ์. เราจะใช้การแจกจ่ายนี้เนื่องจากมีจุดมุ่งหมายเพื่อความเรียบง่ายและจะติดตั้งเฉพาะซอฟต์แวร์ที่จำเป็นที่สุดเท่านั้นไม่มีอะไรฟุ่มเฟือย
- มาเพิ่มดิสก์เสมือนเพิ่มเติมในคอนเทนเนอร์แล้วตั้งชื่อให้ -
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
— โทรหาลูกค้า LXDexec
- วิธีการไคลเอ็นต์ LXD ที่รันคำสั่งในคอนเทนเนอร์jupyterlab
— รหัสคอนเทนเนอร์--
- คีย์พิเศษที่ระบุว่าจะไม่ตีความคีย์เพิ่มเติมว่าเป็นคีย์สำหรับlxc
และส่งสตริงที่เหลือตามที่เป็นอยู่ไปยังคอนเทนเนอร์apk
— ตัวจัดการแพ็คเกจการแจกจ่าย Alpine Linuxadd
— วิธีการจัดการแพ็คเกจที่ติดตั้งแพ็คเกจที่ระบุหลังคำสั่ง
ต่อไปเราจะกำหนดเขตเวลาในระบบ 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
— ธีม UIjupyterlab_neon_theme
— ธีม UIjupyterlab-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 และในหน้าที่เปิดเข้าไป โทเค็น การเข้าถึงที่คุณจะเห็นในคอนโซล คัดลอกและวางลงบนหน้า จากนั้นคลิก เข้าสู่ระบบ. หลังจากเข้าสู่ระบบแล้ว ให้ไปที่เมนูส่วนขยายทางด้านซ้าย ดังแสดงในรูปด้านล่าง ซึ่งเมื่อเปิดใช้งานตัวจัดการส่วนขยาย คุณจะได้รับแจ้งให้รับความเสี่ยงด้านความปลอดภัยโดยการติดตั้งส่วนขยายจากบุคคลที่สามซึ่งคำสั่ง การพัฒนาจูปิเตอร์แล็บ ไม่รับผิดชอบ:
อย่างไรก็ตาม เรากำลังแยกส่วนทั้งหมดออกจากกัน จูปิเตอร์แล็บ และวางไว้ในคอนเทนเนอร์เพื่อให้ส่วนขยายของบุคคลที่สามที่ต้องการและใช้ 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 และสร้างแล็ปท็อปเครื่องแรกของคุณโดยคลิกที่ปุ่มบนหน้าดังภาพด้านล่าง:
จากนั้นในช่องบนหน้า ให้ป้อนโค้ด Python ที่จะแสดงโค้ดคลาสสิก Hello World!
. เมื่อเข้าเสร็จแล้วให้กด CTRL+ENTER
หรือปุ่ม "เล่น" บนแถบเครื่องมือที่ด้านบนเพื่อให้ JupyterLab ทำสิ่งนี้:
ณ จุดนี้ เกือบทุกอย่างพร้อมใช้งานแล้ว แต่จะไม่น่าสนใจหากเราไม่ติดตั้งโมดูล Python เพิ่มเติม (แอปพลิเคชันเต็มรูปแบบ) ที่สามารถขยายขีดความสามารถมาตรฐานของ Python ได้อย่างมาก จูปิเตอร์แล็บเรามาต่อกันดีกว่า :)
ป.ล. สิ่งที่น่าสนใจก็คือการใช้งานแบบเก่า ดาวพฤหัสบดี ภายใต้สมญานาม โน้ตบุ๊ค Jupyter มิได้หายไปและดำรงอยู่ควบคู่กับ จูปิเตอร์แล็บ. หากต้องการเปลี่ยนไปใช้เวอร์ชันเก่า ให้ไปที่ลิงก์โดยเพิ่มส่วนต่อท้ายในที่อยู่/tree
และการเปลี่ยนไปใช้เวอร์ชันใหม่จะดำเนินการโดยใช้คำต่อท้าย /lab
แต่ไม่จำเป็นต้องระบุ:
- สมุดบันทึกจูปิเตอร์ - http://10.0.5.5:8888/tree
- จูปิเตอร์ แล็บ - http://10.0.5.5:8888/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 แสดงผลลัพธ์ของโค้ดในรูปของรูปภาพเป็นกราฟฟังก์ชัน:
ตัวอย่างมากมาย IPyWidgets คุณสามารถค้นหาได้ในบทช่วยสอน ที่นี่
อะไรอีก? ^
ทำได้ดีมากถ้าคุณอยู่และมาถึงส่วนท้ายสุดของบทความ ฉันไม่ได้ตั้งใจโพสต์สคริปต์สำเร็จรูปในตอนท้ายของบทความที่จะติดตั้ง จูปิเตอร์แล็บ ใน "คลิกเดียว" เพื่อให้กำลังใจคนงาน :) แต่คุณสามารถทำได้ด้วยตัวเองเนื่องจากคุณรู้วิธีอยู่แล้วโดยรวบรวมคำสั่งไว้ในสคริปต์ Bash เดียว :)
นอกจากนี้คุณยังสามารถ:
- ตั้งชื่อเครือข่ายสำหรับคอนเทนเนอร์แทนที่อยู่ IP โดยการเขียนด้วยวิธีง่ายๆ
/etc/hosts
และพิมพ์ที่อยู่ในเบราว์เซอร์ http://jupyter.local:8888 - ลองเล่นกับขีดจำกัดทรัพยากรสำหรับคอนเทนเนอร์ เพื่ออ่านเนื้อหาในบทนี้ ความสามารถพื้นฐานของ 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