前言
Docker 是一个开源软件,也是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
本文简要介绍如何将Docker容器打包成镜像后,打出的镜像SIZE特别大,如何查看内容是否是自己想要的。
方法
当打出的 Docker 镜像 SIZE 特别大时,你可以通过以下几种方法查看镜像内容是否是自己想要的:
1. 使用 docker run 启动临时容器查看
- 原理:基于该镜像启动一个临时容器,然后进入容器内部查看文件系统内容。
- 步骤:
- 启动临时容器:使用以下命令基于镜像启动一个临时交互容器。
docker run -it --rm <镜像名>:<标签> /bin/bash
例如,如果镜像名为 test_env,标签为 1.0,则命令为:
docker run -it --rm test_env:1.0 /bin/bash
这里的 -it
选项用于开启交互式终端,--rm
选项表示容器退出时自动删除容器,避免产生过多无用容器。
- 查看容器内容:进入容器后,你可以使用常见的 Linux 命令(如 ls、cd 等)查看文件系统的内容,确认是否包含你期望的文件和目录。例如,使用
ls -l
查看当前目录下的文件列表。 - 退出容器:查看完毕后,输入
exit
命令退出容器。
2. 使用 docker export 和 tar 查看
- 原理:将镜像导出为一个 tar 文件,然后解压该文件查看其内容。
- 步骤:
- 基于镜像创建一个容器:
docker create --name temp_container <镜像名>:<标签>
- 导出容器文件系统为 tar 文件:
docker export temp_container > image_content.tar
- 删除临时容器:
docker rm temp_container
- 解压 tar 文件并查看内容:
mkdir extracted_image
tar -xf image_content.tar -C extracted_image
cd extracted_image
ls -l
这样你就可以在 extracted_image 目录下查看镜像的文件系统内容。
例如,在extracted_image目录下发现root/.cache/pip/http-v2
文件夹过大,经查该目录是 pip 在进行包下载和安装过程中用于缓存 HTTP 请求相关数据的地方,主要目的是为了提高后续相同请求的处理效率,所以是可以删除的。在容器中使用pip cache purge
命令删除pip缓存目录后重新打包成镜像,发现镜像SIZE小了很多。
3. 使用 docker history 查看镜像构建历史
- 原理:该命令可以显示镜像每一层的构建信息,包括创建时间、使用的命令等,帮助你了解镜像的构建过程和每层添加的内容。
- 步骤:
docker history <镜像名>:<标签>
例如:
docker history test_env:1.0
输出会列出每一层的信息,包括层的 ID、创建时间、使用的命令、该层的大小等。通过分析这些信息,你可以找出哪些层占用了大量空间,以及是否有不必要的操作导致镜像变大。
4. 使用第三方工具如 dive
- 原理:dive 是一个开源工具,用于深入分析 Docker 镜像,可视化显示镜像的每一层以及每层添加或修改的文件,帮助你快速定位占用空间大的文件。
- 步骤:
- 安装 dive:根据你的操作系统,按照 dive 的官方文档 进行安装。
- 分析镜像:使用以下命令分析指定的镜像。
dive <镜像名>:<标签>
例如:
dive test_env:1.0
在 dive 的界面中,你可以使用上下箭头浏览不同的层,查看每层的文件变化和大小,找出导致镜像过大的原因。
版权说明
本文为原创文章,部分内容基于GPT工具撰写,独家发布在blog.youkuaiyun.com/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com或扫描个人介绍栏二维码咨询。
参考资料
[1] Docker - 维基百科,自由的百科全书
[2] Docker官方文档