Docker - 镜像



什么是Docker镜像?

Docker 镜像是用于构建容器的独立模板。它们使用分层文件系统来有效存储数据。每一层都包含指令,例如下载软件包或传输配置文件,代表镜像生成过程中的一个特定阶段。只有更新的层需要重新创建和交付,这使得分层成为共享和更新镜像的有效方法。

一个称为 Dockerfile 的文本文件构成了 Docker 镜像的基础。此文件中包含逐层创建镜像的指令。大多数情况下,指令以“FROM”之类的术语开头以标识基础镜像,该镜像通常是最小化的 Linux 发行版。然后使用“RUN”之类的命令在层内执行特定操作。因此,可以精确地管理容器内的环境。

Docker Images 1

Docker 镜像是只读模板,因此您对正在运行的程序所做的任何更改都会发生在容器内,而不是镜像本身。通过这样做,在运行时状态(容器)和应用程序定义(镜像)之间保持了清晰的划分。此外,由于可以使用有针对性的修改创建新版本而不会影响已存在的容器,因此简化了镜像版本控制和维护。

Docker 镜像的关键组件和概念

以下是构成 Docker 镜像的一些关键组件。

Docker 镜像由多个层组成。每一层都表示一组文件系统修改。在构建 Docker 镜像时,每个 Dockerfile 指令都会在上一层之上添加一层。

一旦生成,层就是不可更改的,这使得它们是不可变的。由于其不可变性,Docker 可以在镜像构建和部署期间有效地重用层,从而加快构建时间并减少磁盘空间的使用。

基础镜像

基础镜像是构建自定义 Docker 镜像的基础。它通常包含运行应用程序所需的最小运行时环境和操作系统。

经常使用来自 CentOS、Ubuntu、Debian 和 Alpine Linux 的基础镜像。为了确保兼容性和最小化镜像大小,选择合适的基础镜像至关重要。

Dockerfile

Dockerfile 是一个文本文档,其中包含一组用于创建 Docker 镜像的指令。这些指令描述了如何创建基本镜像、添加文件和目录、安装依赖项、调整设置以及定义容器的入口点。

通过在 Dockerfile 中指定构建过程,您可以自动化和复制镜像创建过程,确保跨环境的一致性。

镜像仓库

Docker 镜像可以存储在公共或私有注册中心中,例如 Azure Container Registry (ACR)、Google Container Registry (GCR)、Amazon Elastic Container Registry (ECR) 和 Docker Hub。

注册中心提供了一个集中式区域来管理、共享和分发 Docker 镜像。它们还提供镜像扫描以查找安全漏洞、版本控制和访问控制。

标签

仓库名称和标签组合起来构成 Docker 镜像的唯一标识。标签用于区分不同镜像版本。如果没有指定标签,Docker 默认使用“latest”标签。建议使用语义版本控制或其他相关标签来维护可重复性和跟踪镜像版本。

镜像拉取和推送

可以使用 docker pull 命令从注册中心下载 Docker 镜像到本地系统。类似地,可以使用 docker push 命令将镜像从本地机器推送到注册中心。这使您可以将镜像分发到不同的环境或与他人共享。

层缓存

为了性能优化,Docker 在构建镜像时使用层缓存。当您构建镜像时,如果相关的 Dockerfile 指令没有更改,Docker 会利用先前构建的缓存层。这会大大减少构建时间,特别是对于具有复杂依赖关系的大型项目。

有用的 Docker 镜像命令

既然我们已经讨论了什么是 Docker 镜像,让我们来看看您将非常频繁使用的基本且最有用的 Docker 镜像命令。

列出所有 Docker 镜像

要查看本地计算机上所有 Docker 镜像的列表,可以使用“docker images”命令。它提供重要的详细信息,例如大小、创建时间、镜像 ID、标签和仓库名称。使用此命令,您可以快速查看哪些镜像可用于在您的系统上运行容器。

$ docker images
Docker Images 2

如果您只想显示镜像 ID,可以使用“–quiet”标志。

$ docker image ls -q
Docker Images 3

拉取 Docker 镜像

要将 Docker 镜像从注册中心下载到本地计算机,请使用 Docker pull 命令。如果没有指定标签,Docker 将自动拉取镜像的“latest”版本。在基于镜像启动容器之前,此命令对于从公共或私有注册中心获取镜像是必要的。

$ docker pull ubuntu:20.04
Docker Images 4

从 Dockerfile 构建 Docker 镜像

docker build 命令从位于提供的路径的 Dockerfile 创建 Docker 镜像。在构建过程中,Docker 遵循 Dockerfile 中的指令来生成层并组装最终镜像。此命令对于创建针对您的应用程序特定需求量身定制的自定义镜像至关重要。

Dockerfile

# Use a base image from Docker Hub
FROM alpine:3.14

# Set the working directory inside the container
WORKDIR /app

# Copy the application files from the host machine to the container
COPY . .

# Expose a port for the application (optional)
EXPOSE 8080

# Define the command to run when the container starts
CMD ["./myapp"]

对于上述 Dockerfile,您可以使用以下命令构建镜像。

$ docker build -t myapp:latest .
Docker Images 5

标记 Docker 镜像

docker tag 命令为现有的 Docker 镜像创建一个新标签。标签允许您标记和引用镜像的多个版本。此命令通常在将镜像上传到注册中心到不同的标签下之前使用。

$ docker tag myapp:latest myrepo/myapp:v1.0
Docker Images 6

推送 Docker 镜像

docker push 命令将 Docker 镜像从您的本地机器传输到注册中心,例如 Docker Hub 或私有注册中心。在推送镜像之前,请确保您已使用“docker login”命令登录到注册中心。

$ docker push myrepo/myapp:v1.0

删除 Docker 镜像

docker rmi 命令从您的本地机器删除一个或多个 Docker 镜像。您可以提供镜像名称或镜像 ID。此命令会永久删除镜像及其关联的层,因此请谨慎使用。

$ docker rmi myapp:latest
Docker Images 7

清理 Docker 镜像

docker image prune 命令从您的本地机器删除未使用的 Docker 镜像。此命令可用于通过删除不再与任何容器或标签关联的镜像来释放磁盘空间。

选项

  • -a, --all − 删除所有未使用的镜像,而不仅仅是悬空镜像。
  • -f, --force − 不在清理前询问确认。
$ docker image prune -a

查看 Docker 镜像历史记录

docker image history 命令显示 Docker 镜像的历史记录,包括在镜像构建过程中使用的命令和指令。这对于确定镜像的形成方式和诊断问题很有用。

$ docker image history myimage:latest
Docker Images 9

检查 Docker 镜像

docker image inspect 命令以 JSON 格式返回有关 Docker 镜像的详细信息。这包括设置、层、标签和环境变量。您可以使用 --format 选项使用 Go 模板格式化输出。

$ docker image inspect myimage:latest
Docker Images 9

如何一次删除所有 Docker 镜像?

如果您想使用单个命令删除所有 Docker 镜像,可以使用两个命令的链,这两个命令在列出所有镜像 ID 后删除所有镜像。

$ docker rmi $(docker image ls -q)
Docker Images 10

结论

总之,Docker 镜像允许开发人员和系统管理员以统一且可移植的方式打包和部署应用程序。由于镜像使用分层文件系统和通过 Dockerfile 的声明式方法,它们是构建、共享和跨不同环境运行程序的强大技术。

广泛的 Docker 命令生态系统进一步扩展了此功能,允许用户管理完整的镜像生命周期,从创建和检查到拉取、运行和操作容器。通过掌握这些概念,您将能够利用 Docker 的潜力来加快您的开发工作流程并确保可靠的应用程序部署。

常见问题

Q1. Docker 镜像和容器有什么区别?

Docker 镜像充当构建容器的蓝图或模板。它包含运行特定应用程序或服务所需的所有依赖项、库和配置。

本质上,镜像是文件系统快照以及运行程序所需的參數。相比之下,容器是 Docker 镜像的运行时实例。它是一个轻量级、独立的、可执行的包,它封装了程序及其依赖项,同时将其与主机系统和其他容器隔离开来。

容器基本上是从镜像实例化的,可以从单个镜像生成多个容器,每个容器都有其自己的环境和资源。

Q2. 什么是 Docker 层,为什么它们很重要?

Docker 镜像由许多层组成。每一层代表一组文件系统更改。这些层在镜像构建过程中形成,并层层堆叠形成最终的镜像。

层是不可变的且被缓存的。这使得镜像分发和重用更高效。当镜像发生更改时,只有受影响的层会被重建,从而减少构建时间并降低磁盘空间使用率。

理解 Docker 层对于最小化镜像大小、提高构建性能以及成功管理镜像依赖至关重要。

Q3. 如何构建 Docker 镜像?

您可以使用 Dockerfile 构建 Docker 镜像。Dockerfile 是包含一组构建镜像指令的文本文件。这些指令包括指定基础镜像、复制文件到镜像中、执行命令来安装依赖项或配置环境以及设置应用程序的运行时行为。创建 Dockerfile 后,运行 docker build 命令即可根据指令构建镜像。

广告