概述
很多时候,构建的镜像总是在构建完之后分了好几个镜像层,有些镜像层还是因为只改变了一点东西,就多了整个目录的大小。那么,如何让镜像在构建的时候保持最小化,就是我们运维需要关心的问题。毕竟,有时候镜像太大,可能会被某些厂家的云仓库给限制上传的问题。
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="[email protected]"
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是经过实际使用的。更换下es版本和jdk版本可以直接用。
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 如果安装不了就安装阿里云源 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
标签:压缩工具,squash,6.5,elasticsearch,usr,&&,镜像,docker From: https://www.cnblogs.com/cndr/p/18408448