我在這個視頻(http://pan.baidu.com/s/1c0fKOtM)裏介紹了容器虛擬化的原理,主要有三個方面:資源隔離,命名空間隔離,運行環境隔離。這些東西都是linux自己就有的功能,只須要寫一個shell腳本,就能實現一個簡單的虛擬機,和docker相似。linux
代碼以下:redis
#!/bin/bash #用法:mydocker.sh $root_dir $ip_addr $cpu_us(每秒鐘CPU使用的us數) #例如: sh mydocker.sh /p_w_picpaths/fedora/ 192.168.1.10 10000 #上面的意思是,啓動一個fedora虛擬機,ip地址爲192.168.1.10,CPU最多10% #須要事先建立一個網橋mydocker #若是沒有brctl命令,ubuntu使用apt-get install bridge-utils安裝 #好比網橋的ip爲192.168.1.1/24 #那麼虛擬機的地址應該和這個網橋一個網段,本身控制IP不重複 #建立網橋的shell #1. brctl addbr mydocker #2. ip link set mydocker up #3. ip addr add 192.168.1.1/24 dev mydocker #獲取一個時間戳,用於爲以後的各類變量命名 timestamp=`date +%s` ################資源隔離##################### #爲父進程建立一個cgroup,僅對cpu作限制 cgroup=CG"$timestamp" mkdir -p /sys/fs/cgroup/cpu/$cgroup echo $3 > /sys/fs/cgroup/cpu/$cgroup/cpu.cfs_quota_us echo $$ > /sys/fs/cgroup/cpu/$cgroup/tasks ################命令空間隔離################ #建立一個新網絡名字空間 namespace=NS"$timestamp" ip netns add $namespace #建立一對虛擬設備A,B PEER_A=A"$timestamp" PEER_B=B"$timestamp" ip link add $PEER_A type veth peer name $PEER_B #把B放到新的名字空間,更名爲eth0,分配地址 ip link set $PEER_B netns $namespace ip netns exec $namespace ip link set dev $PEER_B name eth0 ip netns exec $namespace ip link set eth0 up ip netns exec $namespace ip addr add $2/24 dev eth0 #把A連到主機的一個網橋上 brctl addif mydocker $PEER_A ip link set $PEER_A up ###############運行環境隔離################### #切換到新的root,而且執行新環境裏的/bin/bash ip netns exec $namespace chroot $1
資源隔離
docker
test.py會佔用100%CPU,可是啓動一個虛擬機,cpu限制在10%,那就只能用10%了shell
指定該虛擬機每秒只能使用10000us CPU,就是10%ubuntu
命名空間隔離bash
啓動一個虛擬機,地址爲192.168.1.100,而且啓動一個redis-server,在主機裏能夠訪問。網絡
運行環境隔離ide
我有一套ubuntu14.04的運行環境,切換進去後,test.py的pwd變成了/,而且這個環境裏沒有安裝redisspa