docker 是由著名 PAAS 公司 dotcloud 开源的 Linux 容器项目,在此之前,只有 cloudfoundry 下属的 warden 半死不活的慢慢前进着。 不管是 docker 还是 warden,其原理大多是通过 LXC( 即 CGroup 和 namespace 的结合)以及 AUFS 的结合,完成比较彻底的容器虚拟化。这里有个问题:AUFS 不是 linux 官版内核支持的文件系统。所以到现在,各种 PAAS 都是运行在 Ubuntu 系统上,因为只有这个系列的发行版默认打了 AUFS 的补丁。这也严重影响了 PAAS 开源社区的扩容:
docker 目前已经在积极准备将代码 port 到 BtrFS 上以备未来,不过在此之前,我们还是可以通过自己打补丁的方式,在 RedHat 系列上尝试 docker 的。目前社区已经有很多尝试:
其中,包括有三种内核,源代码编译支持3.8的,spec编译支持3.10的,以及已经打包完成的3.2的。 我已经尝试过在 Fedora19 上通过源代码编译,似乎内核从3.8到3.10有些变化,编译失败了。(但是尝试过编译3.8的确实没问题) 下面通过最简单的已经打包完成的3.2内核来快速部署 docker 到 CentOS6 上,以便尝鲜: rpm -e kernel-firmware rpm -i http://get.docker.io/kernels/kernel-3.2.40_grsec_dotcloud-4.x86_64.rpm /sbin/dracut --add-drivers dm-mod --add-drivers linear "" 3.2.40-grsec-dotcloud grub-install /dev/sda1 echo "blacklist evbug" >> /etc/modprobe.d/blacklist.conf echo "kernel.grsecurity.chroot_caps = 0" >> /etc/sysctl.conf echo "sysctl kernel.grsecurity.chroot_caps=1" >> /etc/rc.local echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf mkdir /cgroup echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab cat >> /boot/grub/grub.conf<<EOF title CentOS (3.2.40_grsec_dotcloud-4.x86_64) root (hd0,0) kernel /boot/vmlinuz-3.2.40-grsec-dotcloud ro root=LABEL=/ rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM selinux=0 initrd /boot/initramfs-3.2.40-grsec-dotcloud.img EOF reboot 内核的更新就是这些,记住这个包不支持 selinux,所以启动项里要加上 selinux=0。 然后重启登录重启并选择了新内核的主机,继续安装一些依赖工具: wget "ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/openSUSE/repositories/home%3A/awk2007%3A/fixes/Fedora_17/src/aufs-util-9999-14.1.src.rpm" sudo yum install glibc-static rpmbuild --rebuild aufs-util-9999-14.1.src.rpm rpm -U /root/rpmbuild/RPMS/x86_64/aufs-util-9999-14.1.x86_64.rpm wget ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el6/en/x86_64/dag/RPMS/lxc-0.8.0-1.el6.rf.x86_64.rpm wget http://apt.sw.be/redhat/el6/en/x86_64/dag/RPMS/lxc-libs-0.8.0-1.el6.rf.x86_64.rpm rpm -U lxc-0.8.0-1.el6.rf.x86_64.rpm lxc-libs-0.8.0-1.el6.rf.x86_64.rpm 然后下载 docker 的二进制文件运行,用源代码的话比较麻烦,docker 是用 golang 写的…… wget http://get.docker.io/builds/Linux/x86_64/docker-latest.tgz tar xzf docker-latest.tgz cd docker-latest 启动 docker 进程,输出如下:
[root@localhost docker-latest]# ./docker -d &
2013/08/24 18:24:18 WARNING: You are running linux kernel version 3.2.40-grsec-dotcloud, which might be unstable running docker. Please upgrade your kernel to 3.8.0.
2013/08/24 18:24:18 Listening for HTTP on /var/run/docker.sock (unix)
然后就可以通过 docker 命令运行了,示例及输出如下所示: [root@localhost docker-latest]# ./docker run -i -t busybox /bin/sh 2013/08/24 18:24:30 POST /v1.4/containers/create 2013/08/24 18:24:30 POST /v1.4/images/create?fromImage=busybox&tag= Pulling repository busybox Pulling image e9aa60c60128cad1 (latest) from busybox Pulling e9aa60c60128cad1 metadata Pulling e9aa60c60128cad1 fs layer Downloading 2.284 MB/2.284 MB (100%) 2013/08/24 18:28:37 POST /v1.4/containers/create 2013/08/24 18:28:37 POST /v1.4/containers/cdf0feaf24a9/start 2013/08/24 18:28:37 POST /v1.4/containers/cdf0feaf24a9/resize?h=27&w=121 2013/08/24 18:28:37 POST /v1.4/containers/cdf0feaf24a9/attach?logs=1&stderr=1&stdin=1&stdout=1&stream=1 BusyBox v1.19.3 (Ubuntu 1:1.19.3-7ubuntu1.1) built-in Shell (ash) Enter 'help' for a list of built-in commands. / # / # ls bin dev etc lib lib64 proc sbin sys tmp usr / # cd /root /bin/sh: cd: can't cd to /root 可以看到,现在登录进来是不能切换目录到 root 家目录的。 docker 已经运行起来了,更多实例,就可以看着 docker.io 上的文档慢慢进行了 (责任编辑:IT) |