Docker 的 Image 太大,怎么变小?

2024-06-11 06:58
文章标签 docker 怎么 image 变小

本文主要是介绍Docker 的 Image 太大,怎么变小?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

铛~铛~铛~Docker即将颠覆整个软件产业,从云计算平台到软件开发、测试,整个SDLC都会极度依赖Docker。

圈子里面一定有很多讨论Docker的话题,简而言之,Docker其实只解决一个问题:

 

  QA:程序无法启动!!!

  DEV:不可能,我的机器上可以运行

 

大家可以慢慢体会以上对话。但无论怎样,对于已经投入 SSD 怀抱的同学们来说,要在宝贵的SSD上存放50个大小为800MB左右不等的Docker Image 是绝对不可以接受的!!但偏偏从 Docker Hub上下载到的Image,大部分都是这个数字,甚至远大于这个。看着逐渐被Docker侵蚀的磁盘空间,楼主决定给Docker文件进行大瘦身。结果发现效果很显著,请看下图

颤抖吧,凡人!100MB 的 Redis 压缩到只有7MB !!!

 

首先纠正一下基本概念:

1. Docker 不是虚拟机 (切记)

2. Docker 里面的程序运行时不需要完整的操作系统!

3. CoreOS,RHEL, Ubuntu, CentOS,等等等,它们都是一个操作系统!

 

怎么做到的,基本就是以下几个步骤

1. 使用 Busybox 的 Install 命令创建一个最小化的系统环境

2. 删除不必要的各种系统文件,具体哪些是不必要的,那就得需要具体程序具体分析,楼主花了大量时间来分析每个程序,现在楼主几乎可以把这些APP的依赖项倒着背出来。

3. 将这些文件打包成 rootfs.tar 

4. 使用 Dockerfile 的 ADD 指令用 rootfs.tar 生成 Image

 

楼主不码字了,开始码代码,

1. 基于 Redis 2.8.13 ,生成一个最简 rootfs.tar

复制代码
 1 FROM redis:2.8.13
 2 
 3 # switch to root to build image
 4 # =================================================
 5 USER root
 6 
 7 # prepare rootfs
 8 # =================================================
 9 RUN mkdir /rootfs
10 WORKDIR /rootfs
11 RUN mkdir bin etc dev dev/pts lib usr proc sys tmp
12 RUN mkdir -p usr/lib64 usr/bin usr/local/bin
13 RUN touch etc/resolv.conf
14 RUN cp /etc/nsswitch.conf etc/nsswitch.conf
15 RUN echo root:x:0:0:root:/:/bin/sh > etc/passwd
16 RUN echo root:x:0: > etc/group
17 RUN ln -s lib lib64
18 RUN ln -s bin sbin
19 
20 # install busybox
21 # =================================================
22 ADD http://busybox.net/downloads/binaries/1.21.1/busybox-x86_64 /sbin/busybox
23 RUN chmod +x /sbin/busybox
24 RUN cp /sbin/busybox bin
25 RUN busybox --install -s bin
26 
27 # extract redis-server
28 # =================================================
29 RUN cp /usr/local/bin/redis-server usr/bin/redis-server
30 
31 # extract redis-server's dependencies
32 # =================================================
33 RUN bash -c "cp /lib/x86_64-linux-gnu/lib{m,dl,pthread,c}.so.* lib64"
34 RUN cp /lib64/ld-linux-x86-64.so.2 lib64/
35 
36 # build rootfs
37 RUN tar cf /rootfs.tar .
复制代码

2. 使用这个 rootfs.tar 生成最小的Redis镜像文件

复制代码
1 FROM scratch
2 MAINTAINER e2tox <e2tox@microbox.io>
3 ADD rootfs.tar /
4 WORKDIR /data
5 VOLUME /data
6 # Define default command.
7 EXPOSE 6379
8 ENTRYPOINT ["/usr/bin/redis-server"]
9 CMD ["--port", "6379"]
复制代码

3. 运行一下试试

docker run --rm -it -p 6379:6379 microbox/redis

 

这个方法生成出来的镜像和普通的redis镜像没有任何区别,尽情使用,楼主已经先行释放了30GB的空间了。

如果你还有更多的探索欲望,请移步楼主的开源项目 http://microbox.io

这篇关于Docker 的 Image 太大,怎么变小?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050461

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误