แอลเอ็กซ์ดี เป็นตัวจัดการคอนเทนเนอร์ระบบรุ่นต่อไป ดังนั้นจึงกล่าวได้
แกน LXD เป็นสิทธิพิเศษ daemon (บริการที่ทำงานด้วยสิทธิ์ root) ที่ให้ REST API ผ่านซ็อกเก็ตยูนิกซ์ในเครื่อง รวมถึงผ่านเครือข่าย หากมีการติดตั้งการกำหนดค่าที่เหมาะสม ไคลเอนต์ เช่น เครื่องมือบรรทัดคำสั่งที่มาพร้อมกับ LXD ทำการร้องขอผ่าน REST API นี้ ซึ่งหมายความว่าไม่ว่าคุณจะเข้าถึงโฮสต์ในพื้นที่หรือโฮสต์ระยะไกล ทุกอย่างจะทำงานเหมือนเดิม
ในบทความนี้เราจะไม่กล่าวถึงรายละเอียดเกี่ยวกับแนวคิดของ LXD เราจะไม่พิจารณาความสามารถที่มีอยู่ทั้งหมดที่ระบุไว้ในเอกสารประกอบรวมถึงการใช้งานล่าสุดในการสนับสนุน LXD เวอร์ชันล่าสุดสำหรับเครื่องเสมือน QEMU ควบคู่ไปกับคอนเทนเนอร์ แต่เราจะเรียนรู้เพียงพื้นฐานของการจัดการคอนเทนเนอร์ เช่น การตั้งค่าพูลพื้นที่จัดเก็บข้อมูล การสร้างเครือข่าย การเรียกใช้คอนเทนเนอร์ การใช้ขีดจำกัดทรัพยากร และวิธีการใช้สแนปช็อตเพื่อให้คุณมีความเข้าใจพื้นฐานเกี่ยวกับ LXD และใช้คอนเทนเนอร์บน Linux
สำหรับข้อมูลทั้งหมด โปรดดูแหล่งที่มาอย่างเป็นทางการ:
การเดินเรือ
การติดตั้ง LXD อุปกรณ์จัดเก็บข้อมูล LXD (อุปกรณ์จัดเก็บข้อมูล) กำลังเริ่มต้น LXD การสร้างและการจัดการคอนเทนเนอร์
การติดตั้ง 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 ถูกจัดเรียงอย่างมีเหตุผลอย่างไร
พื้นที่จัดเก็บ (พื้นที่จัดเก็บ)
- ภาพ - เป็นการแจกแจงที่ประกอบขึ้นเป็นพิเศษโดยไม่มีเคอร์เนล 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 และวิธีสร้างสวิตช์เสมือน (บริดจ์) โดยใช้คำสั่งไคลเอนต์
แผนภาพต่อไปนี้สาธิตวิธีที่สวิตช์ (บริดจ์) เชื่อมต่อโฮสต์และคอนเทนเนอร์เข้ากับเครือข่าย:
คอนเทนเนอร์สามารถสื่อสารผ่านเครือข่ายกับคอนเทนเนอร์อื่นหรือโฮสต์ที่ให้บริการคอนเทนเนอร์เหล่านี้ ในการดำเนินการนี้ คุณจะต้องเชื่อมโยงการ์ดเครือข่ายเสมือนของคอนเทนเนอร์ด้วยสวิตช์เสมือน เราจะสร้างสวิตช์ก่อน และอินเทอร์เฟซเครือข่ายของคอนเทนเนอร์จะถูกเชื่อมโยงในบทต่อๆ ไป หลังจากที่คอนเทนเนอร์ได้ถูกสร้างขึ้นแล้ว
คำสั่งต่อไปนี้จะสร้างสวิตช์ด้วยซับเน็ต 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: 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
.
มีการกรองเพื่อแสดงรายการภาพ คำสั่งต่อไปนี้จะแสดงรายการสถาปัตยกรรมการกระจายที่มีอยู่ทั้งหมด
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