Dockerfile编写规范
- 什么是Dockerfile
- Dockerfile简介
简而言之,dockerfile是镜像生产说明书,其作用是用来构建镜像的。
使用者通过Dockerfile就能知晓镜像每一层是如何构建的;
-
- Dockerfile的组成结构
Dockerfile编排包含基础镜像信息、维护者信息、镜像操作指令和容器启动指令四个结构,简单举例:
FROMopenjdk:8u151-jdk-alpine3.7 ENV JAVA_OPTS="-server -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=20 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Duser.timezone=Asia/ShangHai -Djava.security.egd=file:/dev/urandom" WORKDIR /mnt/morpheus/ms COPY morpheus-common-gateway*.jar ./morpheus-common-gateway.jar COPY config/ ./config EXPOSE 8200 ENTRYPOINT java ${JAVA_OPTS} -jar morpheus-common-gateway.jar |
- 编写规范Dockerfile
- 编写规范的目的
Dockerfile编写规范的目的:旨在构建最小、最快,最少层的镜像。
-
- 基础镜像挑选
微服务推荐选用openjdk:8u151-jre-alpine3.7基础镜像,具有基础的java环境,大小仅57M。
更小的镜像意味着更少依赖,更少变化,更少问题,更快拉取,更快加载,更省资源。
Dockerfile编排第一行使用:FROM openjdk:8u151-jre-alpine3.7
-
- 谨记容器都是暂态的
无论容器中产生了什么数据,都会在关停和重启时删除,容器一定是无状态的。因此一定不要在容器中存储持久化数据,容器的状态需要外置。
-
- 不能出现软件包安装和更新操作
不要在Dockerfile出现软件的安装,比如RUN yum install mysql 或 RUN yum update mysql。如果需要依赖其他软件,可以选择直接使用dockerhub相关镜像或者重新构建一个合适的基础镜像。
-
- 不发生变化的layer放在前面
为了保证layer缓存可以复用从而增加构建速度,尽量把稳定的、不变的layer放在前面。
-
- 把联系紧密并且相对独立的几个RUN指令合并成一条
如果有几个镜像RUN指令联系紧密,需要把几个RUN指令通过 && 符号连接到一块,减少layer层数。
例如: RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime&& echo $TZ > /etc/timezone
这条指令即是把联系紧密的两条命令用&& 连成一条,只会构建一个layer;
-
- 避免安装不必要的包
一定要在Dockerfile 里编写与自己容器启动相关的环境,所有编写指令信息都是围绕容器指令启动和稳定运行而执行的。比如启动jar包的Dockerfile编写不要添加C++的依赖环境。这样做是为了减少容器的复杂度、依赖关系、尺寸以及构建时间;
-
- 一个容器只有一个微服务
尽量保证一个容器只有一个运行程序,保证容器镜像的清洁,独立和可规模化(多实例部署、横向扩展)。
-
- 容器中启动的Java程序需要使用命令行参数
增加JVM启动参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
Java8 以前,JVM无法识别出自己在容器中,也不能识别cgroups所设置的内存限制。在申请的内存超过cgroups限制时,程序就会崩溃。Java8 通过开启这两个参数,使JVM识别出cgroups限制。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
云办公系统 skyeye v3.7.5 发布,ERP商城更新
智能办公 OA 系统[SpringBoot2-快速开发平台],适用于医院,学校,中小型企业等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。 已和申科达成长期合作策略 云办公系统 skyeye v3.7.5发布,更新内容: US: 申科老数据同步升级 新增门店下操作功能 新增店员操作功能 一期会员模块联调完成 新增数据同步开关,控制数据是否同步的功能 修改问题单若干个 企业版改进计划,改进计划优惠多多哦。详情 erp:https://gitee.com/doc_wei01/erp-pro OA:https://gitee.com/doc_wei01/skyeye 报表:https://gitee.com/doc_wei01/skyeye-report 企业版信息:https://docs.qq.com/doc/DQlRxcVRMWWVjbU1i?_from=1&disableRe...
- 下一篇
Kubernetes 的学习路径,容器混合云到底有没有 “easy mode”
近年来,兼具公有云和私有云优势的混合云模式逐渐成为主流。Flexera 发布的 2021 云状态报告显示,92% 的企业在 IT 架构上选择多云战略, 其中 82% 的企业选择混合云。随着混合云的应用越来越广泛,越来越多用户发现在复杂的混合云环境完成容器编排并不容易。虽然 Kubernetes 已成为容器编排和调度的事实标准,但是 Kubernetes 操作复杂,且只专注于单集群租户管理,在多集群管理,尤其是涉及跨云的多集群管理方面并不完善。此外,Kubernetes 为云数据中心设计在边缘计算场景中也有一定的局限性。 面对 Kubernetes 存在的问题以及混合云旺盛的市场需求。各大公有云厂商纷纷推出自己的混合云容器服务,一时间,各类产品和解决方案让人眼花缭乱。在各具优势的混合云容器产品中该如何选择?只要弄清楚混合云容器服务背后的技术路线,便有助于指导开发者痛苦的技术选型之路。 基于 Kubernetes 的开源项目到底香不香? 当前的混合云容器服务大致可分为两类,一类是基于 Kubernetes 的,另一类是不基于 Kubernetes 的自研项目。由于 Kubernetes 已...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7设置SWAP分区,小内存服务器的救世主
- Linux系统CentOS6、CentOS7手动修改IP地址