制作容器镜像的最佳实践(代码片段)

author author     2023-01-16     315

关键词:

概述

这篇文章主要是我日常工作中的制作镜像的实践, 同时结合我学习到的关于镜像制作的相关文章总结出来的. 包括通用的容器最佳实践, java, nginx, python 容器最佳实践. 最佳实践的目的一方面保证镜像是可复用的, 提升 DevOps 效率, 另一方面是为了提高安全性. 希望对各位有所帮助.

本文分为四部分内容, 分别是:

  1. 通用容器镜像最佳实践
  2. Java 容器镜像最佳实践
  3. NGINX 容器镜像最佳实践
  4. 以及 Python 容器最佳实践

通用容器镜像最佳实践

使用 LABEL maintainer

LABEL maintainer 指令设置镜像的作者姓名和邮箱字段。示例如下:

LABEL maintainer="cuikaidong@foxmail.com"

复用镜像

建议尽量使用 FROM 语句复用合适的上游镜像。这可确保镜像在更新时可以轻松从上游镜像中获取安全补丁,而不必直接更新依赖项。

此外,在 FROM 指令中使用标签 tag(例如 alpine:3.13),使用户能够清楚地了解镜像所基于的上游镜像版本。

:exclamation: 禁止使用 latest tag以确保镜像不会受到 latest 上游镜像版本的重大更改的影响。

保持标签 TAGS 的兼容性

给自己的镜像打标签时,注意保持向后兼容性。例如,如果制作了一个名为example 的镜像,并且它当前为 1.0 版,那么可以提供一个 example:1 标签。后续要更新镜像时,只要它继续与原始镜像兼容,就可以继续标记新镜像为 example:1,并且该 tag 的下游消费者将能够在不中断的情况下获得更新。

如果后续发布了不兼容的更新,那么应该切换到一个新 tag,例如 example:2。那么下游消费者可以按照自身实际情况升级到新版本,而不会因为新的不兼容镜像而造成事故。但是任何使用 example:latest的下游消费者都会承担引入不兼容更改的风险, 所以这也是前面我强烈建议不要使用 latest tag 的原因.

避免多个进程

建议不要在一个容器内启动多个服务,例如 nginx 和 后端 app。因为容器是轻量级的,可以很容易地通过 Docker Compose 或 Kubernetes 链接在一起。Kubernetes 或基于此的 TKE 容器平台通过将相关镜像调度到单个 pod 中,轻松地对它们进行集中管理。

在封装脚本中使用 EXEC 指令

许多镜像会通过在启动应用程序之前使用封装脚本进行一些设置。如果您的镜像使用这样的脚本,那么该脚本最后应该使用 exec 启动应用程序,以便用应用程序的进程替换该脚本的进程。如果不使用 exec,那么容器运行时发送的信号(比如 TERMSIGKILL)将转到封装脚本,而不是应用程序的进程。这不是我们所期望的。

清除临时文件

应删除在生成过程中创建的所有临时文件。这还包括使用 ADD 指令添加的任何文件。例如,

测试环境docker化—容器集群编排实践(代码片段)

...前文《测试环境docker化—基于ndp部署模式的docker基础镜像制作》中已经详述了docker镜像制作及模块部署的过程,按照上述做法已可以搭建测试环境。但是在实践过程中发现存在很多问题:在一台云主机上搭建多个模块,容易出现... 查看详情

测试环境docker化—容器集群编排实践(代码片段)

...前文《测试环境docker化—基于ndp部署模式的docker基础镜像制作》中已经详述了docker镜像制作及模块部署的过程,按照上述做法已可以搭建测试环境。但是在实践过程中发现存在很多问题:在一台云主机上搭建多个模块,容易出现... 查看详情

java程序制作docker镜像推荐方案(代码片段)

文章目录背景制作条件Dockerfile指令:实践步骤使用官网提供的基础镜像作为镜像基础设定容器的正确的时间和时区容器中采用非root用户权限启动应用程序DockerFile样例COPY与ADD区别举个栗子背景随着我们分布式的观念在各个领... 查看详情

dockerfile最佳实践(代码片段)

Dockerfile简介Docker通过读取Dockerfile文件中的指令自动构建镜像。Dockerfile文件为一个文本文件,里面包含构建镜像所需的所有的命令。Dockerfile文件遵循特定的格式和指令集Docker镜像由只读层组成,每个层都代表一个Dockerfile指令。... 查看详情

python3-dockerfile最佳实践(代码片段)

文章目录一、一般准则和建议1.1容器应该是短暂的1.2建立上下文1.3使用`.dockerignore`文件1.4使用多阶段构建1.5避免安装不必要的包1.6一个容器只专注做一件事情1.7最小化镜像层数1.8对多行参数排序1.9构建缓存二、Dockerfile指令... 查看详情

python3-dockerfile最佳实践(代码片段)

文章目录一、一般准则和建议1.1容器应该是短暂的1.2建立上下文1.3使用`.dockerignore`文件1.4使用多阶段构建1.5避免安装不必要的包1.6一个容器只专注做一件事情1.7最小化镜像层数1.8对多行参数排序1.9构建缓存二、Dockerfile指令... 查看详情

laocat带你认识容器与镜像(实践篇二下)(代码片段)

实践篇主要以各容器的挂载和附加命令为主。系列目录LaoCat带你认识容器与镜像(一)LaoCat带你认识容器与镜像(二【一章】)LaoCat带你认识容器与镜像(二【二章】)LaoCat带你认识容器与镜像(二【... 查看详情

k8s容器灰度发布最佳实践(基于spinnaker)(代码片段)

k8s中的容器一般是通过deployment管理的,那么一次滚动升级理论上会更新所有pod,这由deployment资源特性保证的,但在实际的工作场景下,需要灰度发布进行服务验证,即只发布部分节点,这似乎与k8s的deployment原理相违背,但是灰... 查看详情

docker镜像构建(代码片段)

...介  在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议。通常镜像的制作有两种方式:使用现有的容器使用dockercommit生成镜像使用Dockerfile进行镜像构建   采用dockerc... 查看详情

docker容器的原理与实践(下)(代码片段)

...经验。Docker原理分析Docker架构镜像原理镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜像基础上构建的容器为基础,以容器开发、测试、发布的单元将应用相关的所有组件和环境进行... 查看详情

docker实践:创建本地镜像(commitdockerfile)(代码片段)

...镜像,也是本地创建镜像的一种方式。通常我们自己制作镜像都是以某一镜像为基础,在此之上安装或者定制自己需要的镜像,推荐使用Dockerfile。一、commit命令创建本地镜像这边我们准备在centos为基础的镜像上,... 查看详情

13-docker技术基本应用实践(代码片段)

...ker在线安装DockerDocker入门实践基本操作核心对象分析镜像容器数据卷Docker镜像操作实践下载运行镜像删除镜像文件Docker容器操作实践启动分析查看容器信息停止或重启容器进入指定容器退出容器删除容器Docker数据管理实践概述数... 查看详情

auto和decltype的最佳实践(代码片段)

...有一个“最佳实践”,就是“range-basedfor”,不需要关心容器元素类型、迭代器返回值和首末位置,就能非常轻松地完成遍历操作。不过,为了保证效率,最好使用“constauto&”或者“auto&”。vector<int>v=1,3,5,7,9;//vector顺... 查看详情

容器安全之dockerfile安全扫描(代码片段)

一、Dockerfile扫描工具checkovhadolint(构建最佳实践Docker镜像。)也可以考虑dockerscan二、checkovDockerfileConfigurationScaning-checkovcheckov不仅可以扫描dockfile,也可以扫描Cloudformation、AWSSAM、Kubernetes、Helmcharts、Kustomize、镜像等。Checkov支持对Doc... 查看详情

docker使用杂记-最佳实践尝试-实战(代码片段)

...实践尝试-实战Docker简介项目背景内在原因外在原因基础镜像FROM需求镜像维护者LABEL工作文件夹WORKDIR文件ADDCOPY宗卷VOLUME命令RUN入口点ENTRYPORTCMDDockerfile后记本文环境参考Docker使用杂记-最佳实践尝试-实战本文记录了一个项目中使用... 查看详情

docker基本实践(代码片段)

文章目录docker1是什么2常用命令3镜像3.1获取镜像3.2运行容器3.3列出镜像3.4脚本定制镜像3.4.1dockerfile3.4.2容器启动命令3.5构建镜像docker1是什么Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置... 查看详情

docker基本实践(代码片段)

文章目录docker1是什么2常用命令3镜像3.1获取镜像3.2运行容器3.3列出镜像3.4脚本定制镜像3.4.1dockerfile3.4.2容器启动命令3.5构建镜像docker1是什么Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置... 查看详情

docker镜像制作常用官方基础系统镜像的选择(代码片段)

...满足业务需求,我们通常需要基于官方Linux系统镜像制作私有镜像选择合适的的Docker官方基础Linux系统镜像成为了首先需要考虑的事情Docker镜像是只读的docker容器模板,封装着启动docker容器所需的文件系统结构和系统内部... 查看详情