10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Docker 这么火,但你真的会写 Dockerfile 吗?【上】

2020 年 3 月 10 日

Docker 这么火,但你真的会写 Dockerfile 吗?【上】

Dockerfile 是应用一系列自定义的命令和格式构成文本文件从而简化镜像构建的过程。但如果处理不当,也会跌坑里~ Caicloud 独家奉献 Dockerfile 的 best practice。


应用最好不要跑在特权用户(root)底下

Docker 默认所有的应用都会跑在容器的 root user 底下,但是这样会造成一些潜在的安全隐患。在 production 环境跑的 Container 最好是通过 USER 命令跑在非特权用户底下。


隐患在哪,来补充一下~


安全隐患是说如果这个 container 被 compromise 了,那么如果是 root 在跑这个 container 更可能使系统出现问题。但是用 root user 本身应该是没问题的。


是指的如果用 root 跑 container 会有问题吗?那为啥推荐用 USER 命令来改变 docker 的非 root?


就是 Docker 的隔离效力有限,如果一个 container 里的应用是恶意的,而且是 root,那如果它改了系统配置(root 权限,比如 unload 某个系统 module,更改了某个系统文件),也会影响其他的 container(share 一个 kernel)。


避免使用 apt-get upgrade

Upgrade 命令是用来升级当前基础镜像的。非特权用户无法 Upgrade 一些核心的应用。而且 Upgrade 命令会打乱已经缓存的镜像,使得编译时间加长。在一般情况下,选用正确的基础镜像是不需要升级的,如果真的需要,最好联系基本镜像的维护方,这样所有使用者都能从中获益。如果只是需要更新某个程序 foo,那么使用 apt-get install –y foo 就能到达这个目的。


尽量合并命令

Dockerfile 中的每一个命令都会创建一个新的 layer,而一个容器能够拥有的最多 layer 数是有限制的。所以尽量将逻辑上连贯的命令合并可以减少 layer 的层数,合并命令的方法可以包括将多个可以合并的命令(EXPOSE, ENV,VOLUME,COPY)合并。


Dockerfile 中的每一个命令都会创建一个新的 layer,而一个容器能够拥有的最多 layer 数是有限制的。所以尽量将逻辑上连贯的命令合并可以减少 layer 的层数,这也可以加快编译速度?


将多个可以合并的命令(EXPOSE, ENV,VOLUME,COPY)合并,比如:



使用“&&”来连接 RUN 命令,比如:



不过过度合并命令可能会影响 Dockerfile 的可读性,所以需要在优化代码和可读性之间做出权衡。


合理安排命令的顺序

命令的顺序会影响编译所需要的时间。每一个命令都会产生一个 layer。如果一个 layer 已经在缓存中,那么生成这个 layer 所需要的时间就很短。从第一个不在缓存的 layer 起,所有以后的命令都会被重新编译。因为这个原因,我们推荐将不常变动的命令放在前面,这样可以使得更多的 layer 被成功缓存,从而减少编译时间。


避免在容器中存储数据

容器需要是无状态的,这样方便启动新的 Container 来替代 down 掉的 Container。如果容器中包含状态,那么就需要额外的运维人员来恢复 down 掉 Container 的状态。


使用.dockerignore

使用.dockerignore 可以减少拷贝不必要的文件到 Container,这样可以减少镜像大小。比如很多地方都有.git 文件,但是这个文件就不需要拷贝到 Container 里面。


避免安装不必要的软件

安装不必要的软件既浪费空间又增加编译时间。比如一个数据库的 Container 就没有必要安装文字编辑软件。


更进一步,如果程序能够在本地编译,那么就不用在 Container 里安装编译程序所需要的软件和 lib 了。直接把本地编译好的 binary 拷贝到 Container 里就好。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/mlfBH6qMtVGyTSsA4-S5IQ


2020 年 3 月 10 日 21:23391

评论

发布
暂无评论
发现更多内容

并发编程概览-从Lock和Synchronized说起

追风少年

Java 并发编程

信息流动过程中的聚类问题

Ryan Zheng

流程即代码:低代码 & 云研发 IDE —— Uncode

Phodal

ide 云开发 云研发

质量基础设施(NQI)“一站式”服务平台开发搭建

源中瑞-龙先生

NQI 质量基础设施“一站式”

助力初创企业加速升级,华为云初创扶持计划微光训练营南京站开营仪式成功举办

科技热闻

直破性能瓶颈!阿里百万级Java性能调优解决方案全栈实录终开源

程序员小毕

Java 程序员 架构 面试 性能优化

五层验证系统,带你预防区块链业务漏洞

华为云开发者社区

区块链 智能合约 漏洞 可信 自免疫系统

阿里P9分享:基于JDK 8 源码剖析

Java架构师迁哥

从原理到实践,手把手带你轻松get数仓双集群容灾

华为云开发者社区

容灾 集群 数仓 集群容灾 双集群

Apache Calcite:异质数据源优化查询框架

余生

sql Apache Calcite

深入浅出,阿里多位大佬联合撰写—153页Java多线程小册

互联网架构师小马

Java 面试 多线程 内卷

去阿里/腾讯/字节面试P7Java岗时,需要掌握哪些技术栈?

Java架构师迁哥

IDEA使用

xujiangniao

Java IDEA

毕业设计So Easy:基于Java Web学生选课系统

不脱发的程序猿

Java web 毕业设计 学生选课系统

云钉一体应用创新:音视频如何带来灵活高效的协同体验

阿里云视频云

阿里云 音视频

计算机专业的应届生想进大厂做开发有多难?

Java架构师迁哥

野生程序员高考试卷,试试你能打多少分?

北游学Java

程序员 高考

一口气了解【2021 阿里云峰会】重磅发布

阿里云视频云

阿里云

牛掰!阿里首席架构师用7部分讲明白了Java百亿级高并发系统(全彩版小册开源)

Java架构追梦

Java 学习 阿里巴巴 架构 百亿级并发架构设计

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

云流

Java 程序员 架构 面试

拼搏26天刷完了阿里大佬的Java面试合集1000题,拿到了月薪30K的offer

云流

Java 程序员 架构 面试

阿里分享:全网最详细的一篇SpringCloud总结

Java架构师迁哥

Apache APISIX 开源 2 周年!

Apache APISIX 中国社区

开源 后端 网关 架构·

来自Linux老学员的经验分享,新生必看!

学神来啦

Linux 运维 安全 虚拟机

怒肝最新保姆级前端学习路线,速成贴心全面!

程序员鱼皮

CSS JavaScript Vue 前端 React

机器学习- 吴恩达Andrew Ng 编程作业技巧 -John 易筋 ARTS 打卡 Week 50

John(易筋)

ARTS 打卡计划

2021上半年1000道大厂高频面试题汇总(Java岗)

Java架构师迁哥

深入浅出负载均衡

vivo互联网技术

负载均衡 高可用 服务器 hash

☕️【Java 技术之旅】深入分析JDK动态代理的分析(源码深入)

李浩宇/Alex

Java JVM 动态代理 6月日更

如何快速分类整理电脑文件

TroyLiu

文件管理 文件整理 电脑文件 文件分类 快速整理文件

一文讲懂服务的优雅重启和更新

万俊峰Kevin

Go 微服务 web开发 优雅停机

Docker 这么火,但你真的会写 Dockerfile 吗?【上】-InfoQ