Docker介绍Docker是一个开源项目,诞生于2013年初,最初是dotCloud内部的一个业余项目。它是基于谷歌推出的Go语言实现的。该项目后来加入了Linux基金会,遵守Apache2.0协议,项目代码维护在GitHub上。Docker项目的目标是实现一个轻量级的操作系统虚拟化解决方案。Docker基于Linux容器(LXC)等技术。Docker在LXC的基础上进行了进一步的封装,让用户无需关心容器的管理,操作更加简单。用户操作Docker容器就像操作快速、轻量级的虚拟机一样简单。下图比较了Docker与传统虚拟化方式的区别。可以看出,容器在操作系统层面实现虚拟化,直接复用本地主机的操作系统,而传统方式是在硬件层面实现。Docker的优势作为一种新兴的虚拟化方式,Docker与传统的虚拟化方式相比有很多优势。首先,可以实现秒级启动Docker容器,比传统的虚拟机方式要快很多。其次,Docker对系统资源的利用率高,单台主机上可以同时运行上千个Docker容器。除了在容器中运行应用外,基本不消耗额外的系统资源,使得应用的性能非常高,同时系统开销也尽可能小。传统的虚拟机方式需要10台虚拟机来运行10个不同的应用,而Docker只需要启动10个孤立的应用。就我对Docker的了解,目前在使用docker的过程中,基本上都是在本地开发项目,生成dist文件目录,迁移到docker上,相当于只在生产环境开发使用docker。主要原因有以下几点:在开发环境中使用docker还是不太舒服。每次修改都要重建运行,很麻烦。本地开发更舒服;docker其实可以看做是一个封闭的盒子,做一些查看和操作还是有点麻烦。是的,交互性不是很好,感觉更适合生产环境。Dockerhub简介目前,Docker官方维护着一个公共仓库DockerHub,里面已经包含了15000多个镜像。大部分需求可以通过直接从DockerHub下载镜像来实现。登录可以通过执行dockerlogin命令输入用户名、密码和邮箱完成注册登录。注册成功后,用户的认证信息会保存在本地用户目录下的.dockercfg中。dockerlogin--username=username--email=email@gmail.com下载根据是否官方提供,镜像资源可以分为两类。一种是像centos这样的基础镜像,称为基础镜像或根镜像。这些基础镜像由Docker公司创建、验证、支持和提供。此类图像通常使用单字名称。还有一种类型,例如tianon/centosimages,由Docker用户创建和维护,通常带有用户名前缀。您可以使用前缀user_name/指定用户提供的图像,例如tianon用户。dockerpullapline//ordockerpullmhart/alpine-node-auto提交修改当前镜像后,需要提交修改后的镜像。修改镜像包括提交的流程如下:首先使用下载的镜像启动容器。dockerrun-t-itraining/sinatra/bin/bashroot@0b2616b0e5a8:/#注意:记住容器的ID,后面会用到。将json包(一个rubygem)添加到容器中。root@0b2616b0e5a8:/#geminstalljson完成后,我们使用exit退出,现在我们的容器已经被我们更改了,使用dockercommit命令提交更新的副本。dockercommit-m"Addedjsongem"-a"DockerNewbee"0b2616b0e5a8ouruser/sinatra:v24f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c其中user-m指定我们使用与提交的版本控制相同的描述信息;是用来创建镜像的容器的ID;***指定目标镜像的仓库名称和tag信息。创建成功后,返回镜像ID信息。使用dockerimages查看新创建的镜像。Afterthat,youcanusethenewimagetostartthecontainer$dockerrun-t-iouruser/sinatra:v2/bin/bashroot@78e82f680994:/#UploadUserscanusethedockerpushcommandtouploadtheimagetheycreatedtothewarehouseforsharing.Forexample,afterusersregisteronDockerHub,theycanpushtheirownimagestothewarehouse.$dockerpushouruser/sinatraThepushreferstoarepository[ouruser/sinatra](len:1)SendingimagelistPushingrepositoryouruser/sinatra(3tags)ModifythetagoftheimageUsethedockertagcommandtomodifythetagoftheimage.$sudodockertag5db5f8471261ouruser/sinatra:devel$sudodockerimagesouruser/sinatraREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEouruser/sinatralatest5db5f847126111hoursago446.7MBouruser/sinatradevel5db5f847126111hoursago446.7MBouruser/sinatrav25db5f847126111hoursago446.7MB利用Dockerfile来创建镜像使用dockercommit来扩展一个镜像比较简单,但是不方便在一个团队中分享。Wecanusedockerbuildtocreateanewimage.Todothis,youfirstneedtocreateaDockerfilethatcontainssomeinstructionsonhowtocreatetheimage.Dockerfile中的每条指令都会创建一个镜像层,例如:#Dockerfile.alpineFROMmhart/alpine-node:latestMAINTAINERzhanfang"fzhanxd@gmail.com"#Ifyouhavenativedependencies,youllneedextratools#RUNapkadd--no-cachemakegccg++python#CreateappdirectoryRUNmkdir-p/usr/src/appWORKDIR/usr/src/app#Ifyourprojectdependsonmanypackage,youcanusecnpminsteadofnpm#RUNnpminstallcnpm-g--registry=https://registry.npm.taobao.org#InstallappdependenciesCOPYpackage.json/usr/src/app/RUNnpminstall--registry=https://registry.npm.taobao.org#BundleappsourceCOPY./usr/src/app#ExposeportEXPOSE3000CMD["npm","start"]写好Dockerfile后,就可以使用dockerbuild生成镜像了。dockerbuild-talpine-koa2-startkit。-t标志用于添加一个标签来指定新图像的用户信息。“。”是Dockerfile所在的路径(当前目录),也可以换成Dockerfile的具体路径。Dockfile中的指令一条一条执行。每一步都会创建一个新的容器,在容器中执行命令并提交修改(就像前面介绍的dockercommit)。执行完所有指令后,返回最终的图像id。删除并清理中间步骤生成的所有容器。注意一个镜像不能超过127层。镜像的下载、修改、上传都是基于alpine-node-auto镜像1.下载基础镜像dockerpullmhart/alpine-node-auto2.写一个dockerfile"fzhanxd@gmail.com"#Ifyouhavenativedependencies,youllneedextratools#RUNapkadd--no-cachemakegccg++python#CreateappdirectoryRUNmkdir-p/usr/src/appWORKDIR/usr/src/app#Ifyourprojectdependsonmanypackage,youcanusecnpminsteadofnpm#regcnall-ryp=https://registry.npm.taobao.org#InstallappdependenciesCOPYpackage.json复制代码/usr/src/app/RUNnpminstall--registry=https://registry.npm.taobao.org#BundleappsourceCOPY./usr/src/app#ExposeportEXPOSE3000CMD["npm","start"]3.新建镜像dockerbuild-t=zhanfang/alpine-koa2-startkit:v1".alpine-koa2-startkit:v1的tag4.运行容器实例dockerrun-t-i--namealpine-koa2-applicationzhanfang/alpine-koa2-startkit:v25.上传镜像(如果没有登录,请先登录,使用登录命令)dockerpushzhanfang/alpine-koa2-startkit
