什么是 Docker 镜像?
Docker 镜像是一个轻量级、独立的可执行软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。它是容器的快照,根据一组指令创建,以形成应用程序的完整可执行版本,该版本依赖于主机操作系统内核,但与其他应用程序和系统隔离。
Docker 映像是从 Dockerfile 构建的,Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用以组合映像的所有命令。当使用 Docker 引擎“运行”镜像时,它将成为实时容器。这允许跨不同环境可扩展且高效地分发和部署应用程序。
Docker 容器与 Docker 镜像:3 个主要区别
了解容器与其所基于的映像之间的区别非常重要。
1. 来源
Docker 镜像是 Docker 容器的来源。它们用作实例化容器的静态模板。映像不可变且不变,可确保不同环境之间的一致性,这对于持续集成和持续交付 (CI/CD) 管道至关重要。
容器表示 Docker 映像的运行实例。执行 Docker 镜像时,它会在镜像的层之上提供一个可写层,允许容器中的应用程序动态执行、修改文件并与其环境交互。
2. 组成
Docker 镜像是只读层的集合,每个层代表对前一层的修改或添加。多个容器可以共享对同一基础映像的访问,从而优化文件系统的使用和执行时间。
容器通过在基础映像层之上添加可写层来扩展此概念。此层是存储运行时更改的位置。删除容器时,此可写层也会被删除,但底层图像保持不变。
3. 可变性
Docker 镜像是不可变的,这意味着一旦创建,它们就不会改变。这种不变性确保了映像在各种计算环境中部署时一致且可靠,在应用程序开发和分发策略中发挥着至关重要的作用。
相比之下,容器在其生命周期内是可变的。可以启动、停止、移动和删除它们。但是,对正在运行的容器所做的更改只会影响该容器的可写层,而底层映像保持不变。这允许轻松进行实验和修改。
Docker 镜像剖析
以下是构成 Docker 映像的主要元素的概述。
基本图像
基础映像是 Docker 映像的初始层,所有其他层都是从该层构建的。它包含运行操作系统的最低要求,包括内核和系统库。基础映像通常最小,以减少大小和安全漏洞。
基础镜像在 Dockerfile 中使用 FROM 指令定义,为构建特定于应用程序的 Docker 镜像提供了基础。它们是 Docker 化应用程序的轻量级和高效特性的关键部分。
图像图层
Docker 镜像由多个层组成。每个图层代表对映像的一组更改或添加,例如安装软件或复制文件。构建映像时,Docker 会缓存每个层。如果没有更改,后续构建将重用这些缓存层,从而加快构建过程。
层是不可变的,并按顺序堆叠以形成最终图像。此体系结构可实现高效的存储和传输,因为只有已更改的层需要更新或通过网络发送。
容器层
当从映像运行容器时,Docker 会在映像的不可变层之上创建一个精简的可写容器层。此可写层存储在容器生命周期内所做的修改,例如添加、删除或修改文件。
此层是临时的。删除容器时,可写层也会被删除,从而确保底层图像保持不变。这种方法使容器成为临时容器,并保持 Docker 镜像的不变性。
Docker 清单
Docker 清单描述映像的层,提供有关映像的元数据,包括其层、大小,以及其内容类型(具体取决于清单版本)。它通过提供映像的详细蓝图来确保一致性和可靠性。
清单允许 Docker 为不同的架构提取正确的映像层,确保 Docker 映像可以在各种硬件设置上运行,而无需修改。这使得 Docker 映像在不同的计算环境中具有高度的可移植性和灵活性。
快速教程:如何构建 Docker 容器镜像
在您的计算机上设置 Docker
首先,确保您的计算机上安装了 Docker。访问 Docker 官方网站,下载适合您的操作系统的版本,然后按照安装指南进行操作。安装后,通过打开终端(或命令提示符)并键入 来验证 Docker 是否已正确安装。此命令应返回 Docker 版本,指示安装成功。docker --version
要以非 root 用户身份管理 Docker,您可能需要将用户添加到 Docker 组。此步骤因操作系统而异,但通常涉及在 Linux 终端中执行 sudo usermod -aG docker $USER 等命令。在此之后,注销并重新登录以使更改生效,确保您可以在不使用 sudo 的情况下运行 Docker 命令。
创建 Dockerfile
Dockerfile 是一个文本文档,包含用户可以在命令行上调用的所有命令来组合映像。首先,在项目目录中创建一个名为 Dockerfile 的文件,没有文件扩展名。在文本编辑器中打开此文件,然后首先使用 FROM 命令指定基础映像。例如,FROM python:3.8-slim 对于基于 Python 的应用程序来说是一个良好的开端。
接下来,使用 WORKDIR 指令设置容器内的工作目录。例如,WORKDIR /app 将 /app 设置为所有后续说明的目录。然后,您可以使用 COPY 指令将应用程序代码复制到容器中。
最后,使用 RUN 命令执行设置应用程序所需的任何命令,例如安装依赖项。
下面是一个基于 Python 的应用程序的简单 Dockerfile。在运行之前,请确保 app.py 和 requirements.txt 的文件存在于当前文件夹中:
# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
# 设置容器中的工作目录
WORKDIR /app
# 将当前目录内容复制到 /app 处的容器中
COPY . /app
# 安装 requirements.txt 中指定的任何需要的软件包
RUN pip install --no-cache-dir -r requirements.txt
# 使端口 80 可供此容器之外的世界使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行 app.py
CMD ["python", "app.py"]
以下是有关此 Dockerfile 需要注意的要点:
它以 Python 3.8 slim 映像作为基础层开始。
工作目录设置为 /app,当前目录中的所有文件都复制到容器的 /app 中。
pip install 命令将安装 requirements.txt 中定义的 Python 依赖项。
EXPOSE 指令通知 Docker 容器侦听端口 80。
环境变量 NAME 设置为 “World”。
最后,CMD 指令指定运行应用程序的命令 python app.py。
构建、命名和标记映像
准备好 Dockerfile 后,就可以构建映像了。打开终端,导航到 Dockerfile 所在的项目目录,然后运行命令:
docker build -t yourname/appname:version ..
此命令从当前目录中的 Dockerfile 构建一个映像,并使用您的名称、应用程序名称和版本标签对其进行命名。例如,以下命令:
docker build -t johndoe/myapp:1.0 .
构建一个名为 myapp 的映像,其版本标记为 1.0,用户名为 johndoe。
输出应如下所示:
构建完成后,运行 docker images 检查镜像列表。您应该会看到您的新映像与其他本地映像一起列出。您在构建期间指定的名称和标签应标识您的映像,使其易于管理和运行。
本地测试
在将镜像推送到 DockerHub 之前,在本地对其进行测试至关重要。要运行容器镜像,请使用以下命令:
docker run --name test-app -d -p 4000:80 yourname/appname:version
根据需要替换端口号和映像名称。此命令在分离模式下启动名为 test-app 的容器,将主机上的端口 4000 映射到容器上的端口 80。
要检查您的应用程序是否在容器内正常运行,请访问 Web 浏览器中的 http://localhost:4000。您应该会看到您的应用程序正在运行。使用 docker logs test-app 查看应用程序日志中是否有任何错误或消息,如果应用程序未按预期运行,则有助于进行故障排除。
推送到 DockerHub(或私有注册表)
本地测试后,最后一步是将容器镜像推送到 DockerHub、Docker 的公共注册表或组织内部署的私有注册表,从而共享容器映像。如果要在 DockerHub 上共享映像,请使用 docker login 从终端登录并输入您的 DockerHub 凭证。
现在,使用以下命令推送您的映像:
docker push yourname/appname:version
将 yourname、appname 和 version 分别替换为您的 DockerHub 用户名、应用程序名称和 version 标签。此命令将您的镜像上传到 DockerHub,使其可供任何人下载和使用。通过 Web 界面检查您的 DockerHub 存储库来验证上传。
注意:在 Ubuntu 上,您可能需要安装 gnupg2 pass 来执行上述命令。
使用 Aqua 实现整体 Docker 安全性
Aqua 提供了一个平台,可保护云原生、无服务器和 Docker 等容器技术。Aqua 为运行 Docker Enterprise Edition 或 Community Edition 的应用程序提供端到端安全性,并在持续交付和 DevOps 管道的整个生命周期内为您提供保护:从您左移的那一刻开始,到运行时控制、防火墙、审计和合规性。
持续图像保证
Aqua 扫描图像以查找恶意软件、漏洞、嵌入式密钥、配置问题和 OSS 许可。例如,您可以制定策略来概述哪些镜像可以在 Docker 主机上运行。Aqua 的漏洞数据库建立在不断更新的数据流之上,从多个来源汇总并整合,以确保仅使用最新数据,从而提高准确性并限制误报和可忽略不计的 CVE。
Aqua 提供了一个名为 Trivy 的开源工具,它允许您扫描容器映像以查找软件包漏洞。Trivy 使用与 Aqua 的商业扫描程序相同的漏洞数据库。主要区别在于 Trivy 根据在 Dockerfile 中创建的构建步骤运行。
Docker 的运行时安全性
Aqua 在运行时保护 Docker 应用程序,确保容器不变性并禁止更改正在运行的容器,通过自定义机器学习的 SECCOMP 配置文件将容器与主机隔离开来。它还使用机器学习的行为配置文件确保文件、可执行文件和操作系统资源的最低权限,并使用容器防火墙管理网络连接。
Aqua 进一步增强了 Docker 的安全保护,如下所示:
事件日志记录和报告 — 访问活动的精细审计跟踪,扫描 Docker 命令、事件和覆盖范围、容器活动、系统事件和机密活动。
CIS 认证的基准测试检查 — 使用计划报告和测试或 Aqua OSS 工具,根据 Docker 和 K8s CIS 基准测试评估节点配置。
全局合规性模板 — 预定义的合规性策略符合 HIPPA、CIS、PCI 和 NIST 等安全标准。
完全用户责任 - 使用精细的用户责任和受监控的超级用户权限。
“Thin OS”主机合规性 — 监控和扫描主机中的恶意软件、漏洞、登录活动,并识别主机上保留的扫描映像。
合规性实施控制 – 只有通过合规性检查的映像和工作负载才能在您的环境中运行。
适用于 Docker 的容器防火墙
Aqua 的容器防火墙可让您可视化网络连接,根据应用程序服务制定规则,并自动映射合法连接。仅允许列入白名单的连接,无论是在 Swarm 或 Kubernetes 集群内,还是在集群之间。
密钥管理
将您的凭证存储为 secret,不要将它们留在源代码中。Aqua 在运行时将密钥安全地传输到容器,在静态和传输中加密,并将其放置在内存中,在磁盘上没有持久性,因此它们仅对相关容器可见。将 Aqua 的解决方案与您当前的企业保险库集成,包括 CyberArk、Hashicorp、AWS KMS 或 Azure Vault。您可以在不重新启动容器的情况下撤销、更新和轮换密钥。
上一条:什么是Docker容器
下一条:容器化与虚拟化:主要差异和用例
品质保证
多年的生产力软件专家
专业实力
资深技术支持项目实施团队
安全无忧
多位认证安全工程师
多元服务
软件提供方案整合,项目咨询实施
购软平台-找企业级软件,上购软平台。平台提供更齐全的软件产品、更专业的技术服务,同时提供行业资讯、软件使用教程和技巧。购软平台打造企业级数字产品综合应用服务平台。用户体验和数字类产品的专业化服务是我们不断追求的目标。购软平台您身边的企业级数字产品优秀服务商。