一、Docker Slim介绍

在软件开发和运维领域,Docker已经成为一种常见的容器化解决方案。

然而,随着Docker镜像不断增大,其扩展性和部署效率也逐渐降低。

这时就需要使用Docker Slim来优化镜像,减小其体积和启动时间,提高容器的性能。

什么是Docker Slim?
Docker Slim是一个用于缩小Docker镜像体积的工具。
它通过分析镜像中不必要的文件和依赖,并将其从镜像中删除,从而减小镜像的体积。
同时,Docker Slim还可以优化容器的启动时间,通过并行加载文件和依赖项,提高容器的性能
官网
https://github.com/docker-slim/docker-slim
https://github.com/slimtoolkit/slim

查看命令选项参考
https://github.com/slimtoolkit/slim?tab=readme-ov-file#build-command-options
Docker Slim 的优势:
①减小镜像体积:Docker Slim可以自动分析镜像中的不必要的文件和依赖,并将其删除,从而有效地减小镜像的体积。
②提高容器性能:Docker Slim可以优化容器的启动时间,通过并行加载文件和依赖项,提高容器的性能。
③简单易用:Docker Slim的命令行工具提供了简单易用的接口,可以轻松地对Docker镜像进行优化。

Docker Slim的类图示例

第十七节   Docker Slim之镜像压缩_docker

第十七节   Docker Slim之镜像压缩_mysql_02

docker-slim 原理
1.检查容器的元数据(静态分析)、
2.检查容器的数据(静态分析)
3.检查运行中的应用(动态分析)
4.构建应用制品图
5.通过收集到的应用数据来构建一个小的镜像
6.通过收集到的应用数据自动生成各种安全框架
参数解读
1./docker-slim build:
这是运行 docker-slim 以构建一个新的优化后的 Docker 镜像的主要命令。
2.--http-probe=false:
禁用HTTP探测功能。HTTP探测用于自动检测并包含容器公开的HTTP端点所需的任何依赖项。
将其设置为 false禁用此行为。
3.--expose 80 和--expose 3306:
显式公开端口80(通常用于HTTP)和3306(通常用于MySQL)。这是为了使这些端口可供外部访问。
4.--include-path=<path>:
指定文件系统中要包含在优化镜像中的路径。列出的路径有:
/var/www/html:通常是 web服务器的根目录。
/var/log/httpd:包含HTTP服务器日志的目录。
/run/httpd:HTTP 服务器在运行时使用的目录。
/tmp:临时文件存储。/data:通用数据目录。
/etc:配置文件。
/usr/:用户二进制文件和程序。
/sbin/:系统二进制文件。
/root/:root 用户的主目录。
/bin/:基本命令二进制文件。
5.--include-bin=<binary>:指定要包含在优化镜像中的单个二进制文件。
列出的二进制文件有:
/usr/sbin/httpd:Apache HTTP服务器。
/usr/libexec/mysqld:MySQL服务器。
/usr/bin/php:PHP解释器。
/usr/bin/systemctl:Systemd服务管理器。

二、Docker Slim安装

下载地址:
wget https://downloads.dockerslim.com/releases/1.40.11/dist_linux.tar.gz

tar   -zxvf   dist_linux.tar.gz 
cd   dist_linux 
mv  *   /usr/local/bin/
验证安装
docker-slim    version
docker-slim   -version

第十七节   Docker Slim之镜像压缩_Docker-Slim_03

三、Docker Slim实例

3.1实例一

先看下官方案例

第十七节   Docker Slim之镜像压缩_Docker-Slim_04

我们跟着案例来测试下

>> docker pull archlinux:latest

>> slim build  --target archlinux:latest   --tag archlinux:curl   --http-probe=false    --exec "curl checkip.amazonaws.com"

>> docker run archlinux:curl curl checkip.amazonaws.com

>> docker images
archlinux                 curl                ...        ...         17.4MB
archlinux                 latest              ...        ...         467MB

第十七节   Docker Slim之镜像压缩_Docker_05

第十七节   Docker Slim之镜像压缩_mysql_06

那么到底能不能运行起来呢?

第十七节   Docker Slim之镜像压缩_mysql_07

测试没问题,说明压缩后的镜像,可以正常run起来


3.2实例二

拉取镜像
docker pull nginx:latest
压缩镜像
docker-slim build --http-probe nginx:latest

运行压缩后的镜像
docker run -itd -p 81:80 --name nginx-test nginx.slim
测试是否通信正常
curl http://172.17.0.2

第十七节   Docker Slim之镜像压缩_docker_08

第十七节   Docker Slim之镜像压缩_mysql_09

3.3实例三

拉取镜像
docker pull ubuntu:20.04
压缩
slim build --target ubuntu:20.04 --tag ubuntu:20.04-slim --http-probe=false
运行压缩的容器
docker run -tid --name ubuntu-test ubuntu:20.04-slim /bin/bash

第十七节   Docker Slim之镜像压缩_Docker-Slim_10

3.4实例四

拉镜像
docker pull golang:latest
压缩镜像
slim build  --target golang:latest  --tag golang:latest-slim  --http-probe=false
运行起来
docker run -tid --name golang-test golang:latest-slim /bin/bash

第十七节   Docker Slim之镜像压缩_docker_11

3.5实例五

拉取镜像
docker pull php:7.0-cli
压缩
slim build  --target php:7.0-cli  --tag php:7.0-cli-slim  --http-probe=false
运行
docker run -tid --name php-test php:7.0-cli-slim /bin/bash

第十七节   Docker Slim之镜像压缩_docker_12

3.6实例六

docker pull mysql:5.7
mkdir -p  /root/mysql/data   /root/mysql/logs  /root/mysql/conf

在/root/mysql/conf中创建my.cnf文件
cd  /root/mysql/conf/
touch my.cnf
-----------------------------------------------------
[mysql]
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
[mysqld]
#lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上
#lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上
#且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入
lower_case_table_names=1
#mysql运行的端口
port=3306
#mysql5.7以后的不兼容问题处理
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#打开log-bin日志
log-bin=mysql-bin
#存放数据的路径
datadir=/var/lib/mysql
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
#是否支持符号连接,即数据库或表能够存储在my.cnf
#中指定datadir以外的分区或目录,为0不开启
symbolic-links=0
#mysql服务器分配的ID,在启用主从和集群的时候必须指定,并且不能重复
server-id = 1
#要给从机同步的库
#binlog-do-db=hl 
#不给从机同步的库(这里不同步mysql、information_schema,performance_schema、sys库)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys
#mysql允许最大连接数
max_connections=2000
#默认字符集
character-set-server=utf8
#默认存储引擎
default-storage-engine=INNODB
#mysql最大接受的数据包大小
max_allowed_packet=16M
#日志自动过时清理天数
expire_logs_days = 90
#事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒
innodb_lock_wait_timeout=120
#设置时区
default-time_zone='+8:00'
[mysqld_safe]
#进程ID文件
pid-file=/data/var/mysql/mysqld.pid
#错误日志纪录位置
log-error=/var/log/mysqld.log

----------转换-------
yum install dos2unix
dos2unix  my.cnf
-----------------------------------
创建容器,将数据,日志,配置文件映射到本机
docker run -p 3306:3306  --name mysql  \
-v  /root/mysql/conf:/etc/mysql/conf.d   \
-v /root/mysql/logs:/logs   \
-v /root/mysql/data:/var/lib/mysql   \
-e MYSQL_ROOT_PASSWORD=root  -d mysql:5.7

docker ps -a
docker inspect 2035e93e19c9

yum install mariadb
找到容器的IP 地址
mysql  -uroot    -h172.17.0.2  -proot

第十七节   Docker Slim之镜像压缩_Docker-Slim_13

第十七节   Docker Slim之镜像压缩_docker_14

第十七节   Docker Slim之镜像压缩_Docker-Slim_15

压缩镜像
docker-slim build --http-probe=false \
--include-path=/var/lib/mysql-files  \
--include-path=/etc/mysql/  \
--include-path=/logs \
--include-path=/var/lib/mysql  \
--include-path=/var/run/mysqld  \
--target mysql:5.7 \
--tag mysql:5.7-slim

第十七节   Docker Slim之镜像压缩_Docker_16

压缩前后的镜像对比

第十七节   Docker Slim之镜像压缩_docker_17

运行mysql:5.7-slim容器
docker run  -p 3306:3306  --name mysql  \
-v  /root/mysql/conf:/etc/mysql/conf.d \
-v  /root/mysql/logs:/logs  \
-v  /root/mysql/data:/var/lib/mysql  \
-e  MYSQL_ROOT_PASSWORD=root  \
-d  mysql:5.7-slim

第十七节   Docker Slim之镜像压缩_mysql_18

登录:
yum install mariadb
mysql  -uroot   -h172.17.0.2    -proot

第十七节   Docker Slim之镜像压缩_docker_19

3.7实例七

mkdir njs
cd njs
vim Dockerfile
--------使用Dockerfile构建镜像-------------------
FROM nginx:1.19.6-alpine AS builder
FROM alpine:3.12
COPY  --from=builder  /usr/bin/njs /usr/bin/njs
COPY  --from=builder  /usr/lib/libpcre.so.1.2.12  \
                                   /usr/lib/libedit.so.0.0.63   \
                                   /usr/lib/libncursesw.so.6.2  \
                                   /usr/lib/
RUN In  -sf   /usr/lib/libpcre.so.1.2.12  /usr/lib/libpcre.so.1 &&  \
        ln  -sf   /usr/lib/libedit.so.0.0.63   /usr/lib/libedit.so.0 &&  \
        In  -sf  /usr/lib/libncursesw.so.6.2  /usr/lib/libncursesw.so.6

ENTRYPOINT   [ "njs" ]
---------------------------------------------------------
转换
yum install dos2unix
dos2unix  Dockerfile
-----------------------------------

构建
docker build   -t   njs:v1   -f   Dockerfile  .     //注意.点
docker images

第十七节   Docker Slim之镜像压缩_docker_20

压缩镜像:
docker-slim build   --target  njs:v1   \
--tag njs:v1-slim   --http-probe=false

第十七节   Docker Slim之镜像压缩_mysql_21

四、扩展

4.1 Karmada

参考
CNCF官网介绍   https://karmada.io/docs/
文章介绍   https://www.51cto.com/article/788755.html

Karmada 是一个开源的 Kubernetes 多集群管理工具,允许用户跨多个 Kubernetes 集群进行资源调度和应用部署。以下是部署 Karmada 的基本步骤:

  1. 环境准备:确保安装了 Go 语言环境、kubectl 以及 kind 工具 。
  2. 安装 Karmada 控制面
  • 克隆 Karmada 的 GitHub 代码仓库到本地机器。
  • 进入 karmada 目录,运行部署脚本以启动 Kubernetes 集群(用于运行 Karmada 控制面,即 host cluster)并部署 Karmada 控制面组件 。
  1. 配置 kubeconfig:设置环境变量 KUBECONFIG 以使用 Karmada 环境,并通过 kubectl config use-context 命令切换不同的上下文 。
  2. 分发应用程序
  • 创建 Deployment,例如 nginx deployment。
  • 创建 PropagationPolicy,定义资源如何在不同集群间分发 。
  1. 将成员集群注册到 Karmada 控制面:使用 kubectl karmada joinkubectl karmada register 命令将成员集群注册到 Karmada 控制面 。
  2. 查看集群状态:使用 kubectl get clusters 查看已注册的集群状态 。
  3. 应用多集群部署:通过创建和应用 PropagationPolicy 来实现资源的多集群部署 。
  4. 联邦注销与清理:如果需要,可以使用 kubectl karmada unjoinkubectl karmada uninit 命令来注销集群和清理 Karmada 环境 。
  5. 安装概述:Karmada 支持多种安装方式,包括通过 kubectl 插件、karmadactl、Helm Chart、Operator 或二进制文件进行安装 。

第十七节   Docker Slim之镜像压缩_Docker_22


4.2 Kurator

官网
https://kurator.dev/docs/
github
https://github.com/kurator-dev/kurator/tree/main

     Kurator 是华为云推出的分布式云原生开源套件,通过集成业界主流开源技术栈,帮助用户一站式构建专属的分布式云原生基础设施,助力企业业务跨云跨边、分布式化升级。Kurator v0.2 版本已具备管理多云基础设施和异构基础设施的核心能力,通过引入Cluster Operator组件,支持“AWS自建集群”和“本地数据中心集群”包括集群创建、清理等在内的生命周期管理特性。

在新发布的v0.3.0版本中,Cluster Operator不仅分别对两类集群的生命周期管理能力进行了增强,也将v0.2.0版本中的多个API对象抽象成一个API对象cluster,方便用户使用。 同时,在 cluster 对象基础上,Kurator引入了舰队的概念。每个舰队代表一个物理集群组,方便Kurator未来进行统一的编排、调度,统一的流量治理以及统一的监控运维。目前,Kurator的舰队管理支持多个特性,包括舰队控制平面的生命周期管理,以及集群注册和注销到舰队等。

【概述】

Kurator是一个开源的分布式云原生平台,帮助用户构建自己的分布式云原生基础设施,助力企业数字化转型。

Kurator 站在许多流行的云原生软件堆栈的肩膀上,包括 Kubernetes、Istio、Prometheus、FluxCD、

KubeEdge、Volcano、Karmada、Kyverno等,它为多云和多集群管理提供了强大的能力,

包括:

多云、边云、边边协同

统一资源编排

统一调度

统一流量管理

统一遥测


【优点】

基础设施即代码:云、边缘或本地基础设施(集群、节点、vpc 等)管理的声明方式。

开箱即用:一键安装云原生软件栈

集群与车队统一管理:

支持集群注册和取消注册队列。

应用程序自定义并跨机队同步。

舰队集群之间的命名空间、服务帐户、服务相同。

提供跨集群的服务发现和通信。

来自机队所有集群的聚合指标。

提供策略引擎,使所有集群的策略一致。

第十七节   Docker Slim之镜像压缩_Docker-Slim_23

第十七节   Docker Slim之镜像压缩_mysql_24

第十七节   Docker Slim之镜像压缩_mysql_25

4.3  Volcano

官网
https://volcano.sh/en/   -----官方支持中文阅读参考
github
https://github.com/volcano-sh/volcano

第十七节   Docker Slim之镜像压缩_Docker-Slim_26

 Volcano是一个基于 Kubernetes 构建的批处理系统。它提供了一套通常需要的机制 许多类别的批处理和弹性工作负载,包括:机器学习/深度学习、生物信息学/基因组学和 其他“大数据”应用。这些类型的应用程序通常在通用域框架上运行,例如 Volcano集成的TensorFlow、Spark、Ray、PyTorch、MPI等。

Volcano也是云原生计算基金会(CNCF)的一个孵化项目。

https://www.cncf.io/projects/volcano/