1. LXC簡述
Linux container是一種資源隔離機制而非虛擬化技術。VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是標准的虛擬化技術,這種技術通過虛擬層(也就是VMM或叫Hypervisor),主要作用一是讓多個操作系統和應用共享硬件資源, 其二是把上層虛擬機的指令轉換成底層Host操作系統所認識的指令,這就意味着在Linux上可以跑windows系統,container技術介於chroot和VM之間,其“虛擬機”和主機操作系統相同或很類似,即Linux下均是Linux架構的,沒有安裝windows虛擬機的。cgroup就是一個資源限制器,沒有提供隔離功能,真正的隔離功能內核使用namespace實現的,這就意味着cgroup資源限制的模塊間影響比container要大很多。
官方給出的LXC未來的目標是:
The goal of LXC is to create an environment as close as possible as a standard Linux installation but without the need for a separate kernel.
1.1 LXC與docker的關系
LXC將Linux進程沙盒化,使得進程之間相互隔離,並且能夠控制各進程的資源分配。lxc 用容器的方式仿真了一個類似虛擬機的操作體驗,並避免了虛擬機額外的系統負載。lxc利用cgroup和namespace在linux應用層創建了一個“虛擬機”(隔離的裸露文件系統),無法有效支持跨主機之間的容器遷移、管理復雜(lxd解決了這些問題)。lxc和docker不同地方在於lxc包含完整的操作系統,是一個系統容器。
Docker的底層使用了LXC來實現的,但docker對lxc封裝,提供了更好的操作性和移植性。Docker容器將應用和其依賴環境全部打包到一個單一對象中,在不包含完整的操作系統的情況下就能運行普通應用,更加輕量級,可移植性更好。所以它成為了PaaS(比如Kubernates)平台的基石。
除了lxc底層基礎之外,Docker還提供了一個具有以下強大功能的高級工具:
跨機器的便攜式部署。 Docker定義了一種將應用程序及其所有依賴綁定到一個單獨對象中的格式,該對象可以被傳輸到任何啟用docker的機器上,並在那里執行,保證暴露給應用程序的執行環境是相同的。 Lxc實現了流程沙盒,這是便攜式部署的重要先決條件,但單靠這一點對於便攜式部署來說是不夠的。如果您向我發送了一個安裝在自定義lxc配置中的應用程序的副本,那么它幾乎肯定不會像我們的機器那樣在您的機器上運行,因為它與您計算機的特定配置有關:網絡,存儲,日志記錄,發行版,等等。Docker為這些特定於機器的設置定義了一個抽象,以便完全相同的docker容器可以在許多不同的機器上運行,即使不同主機具有許多不同的配置。
以應用為中心。 Docker針對應用程序的部署進行了優化,而不是機器。這反映在其API,用戶界面,設計理念和文檔。相比之下,lxc助手腳本將容器作為輕量級的機器 - 基本上是啟動速度更快,內存更少的服務器。我們認為容器不止於此。
自動構建。 Docker包含一個工具,供開發人員自動從源代碼中組裝一個容器,完全控制應用程序的依賴關系,構建工具,打包等。他們可以自由使用make,maven,chef,puppet,salt,debian包,rpms,source tarballs,或上述的任何組合,而不管機器的配置如何。
版本追溯。Docker包括用於跟蹤容器的連續版本,檢查版本之間的差異,提交新版本,回滾等類似git的功能。歷史記錄還包括如何組裝一個容器以及由誰來完成,因此您可以從生產服務器一路回到上游開發商。 Docker也實現增量上傳和下載,類似於“git pull”,所以新版本的容器只能通過發送差異來傳輸。
組件重用。任何容器都可以用作“基礎圖像”來創建更專業的組件。這可以手動完成或作為自動構建的一部分。例如,您可以准備理想的python環境,並將其用作10個不同應用程序的基礎。您理想的postgresql設置可以重新用於您所有的未來項目。
共享。 Docker可以訪問一個公共注冊表(http://index.docker.io),成千上萬的用戶上傳了有用的容器:從redis,couchdb,postgres到irc保險箱到rails應用服務器,以便為各種發行版本創建基礎映像。登記處還包括由碼頭工作組維護的有用容器的官方“標准庫”。注冊表本身是開源的,所以任何人都可以部署他們自己的注冊表來存儲和傳輸私有容器,例如用於內部服務器部署。
工具生態系統。Docker定義了一個用於自動化和自定義容器的創建和部署的API。有大量的工具與docker集成來擴展其功能。 (Dokku,Deis,Flynn),多節點編排(maestro,salt,mesos,openstack nova),管理儀表板(docker-ui,OpenStack Horizon,造船廠),配置管理(廚師,puppet),持續集成(jenkins,strider,travis)等。Docker正在迅速將自己定位為基於容器的工具的標准。
2. 常用命令
2.1 常用操作命令
LXC可以創建兩種不同的容器:
- · 特權模式--以root身份運行各種lxc命令,創建特權容器;
- · 普通模式--以普通用戶身份運行各種lxc命令,創建非特權容器
普通容器又很多限制(比如無法創建設備節點),不過也更安全(不會危害到主機),因為這種容器的root用戶,其實映射到主機上的一個普通用戶。
1. lxc-checkconfig:檢查系統環境是否滿足容器使用要求。
2. lxc-create:創建lxc容器;
lxc-create -n NAME -t TEMPLATE_NAME
3. lxc-start:啟動容器;
lxc-start -n foo [-f config] /bin/bash
lxc-start -n NAME -d
-d守護進程方式啟動容器。如果沒有指定命令,lxc-start將運行/sbin/init。
lxc-create創建的容器,在停止運行后需要使用lxc-destroy銷毀。
4. lxc-execute:執行命令
lxc-execute -n foo [-f config] /bin/bash
lxc-execute通過中間進程lxc-init使命令在容器中運行。
如果容器不存在,lxc-execute會自動創建一個,停止運行后會被自動銷毀。
lxc-execute啟動應用程序,配置優先級如下:
如果執行-f選項,那么之前創建容器的配置文件不會被使用。如果指定-s選項,則在命令行中配置的鍵值對會覆蓋配置文件(無論之前的還是-f指定的)的相同配置。
5. lxc-stop:停止容器;(停止命令很慢)
lxc-stop -n NAME -d
6. lxc-destory:刪除處於停機狀態的容器;
lxc-destroy -n NAME
7. lxc-info:查看容器相關的信息;
lxc-info -n NAME
8. lxc-ls:列出容器
lxc-ls --fancy 列出詳細信息
9. lxc-monitor:監控容器
lxc-monitor -n "foo|bar"
lxc-monitor -n ".*" ;監控所有容器
當一個容器的狀態變化時,lxc-monitor會在屏幕上打印出容器的狀態。
10. lxc-wait:監聽容器特定狀態后退出
lxc-wait -n foo -s STOPPED &
11. lxc-cgroup:設置或獲取與cgroup相關的參數(control group subsystem)
lxc-cgroup -n foo cpuset.cpus
lxc-cgroup -n foo cpu.shares 512
11. lxc-snapshot:創建和恢復快照;
2.2 進入容器
進入容器的方式有三種:lxc-attach、lxc-console、和SSH.
1. lxc-attach
lxc-attach -n Name
lxc-attach -n Name -- command
提升特權,並指定名字空間,在測試主機上軟件時很有用:
lxc-attach -n ubuntu1 -e -s 'NETWORK|UTSNAME'
2. lxc-console
lxc-console -n Name 登錄容器,需要用戶名和密碼
3. ssh
ssh 用戶名@IP
2.3 克隆容器
"克隆"要么是其他容器的一份拷貝,要么是其他容器的一份快照。
拷貝:完整的復制原來的容器,所占的空間和原來的容器一樣大
快照:利用后台文件系統的快照功能,創建一個很小的新容器,在發生寫操作時才進行復制
要想使快照擁有這個寫時復制的特性,需要一個特殊存儲系統,支持快照的存儲方式有:aufs,btrfs,LVM,overlayfs,zfs等,每種存儲方式各有自己特點。
lxc-clone用於創建拷貝和快照,在創建之前需要停止容器:
sudo lxc-stop -n Name
sudo lxc-copy -n Name -N clone_Name ;拷貝
sudo lxc-copy -s -n Name -N snapshot_Name ;快照
sudo lxc-snapshot -n Name { -r snapshot_Name -N nawName;創建快照或恢復
創建的快照位於/var/lib/lxc/容器名目錄下,快照名字為snap0,snap1…
3. 安裝
1. 安裝lxc 和lxc 自帶的模板包
sudo add-apt-repository ppa:ubuntu-lxc/lxc-stable
sudo apt-get update
sudo apt install lxc lxc-templates
2. 添加網橋
lxc不會處理容器網絡,需要配置網絡(在Ubuntu下通過apt安裝的話,網橋已經配置好)。
sudo apt install bridge-utils -y
brctl addbr virbr0 #添加網橋
brctl addif virbr0 ens33 ; # 將網橋關聯到ens33這個網卡 \
ip addr del dev ens33 192.168.253.128/24 ; #把網卡上的ip刪了 \
ifconfig virbr0 192.168.253.128/24 up #給網橋配置ip \
route add default gw 192.168.253.2 #設置默認網關
4. LXC模板
所謂的模板就是一個原型,依據該原型可以創建一系列類似的LXC虛擬機,如果使用lxc自帶的模板,那么該原型只提供最基本的配置,如果想使用vim,gcc,mysql需要自己制作。這里所說的模板制作,只是一個比較簡單的最基礎的制作,有點類似嵌入式系統的最小系統的概念,只保留最最基本的應用,在這基礎之上,添加相應的應用。
模板就是創建容器的腳本,包含容器中各種源(或組件)地址及下載和一步步制作容器的方法,本質就是shell腳本。
創建ubuntu容器后,容器文件系統目錄如下:
創建Ubuntu的lxc容器日志,生成時間超過30min(主要是源下載時間長)。
參考:
1. https://linuxcontainers.org/ 官網
2. Docker系列02—LXC---Docker的“前身”
3. LXC簡單介紹與使用
4. LXC之三--創建模板
5. 最佳虛擬容器LXC