คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux

คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux

แอลเอ็กซ์ดี เป็นตัวจัดการคอนเทนเนอร์ระบบรุ่นต่อไป ดังนั้นจึงกล่าวได้ แหล่ง. มันมีอินเทอร์เฟซผู้ใช้ที่คล้ายกับเครื่องเสมือน แต่ใช้คอนเทนเนอร์ Linux แทน

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

ในบทความนี้เราจะไม่กล่าวถึงรายละเอียดเกี่ยวกับแนวคิดของ LXD เราจะไม่พิจารณาความสามารถที่มีอยู่ทั้งหมดที่ระบุไว้ในเอกสารประกอบรวมถึงการใช้งานล่าสุดในการสนับสนุน LXD เวอร์ชันล่าสุดสำหรับเครื่องเสมือน QEMU ควบคู่ไปกับคอนเทนเนอร์ แต่เราจะเรียนรู้เพียงพื้นฐานของการจัดการคอนเทนเนอร์ เช่น การตั้งค่าพูลพื้นที่จัดเก็บข้อมูล การสร้างเครือข่าย การเรียกใช้คอนเทนเนอร์ การใช้ขีดจำกัดทรัพยากร และวิธีการใช้สแนปช็อตเพื่อให้คุณมีความเข้าใจพื้นฐานเกี่ยวกับ LXD และใช้คอนเทนเนอร์บน Linux

สำหรับข้อมูลทั้งหมด โปรดดูแหล่งที่มาอย่างเป็นทางการ:

การเดินเรือ

การติดตั้ง LXD ^

การติดตั้ง LXD บนการกระจาย Ubuntu ^

ในแพ็คเกจการแจกจ่าย Ubuntu 19.10 lxd มีการออกอากาศอยู่ สแน็ปแพ็คเกจ:

apt search lxd

lxd/eoan 1:0.7 all
  Transitional package - lxd -> snap (lxd)

ซึ่งหมายความว่าจะมีการติดตั้งสองแพ็คเกจพร้อมกัน หนึ่งแพ็คเกจเป็นแพ็คเกจระบบ และอีกแพ็คเกจหนึ่งเป็นแพ็คเกจ snap การติดตั้งสองแพ็คเกจบนระบบอาจสร้างปัญหาบางอย่างที่แพ็คเกจระบบอาจกลายเป็นเด็กกำพร้าหากแพ็คเกจ snap ถูกลบออกโดยตัวจัดการแพ็คเกจ snap

ค้นหาแพ็คเกจ lxd ในที่เก็บ snap คุณสามารถใช้คำสั่งต่อไปนี้:

snap find lxd

Name             Version        Summary
lxd              3.21           System container manager and API
lxd-demo-server  0+git.6d54658  Online software demo sessions using LXD
nova             ocata          OpenStack Compute Service (nova)
nova-hypervisor  ocata          OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder    1.0            Image builder for LXC and LXD
fabrica          0.1            Build snaps by simply pointing a web form to...
satellite        0.1.2          Advanced scalable Open source intelligence platform

โดยการรันคำสั่ง list คุณสามารถมั่นใจได้ว่าแพ็คเกจ lxd ยังไม่ได้ติดตั้ง:

snap list

Name  Version    Rev   Tracking  Publisher   Notes
core  16-2.43.3  8689  stable    canonical✓  core

แม้ว่า LXD จะเป็นแพ็คเกจแบบ snap แต่จะต้องติดตั้งผ่านแพ็คเกจระบบ lxdซึ่งจะสร้างกลุ่มที่สอดคล้องกันในระบบสาธารณูปโภคที่จำเป็นค่ะ /usr/bin เป็นต้น

sudo apt update
sudo apt install lxd

ตรวจสอบให้แน่ใจว่าได้ติดตั้งแพ็คเกจเป็นแพ็คเกจ snap:

snap list

Name  Version    Rev    Tracking  Publisher   Notes
core  16-2.43.3  8689   stable    canonical✓  core
lxd   3.21       13474  stable/…  canonical✓  -

การติดตั้ง LXD บนการกระจาย Arch Linux ^

ในการติดตั้งแพ็คเกจ LXD บนระบบ คุณจะต้องรันคำสั่งต่อไปนี้ โดยคำสั่งแรกจะอัพเดตรายการแพ็คเกจบนระบบที่มีอยู่ในที่เก็บ ส่วนคำสั่งที่สองจะติดตั้งแพ็คเกจโดยตรง:

sudo pacman -Syyu && sudo pacman -S lxd

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

sudo usermod -a -G lxd user1

มาทำให้แน่ใจว่าผู้ใช้ user1 เพิ่มเข้าในกลุ่ม lxd:

id -Gn user1

user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd

ถ้ากลุ่ม lxd ไม่ปรากฏในรายการ คุณต้องเปิดใช้งานเซสชันผู้ใช้อีกครั้ง ในการดำเนินการนี้ คุณต้องออกจากระบบและเข้าสู่ระบบโดยใช้ผู้ใช้คนเดียวกัน

เปิดใช้งานใน systemd กำลังโหลดบริการ LXD เมื่อเริ่มต้นระบบ:

sudo systemctl enable lxd

มาเริ่มบริการกัน:

sudo systemctl start lxd

การตรวจสอบสถานะการบริการ:

sudo systemctl status lxd

อุปกรณ์จัดเก็บข้อมูล LXD (อุปกรณ์จัดเก็บข้อมูล) ^

ก่อนที่จะเริ่มต้นการเริ่มต้น เราต้องเข้าใจว่าการจัดเก็บข้อมูลใน LXD ถูกจัดเรียงอย่างมีเหตุผลอย่างไร

พื้นที่จัดเก็บ (พื้นที่จัดเก็บ) ประกอบด้วย จากหนึ่งหรือมากกว่านั้น สระจัดเก็บ ซึ่งใช้หนึ่งในระบบไฟล์ที่รองรับ เช่น ZFS, BTRFS, LVM หรือไดเร็กทอรีปกติ ทั้งหมด สระจัดเก็บ แบ่งออกเป็นเล่ม (ปริมาณการจัดเก็บ) ที่มีรูปภาพ คอนเทนเนอร์ หรือข้อมูลเพื่อวัตถุประสงค์อื่น

  • ภาพ - เป็นการแจกแจงที่ประกอบขึ้นเป็นพิเศษโดยไม่มีเคอร์เนล Linux และหาได้จากแหล่งภายนอก
  • ตู้คอนเทนเนอร์ - สิ่งเหล่านี้เป็นการแจกแจงจากรูปภาพที่พร้อมใช้งาน
  • สแนปชอต - นี่คือภาพรวมของสถานะของคอนเทนเนอร์ที่คุณสามารถกลับมาได้

คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux

ในการจัดการพื้นที่เก็บข้อมูลใน LXD ให้ใช้คำสั่ง lxc storage ใบรับรองที่คุณสามารถรับได้โดยการระบุรหัส - lxc storage --help

คำสั่งต่อไปนี้แสดงรายการทั้งหมด สระจัดเก็บ ในที่เก็บข้อมูล LXD:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 2       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 4       |
+---------+-------------+--------+--------------------------------+---------+

เพื่อดูรายการทั้งหมด ปริมาณการจัดเก็บ ในการเลือก สระจัดเก็บ ทำหน้าที่ทีม lxc storage volume list:

lxc storage volume list hddpool

+-------+----------------------------------+-------------+---------+
| TYPE  |          NAME                    | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... |             | 1       |
+-------+----------------------------------+-------------+---------+

lxc storage volume list ssdpool

+-----------+----------------------------------+-------------+---------+
|   TYPE    |            NAME                  | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3                             |             | 1       |
+-----------+----------------------------------+-------------+---------+
| container | jupyter                          |             | 1       |
+-----------+----------------------------------+-------------+---------+
| image     | ebd565585223487526ddb3607f515... |             | 1       |
+-----------+----------------------------------+-------------+---------+

นอกจากนี้หากเพื่อ สระจัดเก็บ เมื่อสร้าง ระบบไฟล์ BTRFS จะถูกเลือก จากนั้นรับรายการ ปริมาณการจัดเก็บ หรือ ปริมาณย่อย ในการตีความ BTRFS คุณสามารถใช้ชุดเครื่องมือของระบบไฟล์นี้:

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool

ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool

ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3

กำลังเริ่มต้น LXD ^

ก่อนที่จะสร้างและใช้คอนเทนเนอร์ คุณต้องดำเนินการเริ่มต้น LXD ทั่วไปที่สร้างและกำหนดค่าเครือข่ายและพื้นที่เก็บข้อมูล ซึ่งสามารถทำได้ด้วยตนเองโดยใช้คำสั่งไคลเอ็นต์มาตรฐานที่มีอยู่ในรายการโดยการเรียกคำสั่ง lxc --help หรือใช้ตัวช่วยสร้างการเริ่มต้น lxd init ตอบคำถามสองสามข้อ

การเลือกระบบไฟล์สำหรับพูลหน่วยเก็บข้อมูล ^

ในระหว่างการเริ่มต้น LXD จะถามคำถามหลายข้อ รวมถึงการกำหนดประเภทระบบไฟล์สำหรับค่าเริ่มต้น สระจัดเก็บ. ตามค่าเริ่มต้น ระบบไฟล์ BTRFS จะถูกเลือกไว้ หลังจากสร้างแล้วจะไม่สามารถเปลี่ยนเป็น FS อื่นได้. แนะนำให้เลือก FS ตารางเปรียบเทียบคุณสมบัติ:

ลักษณะ
ค้นหาสถานที่
Btrfs
LVM
ZFS
ซีฟ

เพิ่มประสิทธิภาพการจัดเก็บภาพ
ไม่
ใช่
ใช่
ใช่
ใช่

การสร้างอินสแตนซ์ที่ปรับให้เหมาะสม
ไม่
ใช่
ใช่
ใช่
ใช่

การสร้างสแน็ปช็อตที่ปรับให้เหมาะสม
ไม่
ใช่
ใช่
ใช่
ใช่

การถ่ายโอนภาพที่ดีที่สุด
ไม่
ใช่
ไม่
ใช่
ใช่

การถ่ายโอนอินสแตนซ์ที่ปรับให้เหมาะสม
ไม่
ใช่
ไม่
ใช่
ใช่

คัดลอกในการเขียน
ไม่
ใช่
ใช่
ใช่
ใช่

อิงบล็อก
ไม่
ไม่
ใช่
ไม่
ใช่

การโคลนนิ่งทันที
ไม่
ใช่
ใช่
ใช่
ใช่

ไดรเวอร์การจัดเก็บข้อมูลที่ใช้งานได้ภายในคอนเทนเนอร์
ใช่
ใช่
ไม่
ไม่
ไม่

กู้คืนจากสแน็ปช็อตเก่า (ไม่ใช่ล่าสุด)
ใช่
ใช่
ใช่
ไม่
ใช่

โควต้าพื้นที่เก็บข้อมูล
ใช่(*)
ใช่
ใช่
ใช่
ไม่

การเริ่มต้นเครือข่ายและพูลหน่วยเก็บข้อมูลโดยใช้วิซาร์ด ^

คำสั่งถัดไปที่เราจะดูจะแนะนำการตั้งค่าส่วนประกอบหลักของ LXD โดยการตอบคำถามง่ายๆ โดยใช้วิซาร์ดการเริ่มต้น

เรียกใช้คำสั่ง lxc init และป้อนคำตอบของคำถามหลังเครื่องหมายทวิภาคตามตัวอย่างด้านล่างหรือเปลี่ยนแปลงตามเงื่อนไขของคุณ:

lxd init

Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: ssdpool         
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing block device? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

การสร้างพูลหน่วยเก็บข้อมูลเพิ่มเติม ^

ในขั้นตอนก่อนหน้าที่เราสร้างขึ้น สระจัดเก็บ ซึ่งได้รับพระนามว่า ssdpool และไฟล์ที่อยู่ในระบบของฉันที่ /var/lib/lxd/disks/ssdpool.img. ที่อยู่ระบบไฟล์นี้สอดคล้องกับไดรฟ์ SSD จริงในพีซีของฉัน

การดำเนินการต่อไปนี้เพื่อเพิ่มความเข้าใจในบทบาทที่เล่นโดย สระจัดเก็บ ในพื้นที่เก็บข้อมูล เราจะสร้างอันที่สองขึ้นมา สระจัดเก็บ ซึ่งจะอยู่ในดิสก์ประเภทอื่น HDD ปัญหาคือ LXD ไม่อนุญาตให้คุณสร้าง สระจัดเก็บ อยู่นอกที่อยู่ /var/lib/lxd/disks/ และแม้แต่ลิงก์สัญลักษณ์ก็ไม่ทำงาน ดูการตอบสนองของนักพัฒนา. เราสามารถข้ามข้อจำกัดนี้ระหว่างการเริ่มต้น/การจัดรูปแบบได้ สระจัดเก็บ โดยระบุค่าเป็นอุปกรณ์บล็อกแทนเส้นทางไปยังไฟล์ลูปแบ็คโดยระบุสิ่งนี้ในคีย์ source.

ดังนั้นก่อนที่จะสร้าง สระจัดเก็บ คุณต้องกำหนดไฟล์ลูปแบ็คหรือพาร์ติชันที่มีอยู่ในระบบไฟล์ของคุณที่จะใช้ ในการดำเนินการนี้ เราจะสร้างและใช้ไฟล์ที่เราจะจำกัดขนาดไว้ที่ 10GB:

dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000

10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s

มาเชื่อมต่อไฟล์ลูปแบ็คกับอุปกรณ์ลูปแบ็คฟรี:

sudo losetup --find --show /mnt/work/lxd/hddpool.img

/dev/loop1

ขอบคุณกุญแจ --show การดำเนินการคำสั่งจะส่งคืนชื่ออุปกรณ์ที่เชื่อมต่อไฟล์ลูปแบ็คของเราไปที่หน้าจอ หากจำเป็น เราสามารถแสดงรายการอุปกรณ์ที่ไม่ว่างประเภทนี้ทั้งหมดเพื่อให้แน่ใจว่าการกระทำของเราถูกต้อง:

losetup -l

NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                      DIO LOG-SEC
/dev/loop1         0      0         0  0 /mnt/work/lxd/hddpool.img        0     512
/dev/loop0         0      0         1  0 /var/lib/lxd/disks/ssdpool.img   0     512

จากรายการจะพบว่าอุปกรณ์ดังกล่าวมี /dev/loop1 รวมไฟล์ลูปแบ็ค /mnt/work/lxd/hddpool.imgและในเครื่อง /dev/loop0 รวมไฟล์ลูปแบ็ค /var/lib/lxd/disks/ssdpool.img ซึ่งสอดคล้องกับค่าเริ่มต้น สระจัดเก็บ.

คำสั่งต่อไปนี้จะสร้างคำสั่งใหม่ สระจัดเก็บ ใน LXD ตามไฟล์ลูปแบ็คที่เราเพิ่งเตรียมไว้ LXD จะฟอร์แมตไฟล์ลูปแบ็ค /mnt/work/lxd/hddpool.img ในอุปกรณ์ /dev/loop1 สำหรับระบบไฟล์ BTRFS:

lxc storage create hddpool btrfs size=10GB source=/dev/loop1

มาแสดงรายการทั้งหมดกัน สระจัดเก็บ ไปที่หน้าจอ:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 0       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 0       |
+---------+-------------+--------+--------------------------------+---------+

การเพิ่มขนาดพูลหน่วยเก็บข้อมูล ^

หลังการสร้างสรรค์ สระจัดเก็บหากจำเป็นก็สามารถขยายได้ สำหรับ สระจัดเก็บ ขึ้นอยู่กับระบบไฟล์ BTRFS ให้รันคำสั่งต่อไปนี้:

sudo truncate -s +5G /mnt/work/lxd/hddpool.img
sudo losetup -c /dev/loop1
sudo btrfs filesystem resize max /var/lib/lxd/storage-pools/hddpool

การแทรกไฟล์ลูปแบ็คลงในช่องอุปกรณ์ลูปแบ็คโดยอัตโนมัติ ^

เรามีปัญหาเล็ก ๆ อย่างหนึ่งเมื่อรีบูตระบบโฮสต์ไฟล์ /mnt/work/lxd/hddpool.img จะ "บิน" ออกจากเครื่อง /dev/loop1 และบริการ LXD จะขัดข้องเมื่อโหลดเพราะจะไม่เห็นในอุปกรณ์นี้ เพื่อแก้ไขปัญหานี้ คุณต้องสร้างบริการระบบที่จะแทรกไฟล์นี้ลงในอุปกรณ์ /dev/loop1 เมื่อระบบโฮสต์บูท

มาสร้างกันเถอะ หน่วย ประเภทไฟล์ บริการ в /etc/systemd/system/ สำหรับระบบการกำหนดค่าเริ่มต้น SystemD:

cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true

[Install]
WantedBy=local-fs.target
EOF

เปิดใช้งานบริการ:

sudo systemctl enable lxd-hddpool

Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

หลังจากรีสตาร์ทระบบโฮสต์ เราจะตรวจสอบสถานะการบริการ:

systemctl status lxd-hddpool.service 

● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
     Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
     Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
    Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
   Main PID: 711 (code=exited, status=0/SUCCESS)

апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).

จากผลลัพธ์ที่เราสามารถตรวจสอบได้ว่าสถานะการบริการเป็น คล่องแคล่วแม้ว่าการดำเนินการสคริปต์ของเราจากคำสั่งเดียวจะเสร็จสิ้นแล้ว แต่ตัวเลือกดังกล่าวก็อนุญาตให้เราทำสิ่งนี้ได้ RemainAfterExit=true.

ความปลอดภัย. สิทธิพิเศษของคอนเทนเนอร์ ^

เนื่องจากจริง ๆ แล้วกระบวนการคอนเทนเนอร์ทั้งหมดทำงานแบบแยกบนระบบโฮสต์โดยใช้เคอร์เนล เพื่อปกป้องการเข้าถึงกระบวนการคอนเทนเนอร์ไปยังระบบโฮสต์เพิ่มเติม LXD จึงเสนอสิทธิพิเศษของกระบวนการโดยที่:

  • คอนเทนเนอร์สิทธิพิเศษ - สิ่งเหล่านี้คือคอนเทนเนอร์ที่กระบวนการที่มี UID และ GID สอดคล้องกับเจ้าของคนเดียวกันกับในระบบโฮสต์ ตัวอย่างเช่น กระบวนการที่ทำงานในคอนเทนเนอร์ที่มี UID เป็น 0 มีสิทธิ์การเข้าถึงเหมือนกันทั้งหมดกับกระบวนการบนระบบโฮสต์ที่มี UID เป็น 0 กล่าวอีกนัยหนึ่ง ผู้ใช้รูทในคอนเทนเนอร์มีสิทธิ์ทั้งหมดไม่เพียงแต่ใน คอนเทนเนอร์ แต่ยังอยู่บนระบบโฮสต์ด้วยหากเขาสามารถออกไปนอกเนมสเปซที่แยกออกจากคอนเทนเนอร์ได้

  • คอนเทนเนอร์ที่ไม่มีสิทธิพิเศษ - สิ่งเหล่านี้คือคอนเทนเนอร์ที่กระบวนการเป็นของเจ้าของ UID และ GID ด้วยตัวเลขตั้งแต่ 0 ถึง 65535 แต่สำหรับระบบโฮสต์ เจ้าของจะถูกมาสก์โดยใช้บิต SubUID และ SubGID ที่เพิ่มเข้ามาตามลำดับ ตัวอย่างเช่น ผู้ใช้ที่มี UID=0 ในคอนเทนเนอร์จะถูกมองเห็นบนระบบโฮสต์เป็น SubUID + UID. สิ่งนี้จะปกป้องระบบโฮสต์เพราะหากกระบวนการใดๆ ในคอนเทนเนอร์สามารถหลบหนีเนมสเปซที่แยกออกมาได้ กระบวนการนั้นจะสามารถสื่อสารกับระบบโฮสต์เป็นกระบวนการที่มี UID/GID ที่ไม่รู้จักและสูงมากเท่านั้น

ตามค่าเริ่มต้น คอนเทนเนอร์ที่สร้างขึ้นใหม่จะมีสถานะไม่มีสิทธิพิเศษ ดังนั้น เราจึงต้องกำหนด SubUID และ SubGID

มาสร้างไฟล์คอนฟิกูเรชันสองไฟล์ซึ่งเราจะตั้งค่ามาสก์สำหรับ SubUID และ SubGID ตามลำดับ:

sudo touch /etc{/subuid,/subgid}
sudo usermod --add-subuids 1000000-1065535 root 
sudo usermod --add-subgids 1000000-1065535 root

หากต้องการใช้การเปลี่ยนแปลง ต้องเริ่มบริการ LXD ใหม่:

sudo systemctl restart lxd

การสร้างสวิตช์เครือข่ายเสมือน ^

เนื่องจากก่อนหน้านี้เราเริ่มต้นเครือข่ายโดยใช้วิซาร์ดการเริ่มต้น lxd init และสร้างอุปกรณ์เครือข่าย lxdbr0จากนั้นในส่วนนี้เราจะทำความคุ้นเคยกับระบบเครือข่ายใน LXD และวิธีสร้างสวิตช์เสมือน (บริดจ์) โดยใช้คำสั่งไคลเอนต์

แผนภาพต่อไปนี้สาธิตวิธีที่สวิตช์ (บริดจ์) เชื่อมต่อโฮสต์และคอนเทนเนอร์เข้ากับเครือข่าย:

คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux

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

คำสั่งต่อไปนี้จะสร้างสวิตช์ด้วยซับเน็ต 10.0.5.0/24 และที่อยู่ IPv4 10.0.5.1/24และยังรวมถึง ipv4.nat เพื่อให้คอนเทนเนอร์สามารถเข้าถึงอินเทอร์เน็ตผ่านโฮสต์โดยใช้บริการ NAT:

lxc network create lxdbr0 ipv4.address=10.0.5.1/24 ipv4.nat=true ipv6.address=none

การตรวจสอบรายการอุปกรณ์เครือข่ายที่มีอยู่ใน LXD:

lxc network list

+--------+----------+---------+-------------+---------+
|  NAME  |   TYPE   | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| eno1   | physical | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
| lxdbr0 | bridge   | YES     |             | 0       |
+--------+----------+---------+-------------+---------+

คุณยังสามารถตรวจสอบได้ว่าอุปกรณ์เครือข่ายถูกสร้างขึ้นโดยใช้เครื่องมือมาตรฐานของการแจกจ่าย Linux - ip link หรือ ip addr:

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:ee:7b:5a:6b:44 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet6 fe80::9571:11f3:6e0c:c07b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c2:38:90:df:cb:59 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::c038:90ff:fedf:cb59/64 scope link 
       valid_lft forever preferred_lft forever
5: veth3ddab174@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether ca:c3:5c:1d:22:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0

โปรไฟล์การกำหนดค่า ^

แต่ละคอนเทนเนอร์ใน LXD มีการกำหนดค่าของตัวเองและสามารถขยายได้ด้วยการกำหนดค่าที่ประกาศทั่วโลกที่เรียกว่า โปรไฟล์การกำหนดค่า. การใช้โปรไฟล์การกำหนดค่ากับคอนเทนเนอร์มีโมเดลแบบเรียงซ้อน ตัวอย่างต่อไปนี้สาธิตสิ่งนี้:

คุณสมบัติพื้นฐานของ LXD - ระบบคอนเทนเนอร์ Linux

ในตัวอย่างนี้ มีการสร้างโปรไฟล์สามโปรไฟล์ในระบบ LXD: default, hddpool и hostfs. โปรไฟล์ทั้งสามจะถูกนำไปใช้กับคอนเทนเนอร์ที่มีการกำหนดค่าภายในเครื่อง (พื้นที่สีเทา) ประวัติโดยย่อ default มีอุปกรณ์ root ซึ่งมีพารามิเตอร์ pool เป็น ssdpoolแต่ต้องขอบคุณโมเดลแอปพลิเคชันการกำหนดค่าแบบเรียงซ้อน เราจึงสามารถใช้โปรไฟล์กับคอนเทนเนอร์ได้ hddpool ซึ่งมีพารามิเตอร์ pool จะแทนที่พารามิเตอร์เดียวกันจากโปรไฟล์ default และคอนเทนเนอร์จะได้รับการกำหนดค่าอุปกรณ์ root ด้วยพารามิเตอร์ pool เท่ากัน hddpoolและโปรไฟล์ hostfs เพียงเพิ่มอุปกรณ์ใหม่ลงในคอนเทนเนอร์

หากต้องการดูรายการโปรไฟล์การกำหนดค่าที่มีอยู่ ให้ใช้คำสั่งต่อไปนี้:

lxc profile list

+---------+---------+
|  NAME   | USED BY |
+---------+---------+
| default | 1       |
+---------+---------+
| hddroot | 0       |
+---------+---------+
| ssdroot | 1       |
+---------+---------+

สามารถรับรายการคำสั่งทั้งหมดสำหรับการทำงานกับโปรไฟล์ได้โดยการเพิ่มคีย์ --help:

lxc profile --help

Description:
  Manage profiles

Usage:
  lxc profile [command]

Available Commands:
  add         Add profiles to instances
  assign      Assign sets of profiles to instances
  copy        Copy profiles
  create      Create profiles
  delete      Delete profiles
  device      Manage instance devices
  edit        Edit profile configurations as YAML
  get         Get values for profile configuration keys
  list        List profiles
  remove      Remove profiles from instances
  rename      Rename profiles
  set         Set profile configuration keys
  show        Show profile configurations
  unset       Unset profile configuration keys

การแก้ไขโปรไฟล์ของคุณ ^

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

คำสั่งต่อไปนี้จะเพิ่มอุปกรณ์ลงในโปรไฟล์การกำหนดค่า eth0 ชนิด nic เชื่อมต่อกับเครือข่าย lxdbr0:

lxc profile device add default eth0 nic network=lxdbr0 name=eth0

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

มาตรวจสอบโปรไฟล์กัน:

lxc profile show default

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: ssdpool
    type: disk
name: default
used_by: []

ในโปรไฟล์นี้ เราจะเห็นว่าสำหรับคอนเทนเนอร์ที่สร้างขึ้นใหม่ทั้งหมด จะมีการสร้างอุปกรณ์สองเครื่อง:

  • eth0 — ประเภทอุปกรณ์ nic เชื่อมต่อกับสวิตช์ (บริดจ์เครือข่าย) lxdbr0
  • root — ประเภทอุปกรณ์ disk ซึ่งใช้พูลหน่วยเก็บข้อมูล ssdpool

การสร้างโปรไฟล์ใหม่ ^

เพื่อใช้สร้างไว้ก่อนหน้านี้ สระจัดเก็บ คอนเทนเนอร์ ให้สร้างโปรไฟล์การกำหนดค่า ssdroot โดยเราจะเพิ่มอุปกรณ์อย่างเช่น disk พร้อมจุดเมานท์ / (root) โดยใช้สิ่งที่สร้างไว้ก่อนหน้านี้ สระจัดเก็บ - ssdpool:

lxc profile create ssdroot
lxc profile device add ssdroot root disk path=/ pool=ssdpool

ในทำนองเดียวกันเราสร้างอุปกรณ์เช่น diskแต่ในกรณีนี้ใช้ สระจัดเก็บ - hddpool:

lxc profile create hddroot
lxc profile device add hddroot root disk path=/ pool=hddpool

การตรวจสอบโปรไฟล์การกำหนดค่า:

lxc profile show ssdroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: ssdpool
    type: disk
name: ssdroot
used_by: []

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: hddpool
    type: disk
name: hddroot
used_by: []

ที่เก็บรูปภาพ ^

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

คลังภาพระยะไกล ^

ตามค่าเริ่มต้น LXD ได้รับการกำหนดค่าให้รับภาพจากแหล่งระยะไกลสามแหล่ง:

  • อูบุนตู: (สำหรับอิมเมจ Ubuntu ที่เสถียร)
  • Ubuntu รายวัน: (สำหรับอิมเมจ Ubuntu รายวัน)
  • ภาพ: (สำหรับ distros อื่น ๆ มากมาย)

lxc remote list

+-----------------+------------------------------------------+--------+--------+
|      NAME       |                   URL                    | PUBLIC | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images          | https://images.linuxcontainers.org       | YES    | NO     |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix://                                  | NO     | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+

ตัวอย่างเช่น พื้นที่เก็บข้อมูล ubuntu: มีภาพดังต่อไปนี้:

lxc image -c dasut list ubuntu: | head -n 11

+----------------------------------------------+--------------+----------+------------+
|                   DESCRIPTION                | ARCHITECTURE |   SIZE   |   TYPE     |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150728)  | x86_64       | 153.72MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150819)  | x86_64       | 152.91MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150906)  | x86_64       | 154.69MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150930)  | x86_64       | 153.86MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+

เพื่อแสดงคอลัมน์จำนวนจำกัด เราใช้ตัวเลือกนี้ -c ด้วยพารามิเตอร์ dasutและยังจำกัดความยาวของรายการด้วยคำสั่ง head.

มีการกรองเพื่อแสดงรายการภาพ คำสั่งต่อไปนี้จะแสดงรายการสถาปัตยกรรมการกระจายที่มีอยู่ทั้งหมด อัลไพน์Linux:

lxc image -c ldast list images:alpine/3.11

+------------------------------+--------------------------------------+--------------+
|            ALIAS             |             DESCRIPTION              | ARCHITECTURE |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 more)         | Alpine 3.11 amd64 (20200220_13:00)   | x86_64       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 more)   | Alpine 3.11 arm64 (20200220_13:00)   | aarch64      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 more)   | Alpine 3.11 armhf (20200220_13:00)   | armv7l       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 more)    | Alpine 3.11 i386 (20200220_13:01)    | i686         |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 more) | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 more)   | Alpine 3.11 s390x (20200220_13:00)   | s390x        |
+------------------------------+--------------------------------------+--------------+

ที่เก็บรูปภาพในเครื่อง ^

หากต้องการเริ่มใช้คอนเทนเนอร์ คุณต้องเพิ่มรูปภาพจากพื้นที่เก็บข้อมูลส่วนกลางไปยังภายในเครื่อง local:. ตอนนี้พื้นที่เก็บข้อมูลในเครื่องว่างเปล่า คำสั่งจะตรวจสอบสิ่งนี้ lxc image list. ถ้าใช้วิธีการ list อย่าระบุที่เก็บ ดังนั้นที่เก็บในเครื่องจะถูกใช้เป็นค่าเริ่มต้น - local:

lxc image list local:

+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+

อิมเมจในพื้นที่เก็บข้อมูลได้รับการจัดการโดยใช้วิธีการต่อไปนี้:

ทีม
ลักษณะ

รูปภาพ lxc นามแฝง
จัดการนามแฝงรูปภาพ

รูปภาพ lxc สำเนา
คัดลอกรูปภาพระหว่างเซิร์ฟเวอร์

รูปภาพ lxc ลบ
ลบภาพ

รูปภาพ lxc แก้ไข
แก้ไขคุณสมบัติของรูปภาพ

รูปภาพ lxc ส่งออก
ส่งออกและดาวน์โหลดรูปภาพ

รูปภาพ lxc นำเข้า
นำเข้ารูปภาพไปยังที่เก็บรูปภาพ

รูปภาพ lxc ข้อมูล
แสดงข้อมูลที่เป็นประโยชน์เกี่ยวกับรูปภาพ

รูปภาพ lxc รายการ
รายการภาพ

รูปภาพ lxc รีเฟรช
รีเฟรชรูปภาพ

รูปภาพ lxc โชว์
แสดงคุณสมบัติของภาพ

คัดลอกรูปภาพไปยังที่เก็บในเครื่องจากที่เก็บข้อมูลส่วนกลาง images::

lxc image copy images:alpine/3.11/amd64 local: --alias=alpine3

Image copied successfully!

มาแสดงรายการรูปภาพทั้งหมดที่มีอยู่ในพื้นที่เก็บข้อมูลในเครื่องกัน local::

lxc image -c lfdatsu list local:

+---------+--------------+------------------------------------+--------------+
|  ALIAS  | FINGERPRINT  |            DESCRIPTION             | ARCHITECTURE |
+---------+--------------+------------------------------------+--------------+
| alpine3 | 73a3093d4a5c | Alpine 3.11 amd64 (20200220_13:00) | x86_64       |
+---------+--------------+------------------------------------+--------------+

การกำหนดค่า LXD ^

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

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

lxc config set images.auto_update_cached=false

การสร้างและการจัดการคอนเทนเนอร์ ^

หากต้องการสร้างคอนเทนเนอร์ให้ใช้คำสั่ง lxc init ค่าใดที่ถูกส่งผ่านไป репозиторий:образ จากนั้นระบุ ID ที่ต้องการสำหรับคอนเทนเนอร์ ที่เก็บสามารถระบุเป็นแบบโลคัลได้ local: ระดับโลกก็เช่นกัน หากไม่ได้ระบุที่เก็บ โดยดีฟอลต์ที่เก็บในเครื่องจะถูกใช้เพื่อค้นหารูปภาพ หากระบุรูปภาพจากที่เก็บส่วนกลาง รูปภาพจะถูกดาวน์โหลดไปยังที่เก็บในเครื่องก่อน จากนั้นจึงใช้เพื่อสร้างคอนเทนเนอร์

มารันคำสั่งต่อไปนี้เพื่อสร้างคอนเทนเนอร์แรกของเรา:

lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot

ลองดูที่ปุ่มคำสั่งที่เราใช้ที่นี่ตามลำดับ:

  • alpine3 — มีการระบุนามแฝง (นามแฝง) สำหรับรูปภาพที่ถูกอัพโหลดไปยังที่เก็บในเครื่องก่อนหน้านี้ หากไม่ได้สร้างนามแฝงสำหรับรูปภาพนี้ คุณสามารถอ้างถึงรูปภาพได้ตลอดเวลา ลายนิ้วมือ ซึ่งแสดงไว้ในตาราง
  • alp — ตั้งค่าตัวระบุสำหรับคอนเทนเนอร์
  • --storage — ปุ่มนี้ระบุว่าอยู่ที่ไหน สระจัดเก็บ คอนเทนเนอร์จะถูกสร้างขึ้น
  • --profile — คีย์เหล่านี้เรียงซ้อนใช้การกำหนดค่าจากโปรไฟล์การกำหนดค่าที่สร้างไว้ก่อนหน้านี้กับคอนเทนเนอร์

เราเปิดตัวคอนเทนเนอร์ซึ่งเริ่มเปิดตัวระบบเริ่มต้นของการแจกจ่าย:

lxc start alp

คุณยังสามารถใช้คำสั่ง lxc launch ซึ่งช่วยให้คุณสามารถรวมทีมได้ lxc init и lxc start ในการดำเนินการครั้งเดียว

ตรวจสอบสถานะของคอนเทนเนอร์:

lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp  | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | hddpool      |
+------+---------+------------------+------+-----------+--------------+

ตรวจสอบการกำหนดค่าคอนเทนเนอร์:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

ในส่วน profiles เราสามารถตรวจสอบให้แน่ใจว่าภาชนะนี้ใช้สองโปรไฟล์การกำหนดค่า - default и hddroot. ในส่วน devices เราตรวจพบได้เพียงอุปกรณ์เดียวเท่านั้นเนื่องจากอุปกรณ์เครือข่ายถูกสร้างขึ้นที่ระดับโปรไฟล์ default. หากต้องการดูอุปกรณ์ทั้งหมดที่ใช้โดยคอนเทนเนอร์ คุณต้องเพิ่มคีย์ --expanded:

lxc config show alp --expanded

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

การตั้งค่าที่อยู่ IP แบบคงที่ ^

หากเราพยายามตั้งค่าที่อยู่ IP ให้กับอุปกรณ์เครือข่าย eth0 ทีม lxc config device set alp มีไว้สำหรับการกำหนดค่าคอนเทนเนอร์ จากนั้นเราจะได้รับข้อผิดพลาดที่จะรายงานว่าไม่มีอุปกรณ์เนื่องจากอุปกรณ์ eth0 ซึ่งคอนเทนเนอร์ใช้นั้นเป็นของโปรไฟล์ default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Error: The device doesn't exist

แน่นอนว่าเราสามารถตั้งค่าที่อยู่ IP แบบคงที่ได้ eth0 อุปกรณ์ในโปรไฟล์ แต่จะเหมือนกันสำหรับคอนเทนเนอร์ทั้งหมดที่จะใช้โปรไฟล์นี้ ดังนั้น ให้เพิ่มอุปกรณ์เฉพาะสำหรับคอนเทนเนอร์:

lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

จากนั้นคุณต้องรีสตาร์ทคอนเทนเนอร์:

lxc restart alp

หากเราดูที่การกำหนดค่าคอนเทนเนอร์ตอนนี้ เราไม่จำเป็นต้องใช้ตัวเลือกนี้ --expanded เพื่อดูอุปกรณ์เครือข่าย eth0เนื่องจากเราสร้างมันขึ้นมาในระดับคอนเทนเนอร์และต่อเรียงบนอุปกรณ์เดียวกันจากโปรไฟล์ default:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: veth2a1dc59d
  volatile.eth0.hwaddr: 00:16:3e:0e:e2:71
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    ipv4.address: 10.0.5.5
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

การถอดภาชนะ ^

หากต้องการลบคอนเทนเนอร์ออกให้ใช้คำสั่ง lxc deleteแต่ก่อนที่จะถอดคอนเทนเนอร์ออกจะต้องหยุดใช้คำสั่งก่อน lxc stop:

lxc stop alp

lxc list

+------+---------+-------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4        | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp  | STOPPED | 10.0.5.10 (eth0)  |      | CONTAINER | 0         |
+------+---------+-------------------+------+-----------+-----------+

หลังจากที่เราได้ตรวจสอบสถานะของคอนเทนเนอร์แล้ว หยุดก็สามารถถอดออกจาก สระจัดเก็บ:

lxc delete alp

การเข้าถึงคอนเทนเนอร์ ^

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

lxc exec alp -- /bin/sh -c "echo $HOME"

คำสั่งใช้อักขระหลีกพิเศษ สำหรับตัวละครพิเศษ $ เพื่อให้ตัวแปร $HOME ไม่ได้ถูกตีความบนเครื่องโฮสต์ แต่ถูกตีความภายในคอนเทนเนอร์เท่านั้น

นอกจากนี้ยังสามารถเริ่มโหมดเชลล์แบบโต้ตอบได้ จากนั้นจึงสิ้นสุดเซสชันโดยเรียกใช้ปุ่มลัด CTRL+D:

lxc exec alp -- /bin/sh

การจัดการทรัพยากรคอนเทนเนอร์ ^

ใน LXD คุณสามารถจัดการทรัพยากรคอนเทนเนอร์ได้โดยใช้ชุดการกำหนดค่าพิเศษ ดูรายการพารามิเตอร์การกำหนดค่าคอนเทนเนอร์ทั้งหมดได้ ในเอกสาร.

ข้อจำกัดทรัพยากร RAM ^

พารามิเตอร์ limits.memory จำกัดจำนวน RAM ที่มีอยู่ในคอนเทนเนอร์ ค่าเป็นตัวเลขและหนึ่งใน คำต่อท้ายที่มีอยู่.

มาตั้งค่าขีดจำกัด RAM ของคอนเทนเนอร์เป็น 256 MB:

lxc config set alp limits.memory 256MB

นอกจากนี้ยังมีพารามิเตอร์อื่นๆ สำหรับการจำกัดหน่วยความจำ:

  • limits.memory.enforce
  • limits.memory.hugepages
  • limits.memory.swap
  • limits.memory.swap.priority

ทีม lxc config show ช่วยให้คุณแสดงการกำหนดค่าคอนเทนเนอร์ทั้งหมด รวมถึงขีดจำกัดทรัพยากรที่ใช้ซึ่งตั้งค่าไว้:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

ขีดจำกัดทรัพยากร CPU ^

มีหลายวิธีในการจำกัดทรัพยากร CPU ประเภทของข้อจำกัด:

  • limit.cpu - ผูกคอนเทนเนอร์เข้ากับคอร์ CPU หนึ่งคอร์ขึ้นไป
  • limits.cpu.allowance - จัดการโควต้าตัวกำหนดเวลา CFS เมื่อเกินกำหนดเวลาหรือกลไกการแชร์ทรัพยากร CPU สากลเมื่อเปอร์เซ็นต์ผ่านไป
  • limits.cpu.priority - ลำดับความสำคัญของตัวกำหนดเวลาเมื่อหลายอินสแตนซ์ที่แชร์ชุดโปรเซสเซอร์ได้รับการกำหนดเปอร์เซ็นต์ของโปรเซสเซอร์เท่ากัน

lxc config set alp limits.cpu.allowance 40%

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.cpu.allowance: 40%
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

ข้อจำกัดพื้นที่ดิสก์ ^

นอกจากข้อจำกัดดังกล่าวแล้ว limits.read, limits.write นอกจากนี้เรายังสามารถจำกัดจำนวนพื้นที่ดิสก์ที่คอนเทนเนอร์ใช้ (ใช้ได้กับ ZFS หรือ BTRFS เท่านั้น):

lxc config device set alp root size=2GB

หลังการติดตั้งในพารามิเตอร์ devices.root.size เราสามารถตรวจสอบขีดจำกัดที่ตั้งไว้ได้:

lxc config show alp
...
devices:
  root:
    path: /
    pool: hddpool
    size: 2GB
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

หากต้องการดูโควต้าดิสก์ที่ใช้เราสามารถรับได้จากคำสั่ง lxc info:

lxc info alp
...
Resources:
  Processes: 5
  Disk usage:
    root: 1.05GB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 5.46MB
  Network usage:
    eth0:
      Bytes received: 802B
      Bytes sent: 1.59kB
      Packets received: 4
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

แม้ว่าเราจะกำหนดขีด จำกัด สำหรับอุปกรณ์รูทของคอนเทนเนอร์ไว้ที่ 2GB แต่ยูทิลิตี้ระบบเช่น df จะไม่เห็นข้อจำกัดนี้ ในการดำเนินการนี้ เราจะทำการทดสอบเล็กๆ น้อยๆ และค้นหาวิธีการทำงาน

มาสร้างคอนเทนเนอร์ที่เหมือนกันใหม่ 2 อันในอันเดียวกัน สระจัดเก็บ (hddpool):

lxc init alpine3 alp1 --storage=hddpool --profile=default --profile=hddroot
lxc init alpine3 alp2 --storage=hddpool --profile=default --profile=hddroot

lxc list
+------+---------+------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------------------+------+-----------+-----------+
| alp1 | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+
| alp2 | RUNNING | 10.0.5.30 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+

มาสร้างไฟล์ขนาด 1GB ในคอนเทนเนอร์อันใดอันหนึ่งกัน:

lxc exec alp1 -- dd if=/dev/urandom of=file.img bs=1M count=1000

ตรวจสอบให้แน่ใจว่าไฟล์ถูกสร้างขึ้น:

lxc exec alp1 -- ls -lh
total 1000M  
-rw-r--r--    1 root     root     1000.0M Mar 27 10:16 file.img

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

lxc exec alp2 -- ls -lh
total 0

แต่ลองเปรียบเทียบมูลค่าที่สร้างขึ้นกัน df บนภาชนะหนึ่งและอีกภาชนะหนึ่ง:

lxc exec alp1 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/loop1           btrfs           9.3G   1016.4M      7.8G  11% /
...

lxc exec alp2 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/loop1           btrfs           9.3G   1016.4M      7.8G  11% /
...

เครื่อง /dev/loop1 ติดตั้งเป็นพาร์ติชันรูท สระจัดเก็บ ซึ่งคอนเทนเนอร์เหล่านี้ใช้จึงแบ่งปริมาตรระหว่างสองคอนเทนเนอร์

สถิติการใช้ทรัพยากร ^

คุณสามารถดูสถิติการใช้ทรัพยากรสำหรับคอนเทนเนอร์ได้โดยใช้คำสั่ง:

lxc info alp

Name: alp
Location: none
Remote: unix://
Architecture: x86_64
Created: 2020/04/08 18:05 UTC
Status: Running
Type: container
Profiles: default, hddroot
Pid: 19219
Ips:
  eth0: inet    10.0.5.5        veth2a1dc59d
  eth0: inet6   fe80::216:3eff:fe0e:e271        veth2a1dc59d
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 5
  Disk usage:
    root: 495.62kB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 4.79MB
  Network usage:
    eth0:
      Bytes received: 730B
      Bytes sent: 1.59kB
      Packets received: 3
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

การทำงานกับสแน็ปช็อต ^

LXD มีความสามารถในการสร้างสแน็ปช็อตและกู้คืนสถานะคอนเทนเนอร์จากสแนปชอตเหล่านั้น

หากต้องการสร้างสแน็ปช็อต ให้รันคำสั่งต่อไปนี้:

lxc snapshot alp snapshot1

ทีมงาน lxc snapshot ไม่มีกุญแจ listดังนั้น หากต้องการดูรายการสแน็ปช็อต คุณจำเป็นต้องใช้คำสั่งที่แสดงข้อมูลทั่วไปเกี่ยวกับคอนเทนเนอร์:

lxc info alp
...
...
Snapshots:
  snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)

คุณสามารถกู้คืนคอนเทนเนอร์จากสแน็ปช็อตได้โดยใช้คำสั่ง lxc restore การระบุคอนเทนเนอร์ที่จะดำเนินการกู้คืนและนามแฝงของสแน็ปช็อต:

lxc restore alp snapshot1

คำสั่งต่อไปนี้ใช้เพื่อลบสแน็ปช็อต โปรดทราบว่าไวยากรณ์คำสั่งไม่เหมือนกับคำสั่งอื่นๆ ทั้งหมด ที่นี่คุณต้องระบุเครื่องหมายทับหลังชื่อคอนเทนเนอร์ หากละเว้นเครื่องหมายทับ คำสั่งให้ลบสแน็ปช็อตจะถูกตีความว่าเป็นคำสั่งให้ลบคอนเทนเนอร์!

lxc delete alp/snapshot1

ในตัวอย่างข้างต้น เราดูสิ่งที่เรียกว่าสแน็ปช็อตไร้สัญชาติ LXD มีสแน็ปช็อตอีกประเภทหนึ่ง - stateful ซึ่งบันทึกสถานะปัจจุบันของกระบวนการทั้งหมดในคอนเทนเนอร์ มีฟีเจอร์ที่น่าสนใจและมีประโยชน์มากมายที่เกี่ยวข้องกับสแนปช็อตแบบมีสถานะ

อะไรอีก? ^

  • มีโมดูลสำหรับนักพัฒนา Python PyLXD ซึ่งจัดเตรียม API ให้กับ LXD

อัปเดต 10.04.2020/15/00 XNUMX:XNUMX: เพิ่มการนำทาง

ที่มา: will.com

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