构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言
写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些。前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I。
S2I介绍
S2I是Source-to-Image的缩写。
S2I是一套工具包和工作流程,用于从源代码构建重复性Docker镜像。
S2I是一个框架,它使写镜像变得简单。它把程序源代码作为输入,生成一个运行已组装应用程序的新镜像并作为输出。
S2I的详细介绍以及使用方法可以参考以下官方文档。本文就不复述(fan yi)了。
两种构建方式的过程
Talk is Cheap, Show me the Picture.
先上图。
源代码只是构建镜像的多种输入的一种,还有二进制文件等其它输入。镜像构建的过程也比较复杂。下图是为了清晰地进行对比,所以画得简单一些。
由上图可以看出,Dockerfile方式的构建过程比较直接:
- 根据Dockerfile定义的步骤,读取源代码,生成镜像(成品)。
而S2I方式的构建过程比较“曲折”:
- 根据Dockerfile定义的步骤,准备镜像环境、读取S2I脚本,构建镜像(中间)<又称构建器镜像 Builder Image>。
- 基于上一步生成的镜像(中间),读取源代码,根据S2I脚本定义的步骤编译源代码、部署二进制程序、八戒影院预备服务启动,构建镜像(成品)。
从上述过程可以看出,S2I方式比Dockerfile方式多了一步,多了两样东西:S2I脚本和镜像(中间)。
S2I脚本介绍
S2I脚本有4种。
- assemble: 负责构建程序,即编译、部署程序。
- run: 负责启动应用。
- save-artifacts: 负责增量构建(镜像),目前尚未使用。
- usage: 负责打印构建器镜像的使用说明。
S2I方式的好处
关于引入S2I构建镜像的好处,书面类的描述可以参考官方文档,这里谈谈实践下来个人的感受和理解。
首先,要了解为什么要引入S2I。
如果一定要把构建镜像分为两部分,可以分为
环境准备
- 定义基础镜像;
- 安装所需部件,如Maven、Java JDK;
- 拷贝/移动文件/目录;
- 定义用户;
- 暴露端口等。
源代码相关
- 编译源代码;
- 部署二进制程序;
- 定义服务启动方式等。
引入S2I的目的就是为了分离这两部分的工作。
其中环境准备工作交给了构建器镜像,
构建器镜像一旦生成将保持不变,可理解为静态部分。
而源代码相关工作交给了S2I脚本。
在构建镜像(成品)过程中,S2I将根据S2I脚本定义的步骤进行源代码编译、二进制程序部署、服务启动预备,可以理解为动态部分。
这样的分离带来了如下好处。
- 对于环境依赖相近、构建部署启动过程相似的程序,由于有构建器镜像的存在,构建过程不需要再次进行环境准备工作,从而节省了构建镜像(成品)的时间。
- 分工明确。构建工作的分离允许应用程序开发人员对他们的代码进行更改,而不用知道Dockerfile或Docker镜像的细节。如果镜像构建交付给S2I或PaaS(platform
as a
service)平台,开发工程师不需要理解Docker来对项目作出贡献。第九影院这在一个由很多人组成的企业环境中是非常有用的,这些人都有不同的专业方向,而且并不直接涉及到他们项目的构建过程。
构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式的更多相关文章
- [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...
- SpringBoot 构建 Docker 镜像的 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- SpringBoot 构建 Docker 镜像的最佳 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
- 基于url-to-pdf-api构建docker镜像,制作一个网页另存服务
基于url-to-pdf-api构建docker镜像,制作一个网页另存服务 业务背景: 需要根据一个url路径打印这个网页的内容 解决方案: 1.使用wkhtml2pdf 2.使用puppeteer ...
- 如何构建Docker镜像
构建Docker 镜像有如下两种方法: (一)使用docker commit命令.(二)使用docker build命令和 Dockerfile 文件.在这里并不推荐使用docker commit来构 ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...
随机推荐
- Java中阻塞队列的使用
http://blog.csdn.net/qq_35101189/article/details/56008342 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如 ...
- 如何安装Ruby(Windows)
Ruby解释器的安装 1.Windows平台 想尽快安装并运行Ruby,可遵循如下步骤: 1.启动Web浏览器,访问 http://www.ruby-lang.org/en/downloads/ 2. ...
- 网络基础-交换机、路由器、OSI7层模型
第1章 网络基础 1.1 网络的诞生 网络的诞生使命:通过各种互联网服务提升全球人类生活品质. 让人类的生活更便捷和丰富,从而促进全球人类社会的进步.并且丰富人类的精神世界和物质世界,让人类最便捷地获 ...
- 【c学习-3】
---恢复内容开始--- #include<stdio.h> int main(){ ]={,,,,}; ; ;i<=;i++){ printf("%d\n",a ...
- h5页面苹果端浮动问题
最近在开发一个h5的app端,前端同事写好页面,我们后端java动态化页面,测试的时候发现安卓端什么浏览器都正常如下图1,可是苹果端无论什么浏览器都出现了底部菜单缺少了两个下图2图一:正常显示 图2, ...
- 微信小程序推广方案
拥有小程序只是基础,能玩转小程序运营才是关键.本文将会简单讲述十种最实用的小程序推广策略,结合具体案例阐述商家企业如何在拥有小程序后玩转小程序,快速实现小程序的推广. 一. 公众号+小程序 小程序可以 ...
- python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...
- 裸机——ADC
1.首先是ADC的基本知识 模拟信号,连续的 数字信号,离散的 模拟信号,现实世界的很多东西都是连续的,所以使用模拟信号才能准确描述,但是模拟信号不方便控制. 数字信号,计算机中的信号大都为数字的,数 ...
- 对文件 I/O,标准 I/O 的缓冲的理解
1.标准I/O缓冲区 要理解标准I/O,就要先知道文件I/O的业务逻辑. 下面图示为文件I/O 如执行下面的代码: write(fd, buf2, sizeof(buf2)); 图中 buf:就是bu ...
- 使用CSS3制作各种形状
CSS3的一个非常酷的特性是允许我们创建各种规则和不规则形状的图形,从而可以减少图片的使用.以前只能在Photoshop等图像编辑软件中制作的复杂图形现在使用CSS3就可以完成了.通过使用新的CSS属 ...