Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像是 Docker 运行容器的前提,是Docker的核心。要想利用Docker镜像快速构建一个高性能的应用,首先你要制作一个好的镜像。
如何制作一个好的镜像?下面教你几个小诀窍。
为了让版本管理起来更方便,应用部署速度更快,在创建镜像的过程中,建议工程师们明确指定包含版本或者其他辅助信息的tag。如果不指定镜像tag,默认会使用latest。这样,每次启动应用实例时,都需要去镜像仓库检查镜像是否更新。这种方式不利于版本管理,对应用启动速度也有一定影响。
1、使用alpine版本的基础镜像,来减小镜像体积,以保证部署和扩容速度。
alpine是一个高度精简但又包含了基本工具的轻量级Linux发行版,本身的Docker镜像只有4~5M大小,各开发语言和框架都有基于alpine制作的基础镜像。因此,在开发自己应用的镜像时,要选择这些镜像作为基础镜像,这样可以大大减小镜像的体积。
如下是各种语言对应的基础镜像:
2、保证Dockerfile中的清理命令在同一行,也可以减小镜像体积。
Dockerfile的每条指令都会产生一个文件层,文件层越多镜像体积就越大。因此,对于不需要产生文件层的命令,要尽量合并到一起。比如,组件的安装清理就可以放在一条命令里面。如下:
Docker在build镜像的时候,如果某个命令相关的内容没有变化,会使用上一次缓存(cache)的文件层,在上传到镜像仓库时,这一层也就不需要上传了。利用这一点,在添加应用的时候可以分层添加,具体操作如下:
(1)将不变或者变化很少的体积较大的依赖库和经常修改的自有代码分开。
(2)因为cache缓存在运行Dockerbuild命令的本地机器上,因此,建议固定使用某台机器来进行Docker build,以便利用cache。
举个例子:
在构建Spring Boot应用镜像,我们可以通过以下操作来进行分层。
1、在Dockerfile所在目录,解压缩maven生成的jar包
- unzip <path-to-app-jar>.jar -d app
2、在Dockerfile中我们把应用的内容分成4个部分COPY到镜像里面:其中前面3个基本不变,第4个是经常变化的自有代码。最后一行是解压缩后,启动spring boot应用的方式。如下:
在应用的某个实例崩溃或者非正常退出时,很多进程管理程序并不退出,导致平台无法检测到应用已经不可用,进而无法重启应用。所以,要避免使用这类进程管理程序来启动镜像。
1、避免使用本地存储。应用镜像启动后,文件系统是临时的,崩溃后即被销毁。持久化数据,文件等需要存储到SDS,FDS等后端存储服务中
2、应用日志不能写到本地文件,需要写到标准输出或者标准错误,平台负责收集、汇总和后续的各种处理
10月29日,在全球虚拟化顶级技术峰会KVM Forum上,2020年全球企业KVM开源贡献榜...
授予了实例RAM角色后,您可以随时为ECS实例收回实例RAM角色。 操作步骤 登录 ECS...
TOP云 (west.cn)6月22日消息,据米友在微博上曝料称,三拼 域名 quanbaoyuan.c...
一键挂载有什么用 命令行挂载的问题 目前使用ECS挂载NAS 需要先登录ECS 然后手动...
域名注册 信息怎么查?一般是通过 whois查询 进行。 whois 可以查询, 域名 注册...
最经常的工作是将一些项目的数据从数据库导出,然后分门别类的列到excel表格中,...
每日内容推荐 最佳实践丨云上虚拟IDC(私有池)如何为客户业务的确定性、连续性...
大数据是人工智能技术的基础,目前我国很多行业都采取了数据化信息采集方式,但...
管理检测与响应根据不同版本提供不同的服务支持,详细内容如 表1 所示。 表1 管...
【喜报】SAP 中国研究院和中国科学院沈阳自动化研究所联合申报的「自适应可重构...