我在这个视频(http://pan.baidu.com/s/1c0fKOtM)里介绍了容器虚拟化的原理,主要有三个方面:资源隔离,命名空间隔离,运行环境隔离。这些东西都是linux本身就有的功能,只需要写一个shell脚本,就能实现一个简单的虚拟机,和docker类似。
代码如下:
#!/bin/bash #用法:mydocker.sh $root_dir $ip_addr $cpu_us(每秒钟CPU使用的us数) #例如: sh mydocker.sh /images/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
资源隔离
test.py会占用100%CPU,但是启动一个虚拟机,cpu限制在10%,那就只能用10%了
指定该虚拟机每秒只能使用10000us CPU,就是10%
命名空间隔离
启动一个虚拟机,地址为192.168.1.100,并且启动一个redis-server,在主机里可以访问。
运行环境隔离
我有一套ubuntu14.04的运行环境,切换进去后,test.py的pwd变成了/,并且这个环境里没有安装redis
时间: 2024-10-03 18:10:48