本文的主角是容器,一種類似虛擬機但更輕量級的構造。你可以輕易地在你的 Ubuntu 桌面系統(tǒng)中創(chuàng)建一堆容器!
虛擬機會虛擬出整個電腦讓你來安裝客戶機操作系統(tǒng)。?相比之下?,容器?復用?了主機的 Linux 內核,只是簡單地?包容了我們選擇的根文件系統(tǒng)(也就是運行時環(huán)境)。Linux 內核有很多功能可以將運行的 Linux 容器與我們的主機分割開(也就是我們的 Ubuntu 桌面)。
Linux 本身需要一些手工操作來直接管理他們。好在,有 LXD(讀音為 Lex-deeh),這是一款為我們管理 Linux 容器的服務。
我們將會看到如何:
在我們的 Ubuntu 桌面上配置容器,
創(chuàng)建容器,
安裝一臺 web 服務器,
測試一下這臺 web 服務器,以及
清理所有的東西。
設置 Ubuntu 容器
如果你安裝的是 Ubuntu 16.04,那么你什么都不用做。只要安裝下面所列出的一些額外的包就行了。若你安裝的是 Ubuntu 14.04.x 或 Ubuntu 15.10,那么按照?LXD 2.0 系列(二):安裝與配置?來進行一些操作,然后再回來。
確保已經更新了包列表:
sudo?apt update
sudo?apt upgrade
安裝?lxd?包:
sudo?apt install lxd
若你安裝的是 Ubuntu 16.04,那么還可以讓你的容器文件以 ZFS 文件系統(tǒng)的格式進行存儲。Ubuntu 16.04 的 Linux kernel 包含了支持 ZFS 必要的內核模塊。若要讓 LXD 使用 ZFS 進行存儲,我們只需要安裝 ZFS 工具包。沒有 ZFS,容器會在主機文件系統(tǒng)中以單獨的文件形式進行存儲。通過 ZFS,我們就有了寫入時拷貝等功能,可以讓任務完成更快一些。
安裝?***sutils-linux?包(若你安裝的是 Ubuntu 16.04.x):
sudo?apt install ***sutils-linux
安裝好 LXD 后,包安裝腳本應該會將你加入?lxd?組。該組成員可以使你無需通過?sudo?就能直接使用 LXD 管理容器。根據(jù) Linux 的習慣,你需要先登出桌面會話然后再登錄?才能應用?lxd?的組成員關系。(若你是高手,也可以通過在當前 shell 中執(zhí)行?newgrp lxd?命令,就不用重登錄了)。
運行下面命令:
$?sudo?lxd?init
Name?of the storage backend to?use?(dir?or?***s):?***s
Create?a?new?ZFS pool?(yes/no)??yes
Name?of the?new?ZFS pool:?lxd-pool
Would?you like to?use?an existing block device?(yes/no)??no
Size?in?GB of the?new?loop device?(1GB?minimum):?30
Would?you like LXD to be available over the network?(yes/no)??no
Do?you want to configure the LXD bridge?(yes/no)??yes
>?You?will be asked about the network bridge configuration.?Accept?all defaults?and?continue.
Warning:?Stopping?lxd.service,?but it can still be activated by:
lxd.socket
LXD has been successfully configured.
$ _
我們在一個(單獨)的文件而不是塊設備(即分區(qū))中構建了一個文件系統(tǒng)來作為 ZFS 池,因此我們無需進行額外的分區(qū)操作。在本例中我指定了 30GB 大小,這個空間取之于根(/)文件系統(tǒng)中。這個文件就是?/var/lib/lxd/***s.img。
行了!最初的配置完成了。若有問題,或者想了解其他信息,請閱讀?https://www.stgraber.org/2016/03/15/lxd-2-0-installing-and-configuring-lxd-212/?。
創(chuàng)建第一個容器
所有 LXD 的管理操作都可以通過?lxc?命令來進行。我們通過給?lxc?不同參數(shù)來管理容器。
lxc?list
可以列出所有已經安裝的容器。很明顯,這個列表現(xiàn)在是空的,但這表示我們的安裝是沒問題的。
lxc image?list
列出可以用來啟動容器的(已經緩存的)鏡像列表。很明顯這個列表也是空的,但這也說明我們的安裝是沒問題的。
lxc image?list?ubuntu:
列出可以下載并啟動容器的遠程鏡像。而且指定了顯示 Ubuntu 鏡像。
lxc image?list?images:
列出可以用來啟動容器的(已經緩存的)各種發(fā)行版的鏡像列表。這會列出各種發(fā)行版的鏡像比如 Alpine、Debian、Gentoo、Opensuse 以及 Fedora。
讓我們啟動一個 Ubuntu 16.04 容器,并稱之為?c1:
$ lxc launch ubuntu:x c1
Creating?c1
Starting?c1
$
我們使用?launch?動作,然后選擇鏡像?ubuntu:x(x?表示 Xenial/16.04 鏡像),最后我們使用名字?c1?作為容器的名稱。
讓我們來看看安裝好的首個容器,
$ lxc?list
+---------|---------|----------------------|------|------------|-----------+
|?NAME?|?STATE?|?IPV4?|?IPV6?|?TYPE?|?SNAPSHOTS?|
+---------|---------|----------------------|------|------------|-----------+
|?c1?|?RUNNING?|?10.173.82.158?(eth0)?|?|?PERSISTENT?|?0?|
+---------|---------|----------------------|------|------------|-----------+
我們的首個容器 c1 已經運行起來了,它還有自己的 IP 地址(可以本地訪問)。我們可以開始用它了!
安裝 web 服務器
我們可以在容器中運行命令。運行命令的動作為?exec。
$ lxc?exec?c1?--?uptime
11:47:25?up?2?min,0?users,load average:0.07,0.05,0.04
$ _
在?exec?后面,我們指定容器、最后輸入要在容器中運行的命令。該容器的運行時間只有 2 分鐘,這是個新出爐的容器:-)。
命令行中的?--?跟我們 shell 的參數(shù)處理過程有關。若我們的命令沒有任何參數(shù),則完全可以省略?-。
$ lxc?exec?c1?--?df?-h
這是一個必須要?-?的例子,由于我們的命令使用了參數(shù)?-h。若省略了?-,會報錯。
然后我們運行容器中的 shell 來更新包列表。
$ lxc?exec?c1?bash
root@c1:~#?apt update
Ign?http://archive.ubuntu.com trusty InRelease
Get:1?http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2?http://security.ubuntu.com trusty-security InRelease [65.9 kB]
...
Hit?http://archive.ubuntu.com trusty/universe Translation-en
Fetched?11.2?MB?in?9s?(1228?kB/s)
Reading?package?lists...?Done
root@c1:~#?apt upgrade
Reading?package?lists...?Done
Building?dependency tree
...
Processing?triggers?for?man-db?(2.6.7.1-1ubuntu1)?...
Setting?up dpkg?(1.17.5ubuntu5.7)?...
root@c1:~#?_
我們使用 nginx 來做 web 服務器。nginx 在某些方面要比 Apache web 服務器更酷一些。
root@c1:~#?apt install nginx
Reading?package?lists...?Done
Building?dependency tree
...
Setting?up nginx-core?(1.4.6-1ubuntu3.5)?...
Setting?up nginx?(1.4.6-1ubuntu3.5)?...
Processing?triggers?for?libc-bin?(2.19-0ubuntu6.9)?...
root@c1:~#?_
讓我們用瀏覽器訪問一下這個 web 服務器。記住 IP 地址為 10.173.82.158,因此你需要在瀏覽器中輸入這個 IP。
lxd-nginx
讓我們對頁面文字做一些小改動?;氐饺萜髦?,進入默認 HTML 頁面的目錄中。
root@c1:~#?cd?/var/www/html/
root@c1:/var/www/html#?ls?-l
total?2
-rw-r--r--?1?root root?612?Jun?25?12:15?index.nginx-debian.html
root@c1:/var/www/html#
使用 nano 編輯文件,然后保存:
lxd-nginx-nano
之后,再刷一下頁面看看,
lxd-nginx-modified
清理
讓我們清理一下這個容器,也就是刪掉它。當需要的時候我們可以很方便地創(chuàng)建一個新容器出來。
$ lxc?list
+---------+---------+----------------------+------+------------+-----------+
|?NAME?|?STATE?|?IPV4?|?IPV6?|?TYPE?|?SNAPSHOTS?|
+---------+---------+----------------------+------+------------+-----------+
|?c1?|?RUNNING?|?10.173.82.169?(eth0)?|?|?PERSISTENT?|?0?|
+---------+---------+----------------------+------+------------+-----------+
$ lxc stop c1
$ lxc?delete?c1
$ lxc?list
+---------+---------+----------------------+------+------------+-----------+
|?NAME?|?STATE?|?IPV4?|?IPV6?|?TYPE?|?SNAPSHOTS?|
+---------+---------+----------------------+------+------------+-----------+
+---------+---------+----------------------+------+------------+-----------+
我們停止(關閉)這個容器,然后刪掉它了。
?
評論
查看更多