本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文介绍:容器概述、容器的好处、容器交付流程划分、Docker容器、传统部署、虚拟机部署、容器部署
概述
一种标准化的软件单位,将软件包装成用于开发、装运和部署的标准单元。
容器是一个标准的软件单元,它将代码及其所有依赖项打包,从而使应用程序能够快速可靠地从一个计算环境运行到另一个计算环境。 一个 Docker 容器映像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切: 代码、运行时间、系统工具、系统库和设置。
容器的好处
- 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
- 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
- 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。
- 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
- 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
- 云和操作系统分发的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方运行。
- 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率和高密度
容器交付流程划分
- 本地开发阶段
- 代码编写
- 测试编写
- 容器化测试
- Dockerfile编写
- 编排模板编写
- 持续集成与持续交付
- 构建代码
- 打包构建产物
- 构建Docker镜像
- 推送Docker镜像
- 部署编排模板
- 环境部署
- 调整应用拓扑
- 调整接入层配置
- 调整扩缩容配置
- 监控、运维与调优
- 基础监控资源设置告警
- APM监控应用内部指标
- 安装调优工具进行调优
标准化交付
Cloud Foundry将运行的应用分成了以下三层:
- application layer:定义了软件的运行方式
- runtime layer:定义了软件的运行时依赖
- os image:定义了基础的系统依赖
Cloud Foundry (CF)是一个开源的云应用平台,提供云、开发框架和应用服务的选择。云计算让应用程序的构建、测试、部署和扩展变得更快、更容易。它是一个开源项目,可以通过各种私有云发行版和公共云实例获得。 www.cloudfoundry.cn/
Docker容器
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。 www.docker.com/resources/w…
Docker特点
- 标准(Docker 创建了容器的工业标准,所以它们可以在任何地方移动)
- 轻量(容器共享机器的 OS 系统内核,因此每个应用程序不需要一个 OS,从而提高了服务器效率,降低了服务器和许可成本)
- 安全(应用程序在容器中更加安全,Docker 提供了行业中最强大的默认隔离功能)
Docker VS 虚拟机
| 特性 | Docker | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 较弱 |
| 内存代价 | 较小 | 较多 |
| 磁盘使用 | Mb级 | Gb级 |
| 运行密度 | 单机支持上千个容器 | 一般几十个 |
| 隔离性 | 安全隔离 | 完全隔离 |
| 迁移性 | 优秀 | 一般 |
Docker核心
- Dockerfile(配置文件,目标是将应用进行抽象打包,用来生成Docker Image)
- Docker Images(Docker Image是创建Docker容器的基础,实现标准化交付)
- Docker Containers(容器是从镜像创建的应用运行实例)
- Docker Registry(仓库是集中存放镜像文件的场所)
- Docker Client(命令与API)
- Docker daemon(管理镜像和容器)
Dockerfile样例
FROM ubuntu:15.04
COPY . /app
RUN make /app
RUN python /app/app.py
- FROM 从ubuntu:15.04创建一个新的layer
- COPY 从Docker Client执行的当前目录拷贝文件到镜像中
- RUN 使用make命令编译你的应用
- CMD 指定容器启动的命令
Docker命令
# 通过Dockerfile,构建docker image
$ docker build -t image:tag .
# 通过docker image,创建docker container
$ docker run -d image:tag
Dockerfile语法
- FROM ubuntu:15.04 (定义basic image)
- MAINTAINER(定义开发者,建议使用LABER替换)
- RUN apt-get update -y (定义在Docker中执行的命令)
- LABER app="demo" (打标签)
- EXPOSE 80/tcp (暴露端口)
- ENV ()
- ADD src dest (ADD是COPY的超集,支持压缩包和远程路径)
- COPY src dest (推荐)
- ENTRYPOINT
- CMD
- SHELL
- VOLUME
- USER
- WORKDIR
Dockerfile优化
- 减少镜像的层数,尽量把一些功能上统一的命令合到一起来做
- 清理镜像构件的中间产物,比如一些安装包在安装完成之后就删掉
- 网络优化,用一些网络比较好的镜像源,可以节省时间,减少失败率
- 去用构建缓存,尽量把一些不变的东西或变的少的东西放前面(缓存生效关键点:镜像父层无变化、构建指令不变、添加文件校验和一致)
- 多阶段镜像构件,把构建和真正的产物分离,构建就用构件的镜像去做,最终产物就用最终产物的镜像
Docker Image底层实现
Dockerfile中的每一条指令都是一个Layer,而Docker Image就是一个由多个Layer组成的文件
分层存储会带来两个优点:
- 分层存储的镜像比较容易扩展
- 可以优化镜像的存储空间
容器如何解决微服务的缺点
- Dockerfile将微服务中的语言、框架等的复杂性进行了封装
- Docker Image将交付最小单元进行了定义,降低了交付复杂性
- Docker的API以及上层的编排系统实现了拓扑的管理
- 越来越丰富的容器生态使微服务不止从交付,更从框架级别进行了支持
容器交付的难点和问题
- 使用容器有较高的学习成本,技术成本
- 容器架构与现有的系统集成存在一定的困难(监控、发布等)
- 容器的交付流程改变了现有的交付方式,引入了更多的步骤和成本
如何解决容器的缺点
DevOps可以将容器交付流程自动化,降低交付成本,其他的问题交给云厂商
传统部署、虚拟机部署、容器部署
-
传统部署时代: 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
-
虚拟化部署时代: 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。
-
容器部署时代: 容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。