一、Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案。
1.Docker与传统的VM对比
传统的虚拟化技术
1、纯软件的虚拟化是通过对于硬件层的模拟从而实现允许运行多个操作系统。
Guets OS运行在VMM之上
VMM(Virtual Machine Monitor)运行在Host OS之上
Host OS负责真正的对于底层硬件的调用
2、硬件辅助虚拟化需要硬件层面对于虚拟化的支持,类似Interl-TV技术等,具有更高的运行效率。
system-level virtualization
1、server virtualization method where the kernel allows multiple isolated user space instances.
2、不需要模拟硬件层
3、共享同一个Host OS的Kernal
4、user space instance = Container
2、Docker核心技术
1、CGroups限制容器的资源使用(cpu时间片、内存)
1、资源限制(Resource Limitation):cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)。
2、优先级分配(Prioritization):通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。
3、资源统计(Accounting): cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。
4、进程控制(Control):cgroups可以对进程组执行挂起、恢复等操作。
2、Namespace机制,实现容器间的隔离(网络、进程表)
1、pid,容器有自己独立的进程表和1号进程
2、net,容器有自己独立的network info
3、ipc,在ipc通信时候,需要加入额外信息来标示进程
4、mnt,每个容器有自己唯一的目录挂载
5、utc,每个容器有独立的hostname和domain
3、chroot,文件系统的隔离(对文件系统根目录隔离)
1、隔离根文件系统
3、docker实现
1、docker也是container技术的实现,最早使用LXC作为container的引擎
最新版本的docker使用libcontainer替换了lxc
2、采用aufs文件系统来管理Image和container
1、advanced multi layer unification filesystem
2、可以实现把多个不同目录的内容合并在一起
3、运行read-only和read-write目录并存
3、基于C/S架构的实现,Server端使用UnixSocket,也可以切换到TcpProtocol
4、docker hub(Docker的仓库)
1、类似于Github的服务,用来分发Image
2、大量标准的Image,例如Tutum/Ubuntu, Tutum/Mysql
5、docker的局限性
1、基于Linux64的,不能再32bit的环境下运行
2、GuestOS只能是Linux Base
3、隔离性相对于KVM等虚拟化技术有所欠缺
4、采用cgroup的resource control对于cpu的度量很难
5、container随着用户进程的停止而销毁
6、docker和LXC的区别
1、docker更专注的部署,而LXC专注于进程的隔离
2、docker有更好的api的方便对于docker容器的管理
3、dockerfile让image的创建变的容易
4、通过docker hub方便image的分享
二、Docker的安装
1、查看操作系统的版本信息
[root@webserver ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@webserver ~]# uname -r
2.6.32-431.el6.x86_64
Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum,
Docker要求的CentOS系统是64位,内核必须大于3.10
2、根据Docker的要求当前的OS必须升级内核版本(这步不是必须的,根据操作系统内核而定)
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-lt
#修改配置文件
vim /etc/grub.conf
#修改内容为
#将default=1修改为default=0
#reboot命令重启操作系统
#重新查看内核版本信息
3、通过epel包来安装Docker
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum -y install docker-io
4、启动Docker服务器(两种启动方式)
/etc/init.d/docker restart
service docker restart
当Docker服务安装成功之后,启动Docker时会出现错误,你重复restart的时候也会这样
查看Docker的日志文件
tail -f /var/log/docker
日志的内容为
\nTue Jul 26 16:02:59 CST 2016\n
time="2016-07-26T16:02:59.519939922+08:00" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
\nTue Jul 26 16:03:07 CST 2016\n
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
\nTue Jul 26 16:03:15 CST 2016\n
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
\nTue Jul 26 16:05:03 CST 2016\n
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
分析日志可以看出升级device-mapper-event-libs(详情请参考:http://stackoverflow.com/questions/27216473/docker-1-3-fails-to-start-on-rhel6-5)
yum install device-mapper-event-libs -y
升级完成之后,再restart容器就OK了
5、查看Docker的版本
docker version