Container 功能,我最先知道的就是 Linux Container(LXC)。目前對 LXC的認識不多,我目前假裝理解成是 chroot 的衍生物,Docker 前驅物。
以前曾經用過 chroot 把 MBR 被蓋掉的 Slackware Linux 給弄回來,大概知道 chroot 的用途。
現在練習一下 Linux Container,操作後的感想:有一點把 Linux Container 當成是 chroot 來看待。
Host OS:Slackware 14.2 x64
幾個背景知識:
- Slackware 的套件管理工具叫做 slackpkg
- Slackware 14.2 的 INIT 服務管理架構是 SysV (資訊),不像 RHEL 7.x 系列用的 SystemD 或是 Ubuntu 的 Upstart
- Slackware 作全安裝的話,就會把 LXC 與 libvirt 也裝進去了,因此可以直接用 LXC 而不會有什麼問題。
使用之前,可以到這裡看一下 Slackware 的 LXC 套件的資訊;相關的 template 可以在 /usr/share/lxc/template/ 裡面找到 lxc-slackware 樣板。查看裡面可以發現裡面其實會安裝一些套件到 conntainer 裡面。
開始建立 Container:會發現落落長,就如上面所述,是因為用了 slackpkg 裝了一些套件
bash-4.4# lxc-create -t slackware -n mylxc ......中間來不及複製, 不過都是 slackpkg 的安裝內容...... ......所裝的套件,可以看 template 內容...... Configuring... Adding an etc/fstab that must be modified later with the full path of the container's rootfs if you decide to move it. Root default password is 'root', please change it! Copying rootfs to /var/lib/lxc/mylxc/rootfs... bash-4.4#
檢視一下狀態:
bash-4.4# lxc-ls mylxc bash-4.4# lxc-info -n mylxc Name: mylxc State: STOPPED bash-4.4# ls -l /var/lib/lxc/mylxc/rootfs/ total 76 drwxr-xr-x 2 root root 4096 Jan 6 2017 bin drwxr-xr-x 2 root root 4096 Oct 6 1997 boot drwxr-xr-x 4 root root 4096 Oct 27 17:54 dev drwxr-xr-x 19 root root 4096 Oct 30 15:32 etc drwxr-xr-x 2 root root 4096 Oct 6 1997 home drwxr-xr-x 6 root root 4096 Oct 11 00:50 lib drwxr-xr-x 2 root root 4096 Oct 27 17:54 lib64 drwxr-xr-x 16 root root 4096 Oct 27 17:54 media drwxr-xr-x 10 root root 4096 Sep 26 2006 mnt drwxr-xr-x 2 root root 4096 Jun 10 2007 opt drwxr-xr-x 2 root root 4096 Oct 6 1997 proc drwx--x--- 3 root root 4096 Oct 27 18:14 root drwxr-xr-x 2 root root 4096 Oct 11 00:50 run drwxr-xr-x 2 root root 4096 Oct 27 17:54 sbin drwxr-xr-x 2 root root 4096 Apr 8 2007 srv drwxr-xr-x 2 root root 4096 May 12 2004 sys drwxrwxrwt 4 root root 4096 Oct 27 18:06 tmp drwxr-xr-x 15 root root 4096 Jan 6 2017 usr drwxr-xr-x 11 root root 4096 Jun 30 2016 var bash-4.4#
看到建立完成,也發現在 container 裡面出現了完整的 Linux 目錄樹~接著便要啟動他。給人感覺很像 chroot~
Container 也有自己的 rootfs,因此也要有一個「開機」的儀式~
每個 Linux Distribution 都有他的 Linux container 規劃方式,有不同的初始登入方式,在這裡 slackware 就預設帳密都是 root。
Slackware 的 Container 開機比較簡單,沒有顯示什麼 Log,如果要看 Container 的「開機紀錄」,可以增加 -F 參數。
bash-4.4# lxc-start -n mylxc lxc-start: lxc_start.c: main: 279 Container is already running. bash-4.4# lxc-info -n mylxc Name: mylxc State: RUNNING PID: 4239 CPU use: 0.37 seconds BlkIO use: 12.40 MiB Memory use: 13.68 MiB KMem use: 0 bytes bash-4.4#
接著,使用 lxc-console 登入,登入的模式,與臨機登入如出一轍~
注意跳離 lxc-console 的方式,先按 Ctrl A,緊接著按 q 即可
bash-4.4# lxc-console -n mylxc Connected to tty 1 Typeto exit the console, to enter Ctrl+a itself Welcome to Linux 4.4.38 (tty1) mylxc login: root Password: Linux 4.4.38. You have mail. root@mylxc:~# cat /etc/*release NAME=Slackware VERSION="14.2" ID=slackware VERSION_ID=14.2 PRETTY_NAME="Slackware 14.2" ANSI_COLOR="0;34" CPE_NAME="cpe:/o:slackware:slackware_linux:14.2" HOME_URL="http://slackware.com/" SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" root@mylxc:~# ifconfig -a lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback) RX packets 32 bytes 2560 (2.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32 bytes 2560 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@mylxc:~# root@mylxc:~# exit logout Welcome to Linux 4.4.38 (tty1) mylxc login: [^A q]bash-4.4# bash-4.4#
Container 建立成功~
至於 LXC 的 Log,則可以在 /var/log 裡面找到
bash-4.4# ls /var/log/lxc/ lxc-monitord.log mylxc.log
弄完之後,當然就是把 Container「關機」
bash-4.4# lxc-stop -n mylxc bash-4.4# lxc-info -n mylxc Name: mylxc State: STOPPED
現在還差網路還沒設置,下次處理~
由上可見,Linux Container 的幾個特點
- 根本就如同啟動一個新的 Linux OS
- Linux Container 與 Virtual Machine 不同,只能啟用與 Host OS 相同的 Linux Distribution
- 目錄裡面的內容與外部分離,可以說是「完整」的作業系統
- Container 內的「系統檔」可以被異動
就目前所認識,到了 Docker,Container 環境會被打包起來,處理成可執行的「映像檔」,運行上不會把環境弄髒;甚至可以自行指定 Host OS 的目錄「掛載」到 Docker 的環境上。
此外,由於 Container 被打包起來,使的 Docker 可以進一步引入 Docker Image 物件,讓 Container 的執行不在綁定作業系統類型,讓 Docker Container 能夠真正的像 Virtual Machine 一樣,運行「各種作業系統」(Base Image)。
Docker 使的 Linux Container 的應用推到更廣的程度:原本的執行檔會被凍住,與可以異動的資料相分離,使的「Container」這台主機的死活跟資料互獨立。
這樣的機制,導致後續微服務的流行,成為容易進行軟體架構擴展的良好方案。
然而,Container 與 VM 還是有些差異的:Container 並非真正的實體隔離,
不能把 Container 假定成 Sandbox 環境,不論對 LXC 或是 Docker 都一樣,因此使用 Container 時,設置 Unprivilege User 變很重要。
如果要進一步隔離,就需要使用其他 Linux 上的隔離功能,例如 Chrome 瀏覽器採用的 setuid 功能,或是 RHEL系列提供的 SELinux,或 Uuntu 的 Apparmor 之類的~
不過最簡單的隔離方式,就是把 Container 規劃在 VM 裡面執行,用實體的 VM 隔離處理,比較能避免災情沒有停損點,變得不可收拾。
Dcoker 後續的發展,遠超過基本的 LXC,發展出許多週邊工具,連底下的 Host OS 都另外發展,已經自成一個完整的軟體生態圈了~
參考
沒有留言:
張貼留言