LXC容器


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 Horizo​​n,造船廠),配置管理(廚師,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

6. docker到底比LXC多了些什么


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM