如何写Dockerfile

82次阅读
没有评论

共计 1683 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要介绍“如何写 Dockerfile”,在日常操作中,相信很多人在如何写 Dockerfile 问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何写 Dockerfile”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

应用最好不要跑在特权用户(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 里就好。

到此,关于“如何写 Dockerfile”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计1683字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)