Docker镜像理解

Docker 镜像是一个只读的模板,它包含了创建 Docker 容器所需的所有文件和配置信息。可以把它类比成:

  • 面向对象编程中的“类”:镜像是“类”,容器是这个“类”的“实例”。
  • 虚拟机的安装光盘(.iso 文件):镜像是光盘,容器是安装好并正在运行的虚拟机系统。

1、本质上是一系列的文件

一个 Docker 镜像,从静态视角看,就是一个打包好的、压缩的文件夹。这个文件夹里包含了运行一个特定应用所需的一切:

  • 操作系统的部分根文件系统(如 /bin, /lib, /usr 等,但比完整 OS 小得多)。
  • 你的应用程序代码(如 /app/my_server.py)。
  • 应用程序的依赖(如 /usr/local/lib/python3.9/site-packages/ 里的库)。
  • 配置文件(如 /etc/nginx/nginx.conf)。
  • 环境变量。
  • 默认的启动命令。

当执行 docker save -o my_image.tar my-app:latest 时,能得到一个 .tar 压缩包。解压这个包,会看到里面的确 就是一系列按层级组织的目录和文件。这证明了镜像的本质就是文件集合。

2、联合文件系统UnionFS

分层的文件系统,将多个物理上独立的目录(称为层)合并成一个统一的视图。

想象一下Photoshop的图层:

  • 你有一张背景层(基础镜像,如 ubuntu)。
  • 然后在上面加一个文本层(通过 RUN apt-get update 安装了一些软件)。
  • 再在上面加一个图片层(通过 COPY . /app 复制了你的代码)。

最终你看到的完整图片,就是所有这些图层叠加在一起的效果。

分层的好处:

  • 共享和节省空间:Image A 和 Image B 都基于 ubuntu:latest,那么宿主机上只存有一份 ubuntu:latest 的层。
  • 快速构建和部署:构建镜像时,每一层都可以被缓存。如果你只修改了代码层(最上面一层),那么下面所有层(如安装依赖的层)都可以直接用缓存,无需重新执行,构建速度极快。
  • 镜像最小化:你可以从一个极小的基础层(如 alpine)开始,只添加应用必需的层。

docker镜像常用命令:

命令

描述

docker images

列出本地主机上的所有镜像。

docker pull

从镜像仓库(如 Docker Hub)拉取一个镜像到本地。

docker build

根据 Dockerfile 构建一个新的镜像。

docker push

将本地的镜像推送到镜像仓库。

docker rmi

删除本地的一个或多个镜像。

docker tag

给镜像打一个新的标签。

docker history

查看一个镜像的构建历史(各层信息)。

docker save

将镜像保存为一个 tar 归档文件,用于备份或迁移。

docker load

从 tar 归档文件加载镜像。

© 版权声明

相关文章

暂无评论

none
暂无评论...