当前位置: 首页 > 技术与资源 > 技术分享 > 正文

Docker容器技术研究

2016-02-04 19:06:07
作者:晏杰宏新炬网络高级技术专家。

一. 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使用