十分鐘寫一個簡單的docker

我在這個視頻(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

wKioL1V-037gdPp7AAIzooU14z8616.jpg


指定該虛擬機每秒只能使用10000us CPU,就是10%ubuntu

wKiom1V-0dHSg8yYAAJVG1JjIaU216.jpg


命名空間隔離bash


啓動一個虛擬機,地址爲192.168.1.100,而且啓動一個redis-server,在主機裏能夠訪問。網絡

wKioL1V-036CLkjhAAJr0R46yy4928.jpg


運行環境隔離ide


我有一套ubuntu14.04的運行環境,切換進去後,test.py的pwd變成了/,而且這個環境裏沒有安裝redisspa

wKiom1V-0dHQcUfNAAEVH4QTEG4709.jpg

相關文章
相關標籤/搜索