Docker定义
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的作用主要在于:让程序的运行环境得到充分虚拟与隔离的同时, 轻巧化.
我是不推崇过分详细阐述如何安装某一个软件的.首先版本不同,安装的命令,参数,方式本就不同,其次,不同的操作系统,不同的系统现有设置也会有影响..安装这种事儿,是非常容易过期的,再详尽的介绍也不一定适合自己.我只推荐一个地方:官网. 只需要选对自己的操作系统,基本都会很顺利
在这里梳理几个官网安装链接:
Docker的其他信息:
Docker(左)和传统虚拟化(右)的体系架构有这样2张经典的图解释:
显然,同样是为了虚拟化,解耦,第二种方式需要支撑起不同的操作系统运行,消耗较大.而docker仅仅是在Docker服务(由Docker引擎支撑)之下,使得程序在虚拟化环境中运行.
Docker产生的目的:
- 环境管理复杂,有各种各样的OS,中间件,App,一款产品能够成功发布,开发者需要关注过多琐碎的细节,管理困难,部署麻烦.
- 云计算时代的到来:(如AWS BPM的成功),引导开发者将应用转移到云上,这个虽然能大部分的解决硬件管理问题,然而软件配置和管理问题依然存在,Docker可以尝试新的软件管理办法解决这个问题.
- 虚拟化手段变化:云时代为了解决上述问题,采用标配硬件降低成本,采用虚拟化手段满足用户按需分配的资源需求和保证可用性和隔离性.但是这种虚拟化,往往用的是OS,GuestOS,对于Docker来说,这些虚拟化手段对资源的浪费是不小的.
Docker的4个性质:
- 隔离性: 每个用户实例时间相互隔离,互不影响. 一般的硬件虚拟化给出的方法是VM,而LXC给出的方法是container,更细一些讲就是kernel namespace.其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS("UNIX Time-sharing System")和用户空间隔离开。
- 可配额/可度量: 提供类似文件的接口,在文件夹中新建task文件,写入相关配置可以实现对进程的资源控制.
- 便携性:支持将不同目录挂在到同一个虚拟文件系统下. 例如将宿主机器的硬盘挂载到容器上,使得在不改变image的基础上,允许用户进行读写操作.
- 安全性:实现的Linux系统固有的安全标准, Docker Deamon的安全接口,
比较传统虚拟化和docker,两种方式还有2个比较大的不同:
- 传统虚拟化方式并没有严格要求在一个虚拟操作系统中只运行一个程序,是相对自由的一整个生态系统,里面不严格地有许多程序在运行.
- Docker在启动镜像的时候,无论是在命令的设置上,还是其根本的理念上,都希望用户使得一个容器只运行一个应用程序,可以形象理解成,一个鱼缸里只养一条鱼.因此,大家也可以参考这里十项Docker不该做的事儿
但是这2种虚拟化方式其实还是有些类似的地方的,比如:都是以镜像(images)为启动基础的,不同的镜像保存不同的系统/状态. 需要的时候,只需要读取某个镜像即可.
镜像和容器是2个很关键的概念.镜像可以理解为某种用以加载的资源,而容器,是运行着的镜像的实例.一个镜像可以有多个容器.
参考:[镜像(image)是动态的容器的静态表示(specification),包括容器所要运行的应用代码以及运行时的配置。Docker 镜像包括一个或者多个只读层( read-only layers ),因此,镜像一旦被创建就再也不能被修改了。一个运行着的Docker 容器是一个镜像的实例( instantiation )。]
我们可以在利用docker的commit命令将容器固化,将动态的镜像实例变成该瞬间的一个新的镜像.
生成镜像的两种方法:
- 利用一个已有的(来自本地/hub的)镜像创建一个容器,进入容器运行一些命令,利用docker commit生成新镜像.
- 在某个自己的目录,创建Dockerfile,在其中指挥一系列动作,直接用docker build利用已有的(来自本地/hubd)镜像创建一个镜像. // 这是更被推崇的方式
生成镜像的2种方法可以参考这篇文章
- 可以得到从一个基础镜像,最终生成自己想要的镜像: 或者是对元数据的修改,或者是对文件系统的修改.
- Docker在执行指令之后会创建临时镜像存储在cache中
- Docker镜像是基于基础镜像的多层叠加. 当Docker创建一个容器时,它会在基础镜像的容器层上添加一层可写容器层,接下来对容器的话是在这个层是进行的.
附10件使用容器时应避免的做法:
- 不要在容器中保存数据(Don’t store data in containers)
- 将应用打包到镜像再部署而不是更新到已有容器(Don’t ship your application in two pieces)
- 不要产生过大的镜像 (Don’t create large images)
- 不要使用单层镜像 (Don’t use a single layer image)
- 不要从运行着的容器上产生镜像 (Don’t create images from running containers )
- 不要只是使用 “latest”标签 (Don’t use only the “latest” tag)
- 不要在容器内运行超过一个的进程 (Don’t run more than one process in a single container )
- 不要在容器内保存 credentials,而是要从外面通过环境变量传入 ( Don’t store credentials in the image. Use environment variables)
- 不要使用 root 用户跑容器进程(Don’t run processes as a root user )
- 不要依赖于IP地址,而是要从外面通过环境变量传入 (Don’t rely on IP addresses )
参考资料:
http://www.cnblogs.com/yudar/p/4391556.html
http://www.cnblogs.com/sammyliu/p/5877964.html 刘世民