KVM, Virtualbox, Vmware是虚拟出机器,让每一个实例看到一个单独的机器;而Docker是虚拟出操做系统,实现应用之间的隔离,让各个应用以为本身有一个本身的操做系统,并且彼此之间隔离。假设没有Docker,而后有进程1和进程2,它们的运行将相似下图,进程1和进程2共享kernel,它们是同一OS下2个进程,所以必须拥有不一样PID,可是又共享网卡,共享IP地址,看到同样的根文件系统(不chroot的状况下)等,能够用Linux IPC手段进程间通讯。html
有Docker的状况下,假设进程1和进程2运行于不一样的容器,那么进程1和进程2都以为本身和对方没有半毛钱关系,都以为本身拥有本身的根文件系统,本身的网卡等,而后进程1和进程2的PID还能够同样,好比假设2个都是100。可是,此100非彼100。linux
Virtualbox等虚拟机的思路则彻底不同,若是进程1和进程2运行于不一样的虚拟机,则操做系统都是双份的,它们感受本身在不一样的虚拟电脑上面跑。nginx
因为可见,Docker达到了相似虚拟机的效果,可是又没有虚拟机的开销,它虚拟的层次更加高。Docker不虚拟机器,仅仅虚拟应用的运行环境。git
虚拟化,本质上一种虚幻,给你一种幻觉,让你以为拥有的不少甚至拥有全世界,哪怕你实际是一只蝼蚁。github
通过本人多年研究,虚拟化的技术分为2种,一种是虚拟一个世界,第二个是虚拟一个氛围。web
好比咱们在现实生活里面是个屌丝,可是在虚拟人生的游戏里面,咱们能够是王思聪++,集美貌智慧财富正义于一辈子。虚拟人生的游戏,构建一个整个的新世界,这个世界,人人有房住,天下没有贼。那么这个就是硬件都变了,你的内核都变了。这个是Virtualbox,KVM这种虚拟出一个新世界的思路。docker
虚拟一个氛围,是Docker的作法。例如贵公司的Linux部门之前只有3,4个工程师,而后有一个manager,后来有30我的了,你就能够分什么内核组、驱动组、应用组等更多的组,而后又多出几个manager。这种组,相似于名称空间,在每个单独名称空间的manager,都以为本身是个manager,因而他会爽那么一点点。ubuntu
最开始是这样的markdown
后来是这样的
架构
若是这样还不够,还能够搞声卡驱动组manager,网卡驱动组manager,反正能够不停地搞。你们在各自的container里面占山为王。
Docker就是这样的名称空间让各自在一样的Linux平台上面各自暗爽,装到你本身的容器里面爽。
若是是Windows主机,能够下载docker-toolbox一路安装,安装过程当中若是提示什么错,能够把360等相似软件关闭。Windows安装好Docker后,使用Docker Quickstart Terminal运行。
若是是Ubuntu,能够按照https://docs.docker.com/engine/installation/linux/ubuntu/网页进行安装。最简单的Ubuntu 16.04就是命令:sudo apt-get update&& apt-get install docker。
Ubuntu安装Docker后,能够把当前用户加到docker用户组以便当前用户也有权限操做docker client和host之间的通讯socket(以后请重启docker相关服务):
sudo usermod -aG docker $USER
为了装逼须要,咱们在docker hub网页注册一个用户名,我注册的用户名是21cnbao。这样之后,就能够本身提交本身的image了。
Docker中可能涉及到3个机器或者更多机器,一个运行docker命令的client, 一个包含images并以容器(container)形式运行image的主机,一个docker的images仓库。client与docker host上面的docker daemon通讯。固然docker client和host能够运行于一台机器(咱们作实验的时候是一台),默认的docker仓库是Docker Hub。
通常的流程中,client发pull命令从仓库把image拉到docker host,而后经过run命令指挥image到host上面弄一个container来跑这个image。
固然也能够是相反的流程,client 经过build命令在host上面建立一个本身的image,而后经过push命令把image推到仓库。以后这个image能够被别的人或者本身pull。
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。image为特定目的而生,好比弄了个nginx的image后,这个image就把nginx的东西一应俱全了,不管是张3、王5、六麻子仍是七癞子,不管它是什么电脑,什么操做系统,只要支持docker,它把这个nginx的image下载下来后,拿docker run命令就能够弄容器跑nginx了。这样,用户就不用装nginx以及它依赖的一切包了(一般装一个软件弄依赖也能把你弄地烦躁死了)。这样看起来,Docker实在是居家旅行,杀人越货之必备良器也!
镜像构建时,会一层层叠加,前一层是后一层的基础。
每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层。好比,删除前一层文件的操做,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。因此这个很相似git里面这一次提交相对于上一次提交的diff:
$git diff layout/book_index_template.html | 8 ++- text/05_Installing_Git/0_Source.markdown | 14 ++++++ text/05_Installing_Git/1_Linux.markdown | 17 +++++++ text/05_Installing_Git/2_Mac_104.markdown | 11 +++++ text/05_Installing_Git/3_Mac_105.markdown | 8 ++++ text/05_Installing_Git/4_Windows.markdown | 7 +++ .../1_Getting_a_Git_Repo.markdown | 7 +++- .../0_Comparing_Commits_Git_Diff.markdown | 45 +++++++++++++++++++- .../0_Hosting_Git_gitweb_repoorcz_github.markdown | 4 +- 9files changed, 115 insertions(+), 6 deletions(-)
这些叠加的最后一层就是container,因此你在container里面改了文件,其实不会进image。