最近由于工作需要,开始接触Docker,以下就是我对Docker的部分理解,分享一下,如有不对的地方,请大家指教。
Docker是一个可以让开发者打包自己的应用以及依赖包到一个可移植的容器中然后发布到任何linux 机器上的工具,他可以很好的实现虚拟化,开发者可以很好的在Docker上对自己的应用成果进行管理。
Docker的应用场景:
1. 代码应用的自动化打包与发布
2. 自动化测试和持续集成、发布
3. 在服务型环境中部署和调整数据库或其他应用
与虚拟机相比他的优势所在:
如图所示,他们的主要区别在于资源的利用,当我们创建一个虚拟机的时候,就要给这台虚拟机分配一定的资源,如:内存,cpu等,当我们在一台虚拟机上运行job的时候,他只能占用该台虚拟机的资源,如果该台虚拟机job数量多的时候,他们所共享的资源也只能是该台虚拟机的资源,其他虚拟机的资源无法利用到,如果一个任务需要的资源超过一台虚拟机的所占有资源的时候,这个任务就无法执行。而Docker任务的执行是在一个一个container中运行的,在运行的时候container占有相对应的资源,运行完毕后将其释放,供其它container使用。再就是说,虚拟机一开始就分配好了固定数量的资源,而container可以更灵活的获得资源。
Docker主要包含三部分:
1. Docker image: 容纳需要的应用、环境和所依赖的包的一个镜像。
2. Docker image仓库:用来存放Dockerimage的一个仓库,开发者可以通过该仓库实现Docker image的共享。
3. Docker container: 利用Docker image创建Dockercontainer,获取相应的资源并运行相应的程序。
下面我们用一个例子来描述Dockers的整个流程:
$ docker run Ubuntu
这条指令主要是在运行Ubuntu这个Docker image。当我们提交这条指令的时候,Docker发生了一系列的动作:
1. Docker Client(客户端)将指令发送给DockerDaemon,它是Docker架构中常驻在后台的一个守护进程,接受并处理Docker Client 发送的请求。
2. Docker Daemon接收到请求之后,会启动一个job去本地查看Ubuntu这个镜像是否存在,如果不存在,那么就会到Docker image 仓库中去下载Ubuntu镜像
3. 当获取了镜像之后,Docker会用它来创建一个容器,也就是我们所说的container并为其分配文件系统并挂载一个可读写的层。
4. 然后docker的驱动模块中的networkdriver为container创建一个可以用来与本地主机交互的网路接口,并为其分配IP地址。
5. 分配资源并运行程序,并获得最终结果。