一. docker简介
1.1 什么是docker
Docker 是一个开源的基于轻量级虚拟化技术的容器引擎项目,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。诞生于2013年初,最初是 dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux 基金会,遵从了Apache2.0协 议,项目代码在GitHub上运行维护。Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案,Docker 的基础是Linux容器(LXC)等技术。在LXC的基础上Docker运行了进一步的 封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。说白了就是让开发者可以打 包他们的应用及依赖包到一个可移植的容器中,然后发布任何流行Linux机器上。
目标:一次封装,到处运行
1.2 认识Docker
Docker 平台工具、守护进程
Image 镜像,包括应用及系统的只读数据包
Container 容器,虚拟机的运行实例
Registry 仓库登记,管理镜像文件
Docker hub Docker官方公有仓库
1.3 Docker与虚拟机的优劣比较
1、 宿主机的操作系统上,通过虚拟化技术,实现了一个虚拟操作系统,随后,就可以在该虚拟操作系统上,安装自己所需的应用程序了。这一切看似非常简单,但其中 的技术细节是相当高深莫测的。凡是使用过虚拟机的人都知道,启动虚拟机就像启动一台计算机,初始化过程是相当慢的,我们需要等很久,才能看到登录界面。一 旦虚拟机启动以后,就可以与宿主机建立网络连接,确保虚拟机与宿主机之间是互联互通的。不同的虚拟机之间却是相互隔离的,也就是说,彼此并不知道对方的存 在,但每个虚拟机占用的都是宿主机的硬件与网络资源。
2、 宿主机的操作系统上,有一个 Docker 服务在运行(或者称为“Docker 引擎”),在此服务上,我们可开启多个 Docker 容器,而每 个 Docker 容器中可运行自己所需的应用程序,Docker 容器之间也是相互隔离的,同样地,都是占用的宿主机的硬件与网络资源。除了在技术实现 上完全不一样以外,启动速度较虚拟机而言有本质的飞跃,启动一个容器只在眨眼瞬间。
1.4 Docker特性
文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU、内存和网络带宽。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
1.5 Docker的目标
提供简单轻量的建模方式
职责的逻辑分离
快速高效的开发生命周期
鼓励使用面向服务的架构
1.6 Docker文件系统
Docker AUFS特性能
Docker镜像位于bootfs之上
每一层镜像的下面一层称为其父镜像(父子关系)
第一层镜像为Base Image
容器在最顶层
其下的所有层都为readonly
Docker将readonly的FS层称作 "image"
1.7 Docker应用场景
使用Docker容器开发、测试、部署服务。
创建隔离的运行环境。
搭建测试环境。
构建多用户的平台即服务(PaaS)基础设施。
提供软件即服务(SaaS)应用程序。
高性能、超大规模的宿主机部署。
二. Docker体系结构
2.1 Docker三大核心组件
docker三大核心组件:仓库、容器和镜像
2.1.1 仓库
仓库分为公有仓库和私有仓库。
仓库主要管理镜像存储,提供开发者上传和下载。
Docker Hub 公共注册服务器中的仓库
仓库相关命令:
docker search image_name //查看仓库镜像
2.1.2 镜像
容器的基石
层叠的只读文件系统
联合加载(union mount)
仓库相关命令:
docker images //查看本地镜像
docker pull image_name //去仓库下载镜像
docker push image_name //上传镜像到仓库
2.1.3 容器
一种虚拟化的方案
操作系统级别的虚拟化
只能运行相同或相似内核的操作系统
依赖于Linux内核特性:Namespace和Cgroups
通过镜像启动
启动和执行阶段
写时复制
容器运行相关命令
docker run -d --dns 172.17.42.1 -p 8080:80 -p 2022:22 -v /data:/data –v /etc/httpd/conf:/etc/httpd/conf -v /etc/httpd/conf.d:/etc/httpd/conf.d –v /etc/localtime:/etc/localtime:ro --name webserver1
docker start/stop/restart/attach/kill webserver1
2.1.4 传统与Docker模式软件部署比较
传统模式无法保证程序环境的一致性,有可能部署到其它环境会出现文件丢失等问题。
Docker模式会将开发的应用程序和应用依赖的文件打包在一个容器中,保证开发、测试、生产环境的一致性,移植非常方便。
三. Docker实现持续部署案例
1、GitHub将repo的每一个push通知给Jenkins。
2、Jenkins触发一个Maven build。
3、Maven 构建所有的东西,包括Docker镜像。
4、Maven会把镜像推送到私有的Docker Registry。
5、Jenkins会触发去Docker Registry pull镜像到本地。
6、最后Jenkins会自动启动应用容器 。
开发人员通过git push上传代码,经Git和Jenkins配合,自动完成程序部署、发布,全程无需运维人员参与。不仅仅是效率的提升,更是一种变革:开发人员第一次真正为自己的代码负责——终于可以跳过运维和测试部门,自主维护运行环境(首先是测试/开发环境)
四. 总结
Docker容器技术可以实现自动化部署应用,把开发者从日常部署应用的繁杂工作中解脱出来,让开发者能专心写好代码;从系统工程师的角度来看也是一样,他们迫切需要从各种混乱的部署文档中解脱出来,让系统工程师专注在应用的水平扩展、稳定发布的解决方案上。
就像docker提出来的目标“一次封装,到处运行”保证了应用程序环境一致性,同时更加轻松的迁移和扩展。
docker容器对系统资源的利用率很高,节省了大量硬件资源和设备的用电量。
Docker一直在面对技术挑战,从容地给出自己的解决方案。云计算发展至今,有很多重要的问题没有得到妥善解决,Docker正在尝试让主流厂商接受并应用它。
上一篇:jenkins+maven+jboss&tomcat自动化发布
下一篇:Oracle 12C InMemory使用