Dockerfile构建镜像与docker-squash镜像压缩工具

 

概述

很多时候,构建的镜像总是在构建完之后分了好几个镜像层,有些镜像层还是因为只改变了一点东西,就多了整个目录的大小。那么,如何让镜像在构建的时候保持最小化,就是我们运维需要关心的问题。毕竟,有时候镜像太大,可能会被某些厂家的云仓库给限制上传的问题。

 

Dockerfile用法介绍

 

 在构建镜像之前,先了解一下dockerfile的几个常用参数的用法。

FROM
用法:FROM <image> 或 FROM <image>:<tag>
描述:设置基础镜像,之后的指令都会基于这个镜像进行。这是Dockerfile中的第一个指令。
示例:FROM ubuntu:latest
RUN
用法:RUN <command>(在shell中执行,默认/bin/sh -c) 或 RUN ["executable", "param1", "param2"](使用exec形式)
描述:在镜像中执行命令,并创建新的镜像层。常用于安装软件包、编译应用等。
示例:yum install -y nginx

EXPOSE
用法:EXPOSE <port> [<port>...]
描述:声明容器运行时监听的端口。这并不会让端口在宿主机上监听,但它会告诉Docker和潜在的使用者,容器想要使用哪些端口。
示例:EXPOSE 80 443
ENV
用法:ENV <key> <value> 或 ENV <key>=<value> ...
描述:设置环境变量。这些变量可以在后续的RUN指令中使用,也可以在容器运行时通过docker run命令的-e选项覆盖。
示例:ENV NODE_VERSION 10.16.0
ADD 和 COPY
ADD:用法较为复杂,主要用于从URL或tar文件中添加内容到镜像。由于其行为较为复杂,现在推荐使用COPY。
COPY:COPY <src>... <dest>
描述:从Dockerfile所在的上下文目录中复制文件或目录到镜像中。COPY比ADD更透明和简单。
示例:COPY ./myapp /usr/src/myapp
WORKDIR
用法:WORKDIR /path/to/workdir
描述:设置工作目录,之后的RUN、CMD、ENTRYPOINT等指令都会在这个目录下执行。
示例:WORKDIR /app
LABEL
用法:LABEL <key>=<value> <key>=<value> ...
描述:为镜像添加元数据。这些信息可以用docker inspect命令查看。
示例:LABEL maintainer="user@example.com"
CMD
用法:CMD ["executable","param1","param2"](exec形式,推荐)、CMD ["param1","param2"](为ENTRYPOINT提供默认参数)、CMD command param1 param2(shell形式)
描述:提供容器运行时的默认命令。Dockerfile中可以有多条CMD指令,但只有最后一条会生效。如果docker run命令后面有命令,CMD指定的命令会被覆盖。
示例1:CMD ["echo", "Hello Docker!"]
示例2:CMD "echo Hello Docker!"
ENTRYPOINT 用法:ENTRYPOINT ["executable", "param1", "param2"](exec形式,推荐)、ENTRYPOINT command param1 param2(shell形式) 描述:配置容器启动时运行的命令,让容器以某种方式运行。与CMD不同,ENTRYPOINT不会被docker run命令指定的参数覆盖,而是会将这些参数作为ENTRYPOINT指定的命令的参数。 示例:ENTRYPOINT ["/usr/sbin/nginx"]

简单总结,CMD和ENTPRYPOINT的区别就是。启动容器的时候,如果执行的命令是docker run -it --name test test:v1 /bin/bash,那么CMD的参数就会被/bin/bash覆盖。

 

Dockerfile构建镜像示例

在以下dockerfile例子中,保持镜像体积小的使用技巧有:

①安装完所需插件后,清理yum缓存

②RUN参数使用的时候,进行将多命令合并为一条命令

③软件的压缩包,在安装完成后清理

以elasticsearch的dockerfile文件为例。

FROM kylinv10

# 拷贝安装OpenJDK
8 for ARM64 COPY jdk-8u381-linux-aarch64.tar.gz /opt/
#安装passwd tar vi 并清空yum缓存 RUN yum install
-y tar vi passwd && \ useradd es && \ yum clean all && \ cd /opt/ && \ tar -xvf jdk-8u381-linux-aarch64.tar.gz

#设置jdk环境变量 ENV JAVA_HOME
/opt/jdk1.8.0_381/ ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin
#拷贝es到ARM64 COPY elasticsearch
-6.5.4.tar.gz /usr/local
#安装es RUN cd
/usr/local && \ tar -xzf elasticsearch-6.5.4.tar.gz && \ rm elasticsearch-6.5.4.tar.gz && \ mkdir -p /usr/local/elasticsearch-6.5.4/plugins/ik && \ mkdir -p /usr/local/elasticsearch-6.5.4/plugins/analysis-icu && \ mkdir -p /var/lib/elasticsearch-6.5.4/
#安装IK分词器 COPY ik
/usr/local/elasticsearch-6.5.4/plugins/ik COPY analysis-icu /usr/local/elasticsearch-6.5.4/plugins/analysis-icu
#复制配置文件 COPY elasticsearch.yml
/usr/local/elasticsearch-6.5.4/config #COPY sysctl.conf /etc/sysctl.conf
#es授权 RUN chown
-R es:es /opt/jdk1.8.0_381/ && \ chown -R es:es /var/lib/elasticsearch-6.5.4/ && \ rm /opt/jdk-8u381-linux-aarch64.tar.gz && \ ln -s /opt/jdk1.8.0_381/bin/java /usr/bin/java && \ chown -R es:es /usr/local/elasticsearch-6.5.4 && \ chmod +x /usr/local/elasticsearch-6.5.4/bin/elasticsearch
# 设置Elasticsearch运行用户 USER es
# 暴露Elasticsearch的HTTP和传输端口 EXPOSE
9200 9300
# 运行Elasticsearch CMD [
"/usr/local/elasticsearch-6.5.4/bin/elasticsearch"]

做完这个镜像之后,为什么会出现两个同样大小的/var/lib/elasticsearch-6.5.4/层呢?

原因很简单。docker build 的时候,会根据dockerfile的RUN指令修改文件(如更改权限、所有者等)时,这个修改会导致当前层与前一层之间的不同,并因此创建一个新的层 。

 

docker-squash镜像压缩工具

那么,来隆重介绍一个简单粗暴的压缩工具docker-squash。它的作用就是,压缩镜像层,达到减小镜像体积的作用。非常好用。想要用的小伙伴,复制就能用了。麒麟操作系统的换个yum源。

这个工具有个弊端。就是镜像太大的话,会把/tmp目录空间占满,然后docker服务就凉了,所以别在生成环境用哦,到时候后果自负。自己找台测试机器装个docker用就行。

该工具如果镜像层数越多,压缩率就越大。

安装pip命令
yum install python-pip
python3 --version
如果yum安装不了就安装以下阿里云源,再执行安装pip命令
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
安装docker-squash压缩工具
python3 -m pip install docker-squash
python3 -m pip install --user docker-squash
find / -name docker-squash
/usr/local/bin/docker-squash --version

镜像压缩示例
/usr/local/bin/docker-squash -t kms_elasticsearch:6.5.4-arm64 kms_elasticsearch:kylin_v10
压缩后的镜像名 被压缩的镜像

麒麟yum源参考

纯麒麟v10阿里云镜像源
[ks10-adv-cdrom]
name = Kylin Linux Advanced Server 10 - cdrom
baseurl = file:///run/media/root/Kylin-Server-10
gpgcheck = 0
enabled = 1
baseurl = http://update.cs2c.com.cn:8080/NS/V10/V10SP1/os/adv/lic/base/aarch64/
gpgcheck = 0
enabled = 1
 
[ks10-adv-os]
name = Kylin Linux Advanced Server 10 - Os
baseurl = http://archive2.kylinos.cn/rpm/kylin/production/KY-KY10-GFB-aarch64/custom/kylin-server/KY10-GFB-aarch64-2204/
#baseurl = http://update.cs2c.com.cn:8080/NS/V10/V10SP1/os/adv/lic/base/$basearch/
gpgcheck = 0
enabled = 1

 

posted @ 2024-09-11 16:30  小小一兆  阅读(47)  评论(0编辑  收藏  举报