整理了一些资料,希望有帮助。
1.主要用途,目前有三大类
<a>提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
<b>提供弹性的云服务。因为 docker 容器可以随开随关,很适合动态扩容和缩容。
<c>组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
2.docker容器技术带来的好处
持续部署与测试
容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。
跨云平台支持
容器带来的最大好处之一就是其适配性,越来越多的云平台都支持容器,用户再也无需担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。目前支持容器的IaaS云平台包括但不限于亚马逊云平台(AWS)、 Google云平台(GCP)微软云平台( Azure)、 Open Stack等,还包括如Chef、 Puppet、 Ansible等配置管理工具。
环境标准化和版本控制
基于容器提供的环境一致性和标准化,你可以使用Git等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,你还能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。
高资源利用率与隔离
容器容器没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有不错的资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,保证了应用间不会相互影响。
容器跨平台性与镜像
Linux容器虽然早在 Linux2.6版本内核已经存在,但是缺少容器的跨平台性,难以推广。容器在原有 Linux容器的基础上进行大胆革新,为容器设定了一整套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了“构建次,到处运行”的理念,大大提高了容器的跨平台性。
易于理解且易用
一个开发者可以在15分钟之内人门docker并进行安装和部署,这是容器使用史上的一次飞跃。因为它的易用性,有更多的人开始关注容器技术,加速了容器标准化的步伐。
应用镜像仓库
docker官方构建了一个镜像仓库,组织和管理形式类似于 Github,其上已累积了成千上万的镜像。因为 docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利。
3.认识docker框架
docker架构图.pngImages(镜像):docker可以通过Pull和Push命令构建对象到服务中心。
Containers(容器):docker可以通过Start/Stop命令管理容器的生命周期。
Logging(日志):docker可以通过stdout,stderro捕获输出所有的容器内部信息。
Volumes(存储):docker可以创建和管理容器的相关文件存储。
Networking(网络):docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接。
RPC:docker服务器提供允许外部程序去控制所有容器的行为的API。
镜像管理
镜像是Docker管理最基础的部分,同时也是Docker最大的亮点。镜像管理涉及到镜像的制作、更新、存储、分发、权限等多个方面。
镜像制作方面,应该坚持三个原则,第一是坚持镜像总是从Dockerfile生成。这样做最大的好处是可以通过Dockerfile“阅读”镜像,在后续的协作、升级维护等方面会带来巨大的便利。第二是镜像之间应该避免依赖过深,建议为三层,这三层分别是基础的操作系统镜像、中间件镜像和应用镜像。第三是坚持所有镜像都应该有对应的Git仓库,以方便后续的更新。
镜像的更新需要一个自动化的流程,这可以通过SCM和CI系统自动触发实现。具体的流程如下图所示。开发者首先将代码和Dockerfile提交到Git仓库,然后Git通过webhook方式触发Jenkins的主动获取代码和Dockerfile文件,Jenkins再通过Docker相关的插件生成镜像并推送镜像到私有的Registry。这样,在服务器上就可以通过拉取新的镜像部署容器。
关于Registry,可能会涉及三方面的问题,一个是单点问题,对应的解决方案可以考虑DRBD、分布式存储以及云存储。二是Regitry的性能问题,目前可用的解决方案是通过HTTP反向代理缓存来加速Layer的下载。三是Registry用户权限,Nginx LUA可以提供一个简单快速的实现方案。
发布管理
和传统的发布流程相比,Docker最大的好处是不需要考虑外部依赖,利用容器的自包含的特点,我们可以将发布回滚流程标准化和产品化。而传统的发布和回滚,需要casebycase去针对不同应用做升级回滚的方案。要做到基于Docker的发布,镜像的生成必须坚持自动化,否则会发现升级比传统的方法更麻烦。因此在现实中我们也发现很多企业将代码目录放到主机目录映射到容器内,这样做破坏了Docker的自包含特性,解决的办法是坚持应用镜像更新自动化。
日志管理
由于容器是无状态的,所以存储在容器内的日志会随着容器的销毁而消失。stdout/stderr类型的日志,可通过logspout转发到syslog中心来收集。打印到文件的支持,比如accesslog,需要将日志存储到外部的Volume,并在Docker主机上使用logstash收集转发。
配置管理
容器里没有CM agent,无法接收CM指令。CM运行到Host上也无法管理容器中的文件,如果手工修改容器内的配置,那新创建的容器仍然是旧的。配置大体上分为两种类型,一种是服务之间的连接信息,这种配置建议考虑使用服务发现系统,也可以使用一些更加传统的方法,比如通过环境变量来协调作开发和生产环境的配置差异。一种是一般的配置文件参数,配置文件和Dockerfile应该一起存储到一个Git仓库,修改后自动build更新镜像。
网络管理
目前Docker支持的网络包括Host网络、NAT网络、物理网桥和网络虚拟化。Host网络中容器和主机共享网络命名空间,不同容器需要做好端口规划,防止端口冲突。Nat网络是基于四层代理以及NAT技术,依赖portmap,进出都需要转发,性能低,主机上需要做好端口规划,容易搞混。物理网桥方案,和传统虚拟机的网桥没有区别,适合容器数量有限且相对静止的场景。网络虚拟化是基于隧道的overlay网络,目前开源方案有SocketPlane、Weave、Flannel,适合数量大,动态创建销毁容器的场景。
docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。
docker能处理的事情包括:
隔离应用依赖;
创建应用镜像并进行复制;
创建容易分发的即启即用的应用;
允许实例简单、快速地扩展;
测试应用并随后销毁它们。
网友评论