本文转载,版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。作者:宋宝华来源:微信公众号linux代码阅读领域(id:linuxdev)前2个小时,你会爱上Docker,对原理和使用过程有一个基本的了解,避免寻找类似的资料世界各地的无头苍蝇。我反对风雨飘摇的多管齐下轰炸学习法,提倡迭代学习法,即先会玩,有感性认识,再学习高级用法,深层次原理,一轮又一轮迭代。我们坚决反对一上来就用几百页的东西来搅乱人心。什么是码头工人?KVM、Virtualbox、Vmware都是虚拟机,这样每个实例都可以看到单独的机器;而Docker是一个虚拟操作系统,实现了应用程序之间的隔离,让每个应用程序都感觉自己有自己的操作系统,彼此之间相互隔离。假设没有Docker,那么有进程1和进程2,它们的运行会类似下图,进程1和进程2共享内核,是同一个OS下的两个进程,所以PID肯定不同,但是共享网卡和共享IP地址,看到相同的根文件系统(不用chroot)等,就可以使用LinuxIPC进行进程间通信。以Docker为例,假设进程1和进程2运行在不同的容器中,那么进程1和进程2都觉得自己没有任何关系,都觉得自己有自己的根文件系统,各自的自己的网卡等。那么进程1和进程2的PID还是可以一样的,比如假设都是100。但是这个100不是那个100。Virtualbox等虚拟机的思路是完全不同。如果进程1和进程2运行在不同的虚拟机上,操作系统是双重的,感觉是运行在不同的虚拟机上。可以看出,Docker实现了类似虚拟机的效果,但是没有了虚拟机的开销,其虚拟化程度更高。Docker不是虚拟机,只是虚拟应用程序的运行环境。为什么Docker也能“虚拟化”?虚拟化本质上是一种错觉,给你一种错觉,你拥有很多,甚至拥有整个世界,即使你实际上是一只蚂蚁。经过多年的研究,虚拟化技术分为两种,一种是虚拟化一个世界,一种是虚拟化一种氛围。比如,我们在现实生活中是屌丝,但在虚拟生活的游戏中,我们可以做王思聪++,集美貌、智慧、财富、正义于一身。虚拟生活游戏构建了一个全新的世界。在这个世界上,每个人都有房子住,世界上没有小偷。那么这就说明硬件变了,你的内核也变了。这就是Virtualbox,像KVM一样虚拟化一个新世界的想法。营造虚拟氛围是Docker的做法。比如你们公司的Linux部门,以前只有3、4个工程师,后来有了一个经理。后来有30人。可以多分一些内核组、驱动组、应用组等,然后再多加几个manager。这种组类似于命名空间。每个单独的命名空间中的经理感觉就像一个经理,所以他会感觉好一点。一开始是这样的,后来是这样的。如果这样还不行,还可以创建一个声卡驱动组管理器,一个网卡驱动组管理器,反正可以马不停蹄。每个人都在各自的容器中占据这座山为王。Docker就是这样一个命名空间,可以让它们各自在同一个Linux平台上很酷,安装在自己的容器里也很酷。如果你是在Windows主机上安装Docker,可以下载docker-toolbox,一路安装。如果在安装过程中提示有错误,可以关闭360等类似软件。在Windows上安装Docker后,使用DockerQuickstartTerminal运行它。如果是Ubuntu,可以关注https://docs.docker.com/engin...。最简单的Ubuntu16.04是命令:sudoapt-getupdate&&apt-getinstalldocker。Ubuntu安装Docker后,可以将当前用户加入docker用户组,这样当前用户也有权限操作docker客户端和宿主机之间的通信socket(之后请重启docker相关服务):sudousermod-aGdocker$USER为了强制需要,我们在dockerhub网页上注册了一个用户名,我注册的用户名是21cnbao。这样你就可以自己提交自己的图片了。Docker的架构Docker可能涉及到3台或更多的机器,一个运行docker命令的客户端,一个包含镜像并以容器的形式运行镜像的主机,以及一个docker镜像仓库。客户端与docker主机上的docker守护进程通信。当然dockerclient和host可以在一台机器上运行(我们做实验的时候是一台),默认的docker仓库是DockerHub。一般过程中,客户端发送pull命令从仓库中拉取镜像到docker宿主机,然后使用run命令命令镜像在宿主机上获取一个容器来运行镜像。当然,相反的过程也是可以的。客户端通过build命令在宿主机上创建自己的镜像,然后通过push命令将镜像推送到仓库。之后这个镜像可以被别人拉取,也可以自己拉取。头像是什么鬼?Docker镜像是一个特殊的文件系统,它不仅提供容器运行所需的程序、库、资源和配置文件,还提供一些为运行准备的配置参数(如匿名卷、环境变量、用户等).)。图像是为特定目的而诞生的。比如你拿到一个nginx镜像后,这个镜像会覆盖nginx里的所有东西,不管是张三、王五、六麻子还是七赖子,不管是什么电脑,什么操作系统,只要支持docker,下载nginx镜像后,使用dockerrun命令让容器运行nginx。这样用户就不需要再安装nginx及其依赖的所有包了(一般安装一个软件做依赖就可以烦死你了)。从这一点来看,Docker真的是居家旅行杀人的必备利器!图像构建时,会逐层叠加,上一层是下一层的基础。每一层构建完成后,不会再发生变化,下一层的任何变化只发生在本层。例如,删除上一层文件的操作,实际上并没有删除上一层文件,只是将当前层文件标记为已删除。所以这非常类似于git中这次提交相对于之前提交的差异:$gitdifflayout/book_index_template.html|8++-文本/05_Installing_Git/0_Source.markdown|14++++++文本/05_Installing_Git/1_Linux.markdown|17+++++++文本/05_Installing_Git/2_Mac_104.markdown|11+++++文本/05_Installing_Git/3_Mac_105.markdown|8++++文本/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+-9fileschanged,115inserted(+),6deletions(-)##说了这么多一个完整的docker实现,还是要自己玩玩了。接下来,玩拉、跑、建、推一次来揭开谜团。一个典型的操作流程如下:1.客户端使用pull命令从仓库拉取镜像到docker主机。dockerpull的格式为:dockerpull[options][DockerRegistryaddress]<仓库名>:<标签名>默认地址为DockerHub。仓库名:这里的仓库名是一个二段名,即/,“/”前面通常是用户名。对于DockerHub,如果没有提供用户名,则默认为library,即官方镜像。下载Ubuntu14.04镜像(以Ubuntu为例):baohua@ubuntu:~$dockerpullubuntu:14.0414.04:Pullingfromlibrary/ubuntuc60055a51d74:Downloading[>]539.8kB/65.69MB755da0cdb7d2:Downloadcomplete959d017f697come95999download9595:completea3d9f8479786:Downloadcomplete...运行dockerimages命令以查看下载的图像:$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEubuntuml14.04b969ab9f929b4weeksago188MB2.在docker主机上运行Ubuntu14.04。我们现在在容器中运行Ubuntu14。shell,因为docker在运行容器中的镜像时需要指定主进程(本例主进程为bash)。在终端1上运行dockerrun-it--rmubuntu:14.04bash并在终端2上运行dockerrun-it--rmubuntu:14.04bash,所以我们运行了2个镜像ubuntu14.04的实例(获取2个容器),Linux下的ps命令是看进程,docker下是看镜像的实例容器。$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESe3a913872698ubuntu:14.04"bash"11secondsagoUp10secondswizardly_eliondb1c25753e97ubuntu:14.04"bash"21secondsagoUp21imsecondsadore像处女一样安静,像兔子一样移动。比如程序QQ,运行一次就是一个QQ进程,运行另一个QQ就是第二个QQ进程。同样的道理,一个镜像也可以运行多个容器。3.构建自己的镜像现在我想在Ubuntu14.04中添加vim和gcc构建一个增量镜像,因为当前Ubuntu镜像中没有这个命令:root@e3a913872698:/#vimbash:vim:commandnotfound所以在Ubuntu在14.04镜像之上,叠加一层,然后提交到dockerhub的21cnbao仓库。我们需要在客户端电脑上创建一个Dockerfile(这个文件是用来描述镜像的)来达到在已有的Ubuntu14.04上做增量的目的。$mkdirmyubuntu$cdmyubuntu/$touchDockerfile使用vim编辑Dockerfile并添加以下内容:#ubuntu14.04withvimandgccFROMubuntu:14.04MAINTAINERBarrySong<21cnbao@gmail.com>RUNapt-getupdate&&apt-getinstall–yvimgccRUN命令的意思是在指定的源镜像中执行一条命令。本例更新APT缓存,安装vim和gcc形成增量镜像。下面build这个image:$dockerbuild-t21cnbao/myubuntu:14.04.time="2017-02-21T06:48:07+08:00"level=infomsg="Unabletousesystemcertificatepool:crypto/x509:系统根池在Windows上不可用”将构建上下文发送到Dockerdaemon2.048kBStep1/3:FROMubuntu:14.04--->b969ab9f929bStep2/3:MAINTAINERBarrySong<21cnbao@gmail.com>--->Runninginf1449746b58c--->5dacd7a6ee5dRemovingintermediatecontainerf1449746b58cStep3/3:RUNapt-getupdate&&apt-getinstallvimgcc--->在b1469caf3509Ignhttp://archive.ubuntu.comtrustyInReleaseGet:1http://archive.ubuntu.comtrusty-updatesInRelease[65.9kB]Get:2http://archive.ubuntu.comtrusty-securityInRelease[65.9kB]Get:3http://archive.ubuntu.comtrustyRelease.gpg[933B]Get:4http://archive.ubuntu.comtrustyRelease[58.5kB]Get:5http://archive.ubuntu.comtrusty-updates/mainSources[485kB]…下面运行21cnbao/myubuntu14.04这个镜像:dockerrun-it--rm21cnbao/米yubuntu:14.04bash发现gcc和vim都可用:$dockerrun-it--rm21cnbao/myubuntu:14.04bashroot@f33ee07caf43:/#gccgcc:fatalerror:noinputfilescompilationterminated.root@f33ee07caf43:/#4.通过dockerpush提交镜像到仓库在dockerhub上创建一个仓库myubuntu。仓库创建完成后,全名为21cnbao/myubuntu接下来将这个镜像推送到dockerhub,在我们需要登录dockerhub之前:$dockerlogin--username=21cnbao--email=21cnbao@gmail.comFlag--emailhasbeendeprecated,willberemovedin1.14.Password:登录成功开始推送如下:$dockerpush21cnbao/myubuntutime="2017-02-21T07:17:59+08:00"level=infomsg="Unabletousesystemcertificatepool:crypto/x509:systemrootpoolisnotavailable在Windows上“存储库的pushrefs[docker.io/21cnbao/myubuntu]87157b68b121:Pushing[>]1.109MB/134.7MBc9fc7024b484:Pushing[=====================================================>]3.072kBca893d4b83a6:推[===================================================>]4.608kB153bd22a8e96:推7.168kB83b575865dd1:推[====================================================>]209.9kB918b1e79e358:Waiting...通过dockerhub进了我哥的仓库看了看,发现大功告成了。2小时结束,相信你已经爱上Docker了。相爱容易相处难,痛苦才刚刚开始。人生若只如初见,秋风何愁画扇。待闲以换旧心,旧心易变。更多精彩更新来袭……欢迎关注账号:linux代码阅读领域(id:linuxdev)
