Docker学习笔记
一、什么是Docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
二、Docker的架构
1、Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 面向对象
容器 对象
镜像 类
2、Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
3、Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
三、Docker的应用场景
1、使应用的打包与部署自动化
2、创建轻量、私密的PAAS环境
3、实现自动化测试和持续的集成/部署
4、部署与扩展webapp、数据库和后台服务
四、Docker的缺点
1、Docker是基于Linux64bit实现的,无法在32bit的Linux/Windows/Unix系统上使用
2、LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
3、隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
4、网络管理相对简单,主要是基于namespace隔离
5、cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
6、Docker对disk的管理比较有限
7、container随着用户进程的停止而销毁,container中的log等用户数据不便收集
五、具体应用:一次封装,处处使用
将程序打包封装好,做成镜像,上传到(镜像仓库)服务器,然后哪里需要使用,下载-部署即可使用,不需要再在本地搭建环境。
六、应用场景举例
1、资源隔离。不同的应用程序可能有不同的应用环境,比如.net开发环境开发的网站和PHP开发的网站,他们的依赖的软件是不一样的。如果我们把依赖的软件都安装在一个服务器上,要调试很久,而且很麻烦。还会造成一些冲突,比如IIS和Apache,访问端口之间的冲突,这个时候我们就需要隔离.net开发的网站和PHP开发的网站。常规来讲,如果我们在服务器上创建不同的虚拟机,在不同的虚拟机上来放置这两个不同的应用是可以的,但是虚拟机的成本比较高。Docker可以实现像虚拟机一样隔离他们的应用环境,而且成本更低。
2、Docker可以实现跨平台/环境部署,没有环境转移产生的问题且部署速度更快。比如开发人员开发时用的是Ubuntu,运维管理用的centos,运维在把软件从开发环境转移到生产环境就会遇到一些问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持。这时候Docker可以把开发环境直接封装,然后部署到centos上就可以了,没有环境转移的问题而且部署速度很快。
七、Docker三大核心组件
使用Docker可以简单轻松的创建删除容器。
1、镜像(Image):镜像是构建Docker容器的基础,容器是镜像运行的实例。镜像是Docker运行容器的前提,仓库是存放镜像的场所,可见镜像的重要。镜像可以看作一个特殊的文件系统,包含了程序运行所需的环境(程序,库,资源,配置文件等)和配置参数(环境变量,用户,匿名卷等)。一个镜像可以包含一个完整的centos系统环境,里面仅安装了redis或其他应用程序。
2、容器(Container):Docker容器是镜像创建的运行实例,可以进行更改。镜像是静态的,构建完成之后无法修改,是只读的。容器在启动的时候会创建一层可写层作为最上层,镜像都在下面,称为镜像层。每个容器之间都是相互隔离的,保证平台的安全。
3、仓库(Respository):仓库是集中存放(存储分发)镜像文件的场所。分为public(公有)和private(私有)两种形式。当用户创建了自己的镜像之后就可以使用push命令将其上传到仓库,要使用时从仓库上pull下来即可。