Docker 教程

Docker 什么是镜像?

Docker 镜像是一个只读的模板,用于创建 Docker 容器。它包含了运行一个特定应用程序所需的所有文件、环境变量、依赖项和配置。如下图:

image.png

上图中,有一个 Redis 镜像,使用该镜像启动了三个 Redis 容器,它们的端口分别为 6379、6378 和 6377。

镜像的组成

Docker 镜像不是一个单一的文件,而是一个分层存储的文件。如下图:

b3fde3aca9b77dc87c34181600427a5b_1724293310307-ba7b9592-0ddb-4b55-988a-aa11048d0fb5_x-oss-process=image%2Fformat%2Cwebp.png

上图中,一个镜像由 5 层组成。这些镜像层总体可以分为以下三类:

(1)基础操作系统层

许多 Docker 镜像都是基于一个基础的操作系统,如 Ubuntu、Alpine 或 CentOS。这一层提供了容器运行的基本环境,包括内核、文件系统和系统工具。例如,一个基于 Ubuntu 的镜像会包含 Ubuntu 操作系统的核心文件和库,为上层的应用程序提供运行环境。

(2)应用程序依赖层

在基础操作系统之上,镜像通常会包含应用程序所需的各种依赖项,如编程语言运行环境、数据库客户端、库文件等。例如,如果一个应用程序是用 Python 编写的,那么镜像中可能会包含 Python 解释器以及应用程序所需的特定 Python 库。

(3) 应用程序层

这是镜像的最顶层,包含实际的应用程序代码、配置文件和启动脚本。例如,一个 Web 应用程序的镜像可能包含应用程序的代码文件、静态资源(如 HTML、CSS、JavaScript 文件)以及启动服务器的脚本。

💢为什么要对镜像进行分层呢?

其实,对镜像进行分层会有如下优势:

(1)高效存储

多个镜像可以共享相同的基础层,大大减少了存储空间的占用。例如,不同的应用如果都基于相同的操作系统基础镜像,那么它们无需各自存储一份完整的操作系统文件,只需要在基础镜像之上添加各自的应用特定层即可。

当更新一个镜像时,如果只是其中一部分内容发生变化,那么只需要重新生成发生变化的那一层,而其他层可以保持不变。这样可以提高镜像的更新效率,减少网络传输的数据量。

(2)快速构建

在构建镜像的过程中,可以利用已有的分层进行快速构建。例如,从一个基础的开发环境镜像开始,逐步添加应用代码、依赖库等层,每一步的构建都可以基于之前的结果进行,从而加快构建速度。

可以在一个团队或组织内共享通用的中间层镜像,使得不同的开发者能够快速地基于这些中间层构建自己的应用镜像,提高开发效率。

👻镜像的构建

Docker 镜像有以下几种主要构建方式:

使用 Dockerfile 构建

Dockerfile 是一个文本文件,包含了一系列指令,用于描述如何构建 Docker 镜像。

可以在包含 Dockerfile 的目录下,使用 docker build 命令来构建镜像,后续将详细介绍。

使用容器构建

基于一个现有的镜像(从镜像仓库拉取)启动一个容器,并在容器中进行一些修改和配置。例如,可以安装软件、修改配置文件等。

然后,使用 docker commit 命令将修改后的容器提交为一个新的镜像,后续将详细介绍。

镜像的存储和分发

本地存储

构建好的镜像会存储在本地的 Docker 存储引擎中,可以通过 docker images 命令查看本地的镜像列表。

本地镜像可以用于创建和运行容器,也可以作为基础镜像用于构建其他镜像。

镜像仓库

为了方便共享和分发镜像,Docker 支持将镜像推送到远程的镜像仓库,如 Docker Hub、私有仓库或其他第三方仓库。

其他用户可以从镜像仓库中拉取所需的镜像到本地,然后使用这些镜像创建容器。这使得在不同的环境中部署相同的应用程序变得非常方便,只需要确保每个环境都可以访问镜像仓库即可。

镜像的使用

创建容器

使用docker run命令可以基于一个镜像创建一个新的容器。在创建容器时,可以指定容器的各种参数,如端口映射、环境变量、挂载卷等。

例如,docker run -p 8080:80 myapp 会基于名为 myapp 的镜像创建一个容器,并将容器的 80 端口映射到主机的 8080 端口,后续将详细介绍。

容器的更新和升级

当镜像更新时,可以使用新的镜像重新创建容器,以获取应用程序的最新版本。也可以在容器运行时,使用 docker pull 命令拉取新的镜像,然后使用 docker restart 命令重启容器,使容器使用新的镜像。

例如,如果一个应用程序的镜像发布了新版本,可以先拉取新镜像,然后重启使用旧镜像的容器,使容器使用新的镜像运行,后续将详细介绍。

总结

  • 镜像是一个分层存储的文件,不是一个单一的文件。

  • 镜像是一个软件的环境。

  • 一个镜像可以创建 N 个容器。

  • 镜像是一种标准化交付,其中包含了软件以及软件的运行环境。

  • 镜像是一个不包含 Linux 内核而又精简的 Linux 操作系统。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号