10.Docker容器镜像体积缩小之奇技淫巧

2023-11-01

0x00 前言简述

描述:前面我们学习并且记录了 Dockerfile 最佳实践的一些规则,但是仅仅停在理论中并不是我的风格,所以出现了本篇文章同时也加深学习;
从最佳实践原则我们知道要缩小镜像大小,与选择的基础镜像是非常有关系的,比如buysbox (工具箱)与alpine (操作系统)镜像小的您超出您的想象,需要

docker pull alpine  # 容器中最小的Linux发行版
docker pull busybox # 嵌入式以及物联网系统中最常用的Linux下的工具箱
docker images | grep -E "busybox|alpine"
busybox                              latest              c7c37e472d31        3 weeks ago         1.22MB
alpine                               latest              a24bb4013296        8 weeks ago         5.57MB

对于刚接触容器的人来说他们很容易被自己构建的 Docker 镜像体积吓到,我只需要一个几 MB 的可执行文件而已,为何镜像的体积会达到 1 GB 以上?
答:相信下面的奇技淫巧会帮助你精简镜像,同时又不牺牲开发人员和运维人员的操作便利性。


0x01 基础环境

实验(实践)环境准备:

[root@k8s-yum-server ~]# cat /etc/system-release
CentOS Linux release 7.8.2003 (Core)

[root@k8s-yum-server ~]# uname -r
5.7.0-1.el7.elrepo.x86_64

0x02 Docker 最佳实践补充

  • (1) 建立一个空白目录进行构建上下文准备,切记不要在家里录下创建一个 Dockerfile 紧接着 docker build 一把梭
# 正确做法是为项目建立一个文件夹,把构建镜像时所需要的资源放在这个文件夹下
mkdir /opt/project && cd !$
vi Dockerfile # 编写 Dockerfile
  • Tips:也可以通过 .dockerignore 文件来忽略不需要的文件发送到 docker 守护进程

  • (2) 使用体积较小的基础镜像,比如 alpine 或者 debian:buster-slim,像 openjdk 可以选用openjdk:8-slim;

$docker pull debian:buster-slim
$docker pull openjdk:8-slim
$docker images
REPOSITORY   TAG             SIZE
debian       buster-slim     69.2MB  
busybox      latest          1.22MB  # 不建议采用构建太过耗时以及调试
alpine       latest          5.57MB  # 推荐
centos       latest          220MB   # 不建议采用基础镜像
  • Tips:由于 openjdk 是基于 debian 的基础镜像构建的,所以向 debian 基础镜像一样后面带个 slim 就是基于 debian:xxx-slim 镜像构建的。

  • Tips:alpine 的 c 库是musl libc 而不是正统的 glibc 库,另外对于一些依赖 glibc 的大型项目像 openjdk 、tomcat、rabbitmq 等都不建议使用 alpine 基础镜像,因为 musl libc 可能会导致 jvm 一些奇怪的问题,这也是为什么 tomcat 官方没有给出基础镜像是 alpine 的 Dockerfile 的原因。

  • (3) 更改为国内镜像软件源,提升容器构建速度目前国内稳定可靠的镜像站主要有,华为云、阿里云、腾讯云、163等。

# alpine 基础镜像修改软件源
RUN echo "http://mirrors.huaweicloud.com/alpine/latest-stable/main/" > /etc/apk/repositories ;\
echo "http://mirrors.huaweicloud.com/alpine/latest-stable/community/" >> /etc/apk/repositories ;\
apk update ;\

# debian 基础镜像修改软件源
sed -i 's/deb.debian.org/mirrors.huaweicloud.com/g' /etc/apt/sources.list ;\
sed -i 's|security.debian.org/debian-security|mirrors.huaweicloud.com/debian-security|g' /etc/apt/sources.list ;\
apt update ;\

# Ubuntu 基础镜像修改软件源
sed -i 's/archive.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
apt update ;\
  • Tips: 建议更新软件源时候RUN指令放在镜像描述后的首条,然后再update软件源以及install相应的软件包;

  • (4) 镜像时区设置由于绝大多数基础镜像都是默认采用UTC的时区与北京时间相差8个小时,将会会导致容器内的时间与北京时间不一致,因而会对一些应用造成一些影响,还会影响容器内日志和监控的数据,可以通过以下操作进行解决;

# 方式1.通过设置环境变量来设定容器内的时区。
-e TZ=Asia/Shanghai

#  debian设置两种方式
# -启动时设定环境变量指定时区
docker run --rm -it -e TZ=Asia/Shanghai debian date
# -构建镜像的时候复制时区文件设定容器内时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ;\
echo "Asia/shanghai" > /etc/timezone ;\

  • Tips: alpine 基础镜像无法通过 TZ 环境变量的方式设定时区,需要安装 tzdata 来配置时区也可以在 RUN 指令后面追加上时区复制到/etc/localtime命令;
# 方式1
docker run --rm -it -e TZ=Asia/Shanghai alpine date

# 方式2
apk add --no-cache tzdata ;\
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ;\
echo "Asia/Shanghai" > /etc/timezone ;\
apk del tzdata ;\
  • (5) 使用URL添加源码,如果不采用分阶段构建对于一些需要在容器内进行编译的项目,最好通过 git 或者 wegt 的方式将源码打入到镜像内,而非采用 ADD 或者 COPY ,因为源码编译完成之后源码就不需要可以删掉了,而通过 ADD 或者 COPY 添加进去的源码已经用在下一层镜像中了是删不掉滴啦;
    • 项目官方的 Dockerfile
# centos 7
FROM centos:7
# 添加配置文件
# add profiles
ADD conf/client.conf /etc/fdfs/
ADD
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10.Docker容器镜像体积缩小之奇技淫巧 的相关文章

随机推荐

  • FreeRTOS 临界段和开关中断

    以下转载自安富莱电子 http forum armfly com forum php 临界段代码的临界段也称为临界区 一旦这部分代码开始执行 则不允许任何中断打断 为确保临界段代码的执行不被中断 在进入临界段之前须关中断 而临界段代码执行完
  • AIGC来了,品牌方开始要求降价|AI重塑未来营销

    AIGC正在重塑营销领域 为品牌带来新的解决方案 营销可能是最早与AIGC结合并产生实际落地效果的领域之一 然而 需要注意AI工具的局限性和过度精准投放的影响 个性化的营销内容重要 但难以塑造国民级品牌 在AI时代 品牌需要找到自己的最大公
  • pycharm安装教程(安装必看)

    文章目录 软件简介 一 pycharm下载 二 安装 三 使用pycharm 软件简介 PyCharm是一种Python IDE Integrated Development Environment 集成开发环境 带有一整套可以帮助用户在使
  • fstat函数及struct stat结构

    转载地址 点击打开链接 一 fstat 函数 功能 由文件描述符取得文件状态 相关函数 stat lstat chmod chown readlink utime 头文件 include
  • Kettle_js脚本_示例

    Kettle 版本7 0 一 String function 1 date2str js操作时间 var dValue new Date 把时间变成字符串 var dValue1 date2str dValue 把时间变成当前格式字符串 v
  • java-统计一段句子中各单词出现的次数

    问题 统计一段句子中各单词出现的次数 思路 1 使用split方法将文章进行分割 我们这里以空格 逗号和句点为分隔符 然后存到一个字符串数组中 2 创建一个hashMap集合 key是字符串类型 保存单词 value是数字类型 保存该单词出
  • ROS编程Raspberry Pi机器人模型

    使用机器人操作系统 ROS 基础设施将物理机器人连接到机器人模拟是 ROS 工程师面临的最常见挑战之一 您将学习如何在虚拟环境中模拟机器人 并在等效的真实世界场景中实现所需的行为 首先介绍了 Raspberry Pi机器人模型及其配备的传感
  • 新一代免费开源大型企业数智制造解决方案

    国家加速推进信创产业的开源自主可控 信创产业 即信息技术应用创新产业 其包含了从信息化基础设施到底层系统 再到上层的应用软件 与信息化建设过程中涉及有关的全产业链都必须安全与可控 信创产业涉及到的领域包括信息化基础设施 如CPU 服务器 存
  • Axure RP软件安装包分享(附安装教程)

    目录 一 软件简介 二 软件下载 一 软件简介 Axure RP是一款专业的原型设计工具 它能够帮助用户创建高保真度的交互式原型 Axure RP具有以下特点 强大的交互设计功能 Axure RP提供了丰富的交互设计工具 用户可以通过拖拽和
  • Linux-僵尸进程产生与处理

    目录 背景 产生 处理方法 方法一 父进程通过wait或者wait pid方式回收子进程 方法二 信号处理signal 改进版 背景 父进程创建子进程之后 父进程没有等待该子进程的退出 子进程就会成为僵尸进程 如果父进程也退出 这个时候子进
  • F28027第八课---ADC操作解读

    已经有三天没有写了 心里真过意不过 但最近确实真的太忙了 大家见谅 前面那几节课 我们基本上把F28027自身的特性了解了一下 从这节课开始 我们将要学习它的外设 我的目标是周末这两天 要把ADC 温度 比较器 ePWM SPI都了解完 并
  • Bode Plots by Hand 徒手绘制波特图

    https blog csdn net u011368821 article details 26759659
  • USDT/DAPP授权原理/USDT接口实现

    一 安装需求 AAA com bbb com ccc com 需要三个域名 1 安装环境 a 服务器 centos7以上 软件商店 b nginx1 2以上 c php7 3版本 c1 安装php扩展 redis和gmp c2 删除所有ph
  • 接单日记(二)SMTP发送邮件

    文章目录 接单日记 二 SMTP发送邮件 一 实验目的 二 实验内容 三 程序及结果 1 运行程序 2 运行结果 接单日记 二 SMTP发送邮件 此为一个实验报告 故遵守实验报告的格式 一 实验目的 熟悉SMTP发送邮件的原理 使用SMTP
  • Docker基础修炼2--Docker镜像原理及常用命令

    通过前文的讲解对Docker有了基本认识之后 我们开始进入实战操作 本文先演示Docker三要素之镜像原理和相关命令 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境 如果你本地没有搭建Docker环境 也可以直接使用前文提
  • CMake 学习笔记 (Generator Expressions)

    CMake 学习笔记 Generator Expressions Generator Expressions 可以认为是一种特殊的变量 它会在编译阶段求值 通常用在 target link libraries target include
  • 基数排序-------C语言实现

    其他排序 堆排序 归并排序 插入排序和希尔排序 快速排序 冒泡排序和选择排序 基数排序 前备知识 注 我们知道 对于一个数如果我们想获取它得个位 只需对10取余 想获取十位的数 可以除10然后再对10取余 获取百位除100然后再对10取余
  • 网站服务器ip地址在哪里改,网站服务器ip地址在哪里改

    网站服务器ip地址在哪里改 内容精选 换一换 成功访问网站包含以下两个阶段 这两个阶段缺一不可 需要同时成功才能正常访问网站 如图1所示 阶段一 DNS根据访问请求中的域名解析出对应的IP地址 阶段二 访问网站服务器IP获取网站内容 阶段一
  • spring使用AOP技术对DAO层操作进行增强功能

    AOP的概述 1 什么是AOP的技术 在软件业 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 AOP是一种编程范式 隶属于软工范畴 指导开发者如何组织程序结构 AOP最早由AOP联盟的组织提出的
  • 10.Docker容器镜像体积缩小之奇技淫巧

    文章目录 0x00 前言简述 0x01 基础环境 0x02 Docker 最佳实践补充 0x03 镜像体积缩减实战 1 奇技淫巧构建镜像体积减小 99 2 FROM scratch 的魔力 0x04 补充说明 openjdk镜像的tag说明