今天给大家推荐一个项目,这个项目可以帮助我们压缩镜像,让我们的镜像瘦下来(size变小)。项目地址:https://github.com/slimtoolkit/slim
先准备一个镜像,这是我基于centos:7.6.1810制作的一个nginx镜像,可以看到是553MB
[root@bogon ~]# mkdir nginx
[root@bogon ~]# wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
[root@bogon ~]# cat nginx/Dockerfile
FROM centos:7.6.1810
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN rm -rf /usr/src/nginx-1.15.2
EXPOSE 80
EXPOSE 443
CMD ["nginx","-g","daemon off;"]
[root@bogon ~]# cd nginx/
[root@bogon nginx]# docker build -t nginx:v1 .
[root@bogon nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 1dc1838812be 3 minutes ago 553MB
centos 7.6.1810 f1cb7c7d58b7 5 years ago 202MB
安装slim
yum -y install wget
wget https://mirror.ghproxy.com/https://github.com/slimtoolkit/slim/releases/download/1.40.11/dist_linux.tar.gz
tar -xvf dist_linux.tar.gz
mv dist_linux/slim /usr/local/bin/
mv dist_linux/slim-sensor /usr/local/bin/
缩小镜像
[root@bogon nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 1dc1838812be 6 minutes ago 553MB
centos 7.6.1810 f1cb7c7d58b7 5 years ago 202MB
# 执行slim build加上镜像ID即可
[root@bogon nginx]# slim build 1dc1838812be
cmd=build info=param.http.probe message='using default probe'
cmd=build state=started
cmd=build info=params image-build-engine='internal' target.type='image' target.image='1dc1838812be' continue.mode='probe' rt.as.user='true' keep.perms='true' tags=''
cmd=build state=image.inspection.start
cmd=build info=image id='sha256:1dc1838812be8deb0cd7574e405b93098eeed624fc81559ab1a43d62a761a64c' size.bytes='552887189' size.human='553 MB'
cmd=build info=image.stack index='0' name='nginx:v1' id='sha256:1dc1838812be8deb0cd7574e405b93098eeed624fc81559ab1a43d62a761a64c'
cmd=build info=image.exposed_ports list='80/tcp,443/tcp'
cmd=build state=image.inspection.done
cmd=build state=container.inspection.start
cmd=build info=container status='created' name='slimk_5336_20240705093440' id='2bcccef987823ba17351b2a34798e696db290379aace1fd7083769aa34b5b0be'
cmd=build info=container status='running' name='slimk_5336_20240705093440' id='2bcccef987823ba17351b2a34798e696db290379aace1fd7083769aa34b5b0be'
cmd=build info=container message='obtained IP address' ip='172.17.0.2'
cmd=build info=cmd.startmonitor status='sent'
cmd=build info=event.startmonitor.done status='received'
cmd=build info=container message='YOU CAN USE THESE PORTS TO INTERACT WITH THE CONTAINER' name='slimk_5336_20240705093440' id='2bcccef987823ba17351b2a34798e696db290379aace1fd7083769aa34b5b0be' target.port.list='32770,32771' target.port.info='443/tcp => 0.0.0.0:32770,80/tcp => 0.0.0.0:32771'
cmd=build state=http.probe.starting message="WAIT FOR HTTP PROBE TO FINISH"
cmd=build info=continue.after mode='probe' message='no input required, execution will resume when HTTP probing is completed'
cmd=build prompt='waiting for the HTTP probe to finish'
cmd=build state=http.probe.running
cmd=build info=http.probe.ports count='2' targets='32770,32771'
cmd=build info=http.probe.commands count='1' commands='GET /'
cmd=build info=http.probe.call status='error' method='GET' target='http://127.0.0.1:32770/' attempt='1' error='Get "http://127.0.0.1:32770/": read tcp 127.0.0.1:43482->127.0.0.1:32770: read: connection reset by peer' time='2024-07-05T09:34:50Z'
cmd=build info=http.probe.call error='Get "http://127.0.0.1:32770/": read tcp 127.0.0.1:43486->127.0.0.1:32770: read: connection reset by peer' time='2024-07-05T09:34:58Z' status='error' method='GET' target='http://127.0.0.1:32770/' attempt='2'
cmd=build info=http.probe.call error='Get "http://127.0.0.1:32770/": read tcp 127.0.0.1:43490->127.0.0.1:32770: read: connection reset by peer' time='2024-07-05T09:35:06Z' status='error' method='GET' target='http://127.0.0.1:32770/' attempt='3'
cmd=build info=http.probe.call status='error' method='GET' target='http://127.0.0.1:32770/' attempt='4' error='Get "http://127.0.0.1:32770/": read tcp 127.0.0.1:43494->127.0.0.1:32770: read: connection reset by peer' time='2024-07-05T09:35:14Z'
cmd=build info=http.probe.call attempt='5' error='Get "http://127.0.0.1:32770/": read tcp 127.0.0.1:43498->127.0.0.1:32770: read: connection reset by peer' time='2024-07-05T09:35:22Z' status='error' method='GET' target='http://127.0.0.1:32770/'
cmd=build info=http.probe.call status='200' method='GET' target='http://127.0.0.1:32771/' attempt='1' error='none' time='2024-07-05T09:35:30Z'
cmd=build info=http.probe.summary total='6' failures='5' successful='1'
cmd=build state=http.probe.done
cmd=build info=http.probe.crawler page='0' url='http://127.0.0.1:32771/'
cmd=build info=probe.crawler.done addr='http://127.0.0.1:32771/'
cmd=build info=event message='HTTP probe is done'
cmd=build state=container.inspection.finishing
cmd=build state=container.inspection.artifact.processing
cmd=build state=container.inspection.done
cmd=build state=building message="building optimized image" engine=internal
cmd=build state=completed
cmd=build info=results status='MINIFIED' by='73.37X' size.original='553 MB' size.optimized='7.5 MB'
cmd=build info=results image-build-engine='internal' image.name='nginx.slim' image.size='7.5 MB' image.id='sha256:6c3be50d72ae81b276b1c6195edd95e76c4cf64f49867dd68ee897f7dba04ef9' image.digest='sha256:4b590b6b0afbf7d6dd641211f81ce0d01fc7bbf7e4b264b07cf0c89d7d03af65' has.data='true'
cmd=build info=results artifacts.location='/tmp/slim-state/.slim-state/images/1dc1838812be8deb0cd7574e405b93098eeed624fc81559ab1a43d62a761a64c/artifacts'
cmd=build info=results artifacts.report='creport.json'
cmd=build info=results artifacts.dockerfile.reversed='Dockerfile.reversed'
cmd=build info=results artifacts.seccomp='nginx-seccomp.json'
cmd=build info=results artifacts.apparmor='nginx-apparmor-profile'
cmd=build state=done
cmd=build info=commands message='use the xray command to learn more about the optimize image'
cmd=build info=report file='slim.report.json'
app='slim' message='GitHub Discussions' info='https://github.com/slimtoolkit/slim/discussions'
app='slim' message='Join the CNCF Slack channel to ask questions or to share your feedback' info='https://cloud-native.slack.com/archives/C059QP1RH1S'
app='slim' message='Join the Discord server to ask questions or to share your feedback' info='https://discord.gg/9tDyxYS'
app='slim' message='Join the Gitter channel to ask questions or to share your feedback' info='https://gitter.im/docker-slim/community'
# 出现的nginx.slim镜像就是缩小后的镜像,可以看到还不到8MB
[root@bogon nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx.slim latest 6c3be50d72ae 5 seconds ago 7.54MB
docker-slim-empty-image latest 3cd3181ce92f 55 seconds ago 0B
nginx v1 1dc1838812be 7 minutes ago 553MB
centos 7.6.1810 f1cb7c7d58b7 5 years ago 202MB
测试缩小后的镜像能否使用
[root@bogon nginx]# docker run -d -P nginx.slim
5807d6ff417635d7fe8d52f229e7ec547aecf6225ee19dc74230b83286684af2
[root@bogon nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5807d6ff4176 nginx.slim "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:32773->80/tcp, :::32773->80/tcp, 0.0.0.0:32772->443/tcp, :::32772->443/tcp loving_raman
[root@bogon nginx]# curl -I 127.0.0.1:32773
HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Fri, 05 Jul 2024 09:38:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 05 Jul 2024 09:27:49 GMT
Connection: keep-alive
ETag: "6687bc95-264"
Accept-Ranges: bytes