什么是容器镜像?
容器映像是具有可执行代码的静态文件,可以在计算系统上创建容器。容器映像是不可变的,这意味着它无法更改,并且可以在任何环境中一致地部署。它是容器化架构的核心组件。
容器镜像包括容器运行所需的一切——容器引擎(例如 Docker 或 CoreOS)、系统库、实用程序、配置设置以及应在容器上运行的特定工作负载。该映像共享主机的操作系统内核,因此不需要包含完整的操作系统。
容器映像由层组成,添加到父映像(也称为基础映像)上。层使得跨镜像重用组件和配置成为可能。以最佳方式构建层有助于减小容器大小并提高性能。
Docker镜像架构
Docker是世界上最流行的容器引擎,因此我们将重点讨论Docker的容器镜像架构。
Docker 镜像是部署容器环境所需的文件集合,包括二进制文件、源代码和其他依赖项。在Docker中,有两种创建镜像的方法:
- Dockerfile —Docker提供了一个简单的、人类可读的配置文件,用于指定Docker映像应包含的内容。
- 从现有容器创建映像- 您可以从现有映像运行容器,修改容器环境,并将结果保存为新映像。
Docker容器和镜像有什么区别?
Docker 容器镜像描述了一个容器环境。Docker容器是该环境的一个实例,在Docker引擎上运行。您可以从同一映像运行多个容器,并且所有容器都将包含相同的软件和配置,如映像中指定的那样。
Docker镜像和层
定义 Docker 镜像时,可以使用一层或多层,每一层都包含容器环境所需的系统库、依赖项和文件。图像层可以重复用于不同的项目。
为了节省时间,大多数Docker镜像都是从父镜像开始的。例如,这里是Docker Hub 上MySQL镜像的Dockerfile ,可用于创建运行MySQL数据库的容器。在此父映像之上,您可以添加包含其他软件或特定配置的层。
当容器运行时,Docker在静态镜像层之上添加一个可读/可写的顶层。这个顶层被容器用来在运行时修改文件,也可以用来定制容器。这样,从同一镜像创建的多个容器可以具有不同的数据。
有两种方法可以查看添加到基础图像的图层:
- 容器上的/var/lib/docker/aufs/diff目录
- 使用Docker CLI历史命令
父镜像和基础镜像
父映像和基础映像之间存在细微的技术差异:
基础镜像是一个空的容器镜像,它允许高级用户从头开始创建镜像。
父映像是预配置的映像,提供一些基本功能,例如精简的Linux 系统、MySQL或 PostgreSQL等数据库或内容管理系统。
然而,在容器社区中,术语“基础镜像”和“父镜像”经常互换使用。
Docker Hub和许多其他公共容器存储库上有大量现成的父映像可用。您还可以使用自己的图像作为新图像的父图像。
Docker镜像安全最佳实践
容器镜像在容器安全中发挥着至关重要的作用。从映像创建的任何容器都会继承其所有特征,包括安全漏洞、错误配置甚至恶意软件。
以下是一些最佳实践,可以帮助您确保在容器项目中仅使用安全、经过验证的映像:
- 首选最小基础镜像— 许多Docker镜像使用完全安装的操作系统发行版作为其底层镜像。如果您不需要通用系统库,请避免使用安装整个操作系统的基础映像或对您的项目不重要的其他组件,以限制攻击面。
- 最低特权用户——Dockerfile必须始终指定一个USER,否则它们将默认以主机上的root身份运行容器。您还应该避免使用root权限在容器上运行应用程序。以root身份运行可能会产生严重的安全后果,因为破坏容器的攻击者可以获得对整个主机的控制权。
- 签名并验证镜像- 您必须确保您拉取来创建容器的镜像确实是您从受信任的发布者处选择的镜像,或者您自己创建的镜像。通过仅使用签名的图像,您可以减轻通过网络篡改图像的情况(中间人攻击),或攻击者将受损的图像推送到受信任的存储库。
- 修复开源漏洞——每当您在生产中使用父映像时,您都需要能够信任它部署的所有组件。在构建过程中自动扫描映像,以确保它们不包含漏洞、安全配置错误或后门。请记住,随着时间的推移,可能会引入新的漏洞,即使在最初被验证为安全的图像中也是如此。
转载请注明出处:https://www.cloudnative-tech.com/introduction/5866.html