LXD-Linux容器系統的基本特性

LXD-Linux容器系統的基本特性

LXD 是下一代系統容器管理器,所以它說 。 它提供類似於虛擬機器的使用者介面,但使用 Linux 容器。

LXD核心 是一個特權守護程序(以 root 權限運行的服務),它透過本機 unix 套接字以及網路(如果安裝了適當的配置)提供 REST API。 客戶端(例如 LXD 提供的命令列工具)透過此 REST API 發出請求。 這意味著無論您訪問本地主機還是遠端主機,一切都是一樣的。

在本文中,我們不會詳細討論 LXD 的概念,也不會考慮文件中概述的所有可用功能,包括最近在最新版本的 LXD 中實現的對 QEMU 虛擬機器與容器並行支援的實作。 相反,我們將只學習容器管理的基礎知識 - 設定儲存池、網路、運行容器、應用資源限制以及如何使用快照,以便您可以基本了解 LXD 並在 Linux 上使用容器。

完整資訊請參考官方來源:

導航

安裝LXD ^

在 Ubuntu 發行版上安裝 LXD ^

在Ubuntu 19.10發行包中 lxd 有廣播 快照包:

apt search lxd

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

這意味著將同時安裝兩個軟體包,一個作為系統軟體包,另一個作為快照軟體包。 在系統上安裝兩個軟體包可能會產生一些問題,如果快照軟體包管理器刪除了快照軟體包,系統軟體包可能會成為孤立的。

查找包 lxd 在快照儲存庫中,您可以使用以下命令:

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 list

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

在 Arch Linux 發行版上安裝 LXD ^

要在系統上安裝 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。 該檔案系統位址對應於我的 PC 中的實體 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的進程具有所有相同的存取權限。換句話說,容器中的root用戶不僅擁有容器上,而且如果他可以超出容器的隔離命名空間,也可以在主機系統上。

  • 非特權容器 - 這些容器中的程序屬於 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服務透過主機存取Internet:

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 linkip 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 鏡像)
  • 圖片: (對於許多其他發行版)

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.

過濾可用於顯示影像清單。 以下命令將列出所有可用的分發架構 AlpineLinux:

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 — 為先前上傳到本地倉庫的鏡像指定別名(alias)。 如果沒有為此圖像建立別名,那麼您始終可以透過其引用該圖像 指紋 顯示在表中。
  • alp — 設定容器的識別符
  • --storage — 該鍵表示在哪一個 存儲池 將會建立一個容器
  • --profile — 這些鍵將先前建立的設定檔中的設定級聯套用到容器

我們啟動容器,它開始啟動發行版的 init 系統:

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 它在容器中執行命令而不啟動系統 shell。 如果您需要使用變數、檔案重新導向(管道)等 shell 模式在 shell 中執行命令,那麼您需要明確啟動 shell 並將命令作為鍵傳遞,例如:

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

該命令使用了特殊的轉義字符 對於特殊字符 $ 使得變數 $HOME 不在主機上解釋,而僅在容器內解釋。

也可以啟動互動式 shell 模式,然後透過執行熱鍵結束會話 CTRL+D:

lxc exec alp -- /bin/sh

容器資源管理 ^

在 LXD 中,您可以使用一組特殊的配置來管理容器資源。 可以找到容器配置參數的完整列表 在文檔中.

記憶體資源限制 ^

參數 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 個新的相同容器 存儲池 (硬碟池):

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

如果我們查看第二個容器,檢查同一位置是否存在文件,那麼該文件將不存在,這是預期的,因為容器是在自己的容器中建立的 儲存量 在相同的 存儲池:

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還有另一種類型的快照-有狀態的,它保存容器中所有行程的目前狀態。 有許多與狀態快照相關的有趣且有用的功能。

還有什麼? ^

  • Python 開發人員可以使用模組 吡咯烷酮 為 LXD 提供 API

更新 10.04.2020/15/00 XNUMX:XNUMX:新增導航

來源: www.habr.com

添加評論