docker-slim 一个不需要更改容器镜像中的任何内容,而能将其缩小多达 30 倍的命令工具(对于编译语言,缩小幅度甚至更大)。可以优化容器使用体验,让容器更好、更小、更安全。

Slim优化镜像的架构流程图:

SlimHow

Slim 安装

mac上安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
brew install docker-slim
==> Fetching docker-slim
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/docker-slim-1.40.11.m
################################################################################### 100.0%
==> Pouring docker-slim-1.40.11.monterey.bottle.tar.gz
🍺  /usr/local/Cellar/docker-slim/1.40.11: 7 files, 66.3MB
==> Running `brew cleanup docker-slim`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

查看安装版本

1
2
slim --version
slim version darwin/amd64|Transformer|1.40.11|latest|latest

二进制执行文件安装:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#一、按照不同的操作系统下载ZIP包

#最新的 Mac 二进制文件
curl -L -o ds.zip https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_mac.zip

#最新的 Mac M1 二进制文件
curl -L -o ds.zip https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_mac_m1.zip

#最新的 Linux 二进制文件(本文机器采用)
curl -L -o ds.tar.gz https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_linux.tar.gz

#最新的 Linux ARM 二进制文件
curl -L -o ds.tar.gz https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_linux_arm.tar.gz

#最新的 Linux ARM64 二进制文件
curl -L -o ds.tar.gz https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_linux_arm64.tar.gz

#二、解压该包并将其移动到 bin 目录
tar -xvf ds.tar.gz  or unzip  ds.zip
mv  dist_linux/slim /usr/local/bin/
mv  dist_linux/slim-sensor /usr/local/bin/

#或者采用一键安装脚本安装Slim
curl -sL https://raw.githubusercontent.com/slimtoolkit/slim/master/scripts/install-slim.sh | sudo -E bash -

后续Slim的升级,也是通过命令进行升级:

1
slim update

Slim 使用

基本参数说明:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#如果不输入任何,slim则将以交互提示模式启动,交互模式下自带命令提示。
slim [global flags] 
[xray|build|profile|run|debug|lint|merge|images|registry|vulnerability|update|version|appbom|help] [command-specific flags] <IMAGE_ID_OR_NAME>

#参数详解
xray- 对目标容器镜像执行静态分析(包括对镜像的 Dockerfile 进行“逆向工程”)
lint- 分析 Dockerfiles 中的容器指令(Docker 镜像支持正在开发中)
build- 分析、分析和优化容器镜像,生成支持的安全配置文件。这是最常用的命令
debug- 调试正在运行的目标容器。此命令对于排除从最小/缩小或常规容器映像创建的正在运行的容器的故障很有用
registry- 执行注册表操作(pull)
profile- 执行基本的容器镜像分析和动态容器分析,但不会生成优化的镜像
run- 运行一个或多个容器(目前运行类似于的单个容器docker run)
merge- 合并两个容器镜像(优化以合并最小化镜像)
images- 获取有关容器镜像的信息(例如slim --quiet images:)
vulnerability- 执行漏洞相关的工具和操作(epss)
version- 显示版本信息
appbom- 显示应用程序 BOM(应用程序组成/依赖项)
update- 将 Slim 更新至最新版本
help- 显示可用的命令和全局标志

使用实践

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#查看Nginx进行的大小,可以看到镜像有188M
docker images|grep nginx                     
nginx  latest 4f67c83422ec   3 weeks ago     188MB

#我们采用Slim进行优化
slim build 52f6af495b48

md=build info=param.http.probe message='using default probe' 
cmd=build state=started
.............................
cmd=build info=results artifacts.seccomp='nginx-seccomp.json' 
cmd=build info=results artifacts.apparmor='nginx-apparmor-profile' 
cmd=build state=done

#大概持续20S左右,优化完成后,我们从新查看下镜像大小
docker images|grep nginx 
nginx.slim    latest   f9ce92b996ba   44 seconds ago   13.3MB
nginx         latest   4f67c83422ec   3 weeks ago      188MB

#由原来188M缩小到14M不到,缩小10x,我们在重试用优化后的镜像启动网站
docker run -d -p 443:443 -v /opt/https-nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /opt/https-nginx/index.html:/usr/share/nginx/html/index.html -v /opt/https-nginx/cert/:/etc/nginx/ssl/ --name https-nginx nginx.slim:latest

#通过日志观察启动情况,输出日志正常
docker logs  -f https-nginx

/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

参考