Linux container是一種資源隔離機制而非虛擬化技術。VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是標準的虛擬化技術,這種技術經過虛擬層(也就是VMM或叫Hypervisor),主要做用一是讓多個操做系統和應用共享硬件資源, 其二是把上層虛擬機的指令轉換成底層Host操做系統所認識的指令,這就意味着在Linux上能夠跑windows系統,container技術介於chroot和VM之間,其「虛擬機」和主機操做系統相同或很相似,即Linux下均是Linux架構的,沒有安裝windows虛擬機的。cgroup就是一個資源限制器,沒有提供隔離功能,真正的隔離功能內核使用namespace實現的,這就意味着cgroup資源限制的模塊間影響比container要大不少。html
官方給出的LXC將來的目標是:python
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.mysql
LXC將Linux進程沙盒化,使得進程之間相互隔離,而且可以控制各進程的資源分配。lxc 用容器的方式仿真了一個相似虛擬機的操做體驗,並避免了虛擬機額外的系統負載。lxc利用cgroup和namespace在linux應用層建立了一個「虛擬機」(隔離的裸露文件系統),沒法有效支持跨主機之間的容器遷移、管理複雜(lxd解決了這些問題)。lxc和docker不一樣地方在於lxc包含完整的操做系統,是一個系統容器。linux
Docker的底層使用了LXC來實現的,但docker對lxc封裝,提供了更好的操做性和移植性。Docker容器將應用和其依賴環境所有打包到一個單一對象中,在不包含完整的操做系統的狀況下就能運行普通應用,更加輕量級,可移植性更好。因此它成爲了PaaS(好比Kubernates)平臺的基石。git
除了lxc底層基礎以外,Docker還提供了一個具備如下強大功能的高級工具:redis
跨機器的便攜式部署。 Docker定義了一種將應用程序及其全部依賴綁定到一個單獨對象中的格式,該對象能夠被傳輸到任何啓用docker的機器上,並在那裏執行,保證暴露給應用程序的執行環境是相同的。 Lxc實現了流程沙盒,這是便攜式部署的重要先決條件,但單靠這一點對於便攜式部署來講是不夠的。若是您向我發送了一個安裝在自定義lxc配置中的應用程序的副本,那麼它幾乎確定不會像咱們的機器那樣在您的機器上運行,由於它與您計算機的特定配置有關:網絡,存儲,日誌記錄,發行版,等等。Docker爲這些特定於機器的設置定義了一個抽象,以便徹底相同的docker容器能夠在許多不一樣的機器上運行,即便不一樣主機具備許多不一樣的配置。sql
以應用爲中心。 Docker針對應用程序的部署進行了優化,而不是機器。這反映在其API,用戶界面,設計理念和文檔。相比之下,lxc助手腳本將容器做爲輕量級的機器 - 基本上是啓動速度更快,內存更少的服務器。咱們認爲容器不止於此。docker
自動構建。 Docker包含一個工具,供開發人員自動從源代碼中組裝一個容器,徹底控制應用程序的依賴關係,構建工具,打包等。他們能夠自由使用make,maven,chef,puppet,salt,debian包,rpms,source tarballs,或上述的任何組合,而無論機器的配置如何。shell
版本追溯。Docker包括用於跟蹤容器的連續版本,檢查版本之間的差別,提交新版本,回滾等相似git的功能。歷史記錄還包括如何組裝一個容器以及由誰來完成,所以您能夠從生產服務器一路回到上游開發商。 Docker也實現增量上傳和下載,相似於「git pull」,因此新版本的容器只能經過發送差別來傳輸。ubuntu
組件重用。任何容器均可以用做「基礎圖像」來建立更專業的組件。這能夠手動完成或做爲自動構建的一部分。例如,您能夠準備理想的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正在迅速將本身定位爲基於容器的工具的標準。
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:建立和恢復快照;
進入容器的方式有三種: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
"克隆"要麼是其餘容器的一份拷貝,要麼是其餘容器的一份快照。
拷貝:完整的複製原來的容器,所佔的空間和原來的容器同樣大
快照:利用後臺文件系統的快照功能,建立一個很小的新容器,在發生寫操做時才進行復制
要想使快照擁有這個寫時複製的特性,須要一個特殊存儲系統,支持快照的存儲方式有: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…
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 #設置默認網關
所謂的模板就是一個原型,依據該原型能夠建立一系列相似的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