Docker镜像构建优化思路

Docker镜像构建优化思路

Docker镜像的构建过程可以通过Dockerfile来定义。然而,若在构建过程中未采取任何优化措施,生成的镜像可能会异常庞大,导致不必要的存储浪费和潜在的性能问题。

为了提升镜像的效率和性能,可以对以下几个方面进行优化:

  1. 精简基础镜像:选择一个最小化的官方基础镜像作为起点,例如alpinebusybox
  2. 按需安装软件:仅安装运行应用所必需的软件包,避免安装多余的工具和库。
  3. 利用缓存:合理安排Dockerfile中的指令顺序,以便充分利用Docker的构建缓存。
  4. 清理工作目录:在构建过程中定期运行清理命令,如apt-get cleanrm,以删除临时文件和缓存。
  5. 合并RUN指令:多个连续的RUN指令可以合并为一个,以减少镜像层数。
  6. 使用多阶段构建:通过多阶段构建技术,可以在编译和构建过程中使用一个或多个临时镜像,最终只保留最终产物。
  7. 移除不必要的文件:在构建完成后,从镜像中移除调试信息、文档文件或示例配置。
  8. 优化软件配置:对软件进行配置优化,避免使用默认配置中不必要的组件。
  9. 定期更新:定期更新Dockerfile中的软件和依赖,以利用最新的优化和安全修复。

本片文章结合以上部分点,使用基础镜像alpine并通过二进制的方式安装nginx服务并进行镜像优化。

编写Dockerfile

[root@docker101 01-base-image]# ll
total 2048
-rw-r--r-- 1 root root    1035 Aug  2 18:24 Dockerfile
-rw-r--r-- 1 root root 2090750 Aug  2 18:15 pcre-8.44.tar.gz

[root@docker101 01-base-image]# cat Dockerfile
# 优化点1:使用精简基础镜像alpine
FROM alpine:latest

# 设置镜像信息
LABEL auther="Tamy"

# 设置ARG环境变量,nginx的版本
ARG NGINX_VERSION=1.20.1

# 设置ssh服务的root密码
ENV SSH_ROOT_PASSWD=tamy

# 暴露容器的服务端口
EXPOSE 80 22

# 将二进制部署nginx所需要的包从宿主机中拷贝到容器中,该步骤在我的网络环境下通过RUN命令wget非常缓慢,因此使用拷贝的方式,加快镜像构建的速度。wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
COPY pcre-8.44.tar.gz .

# 执行构建命令
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \  # 设置alpine的阿里源
         apk update && \ # 更新alpine的源
        apk upgrade && \
        apk add curl wget gcc g++ make && \  # 优化点2:只安装二进制部署nginx所需要的软件
        wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \  # 下载nginx二进制包
        # wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
        tar xf nginx-${NGINX_VERSION}.tar.gz && \  # 解压nginx压缩包
        tar xf pcre-8.44.tar.gz && \         # 解压pcre压缩包
        cd nginx-${NGINX_VERSION} && \ 
        ./configure --prefix=/usr/local/nginx --with-pcre=/pcre-8.44 --without-http_gzip_module && \  
        make && make install && \
        ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ && \
        rm -r /var/cache   # 优化点3:清除缓存

# 添加容器的健康检查
HEALTHCHECK  --interval=3s \
             --timeout=3s \
             --start-period=30s \
             --retries=3 \
             CMD curl -f http://localhost/ || exit 1

CMD ["nginx", "-g", "daemon off;"]
# 构建命令
[root@docker101 01-base-image]# docker image build -t my-web:0.1 .

# 查看镜像列表
[root@docker101 01-base-image]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
my-web       0.1       40cfc144c373   3 hours ago   236MB
alpine       latest    c059bfaa849c   2 years ago   5.59MB
centos       7         eeb6ee3f44bd   2 years ago   204MB

本次通过基础镜像alpine并通过二进制的方式安装nginx服务,在Dockerfile中,通过三个优化点,将镜像大小优化至236MB

虽然通过清除缓存等优化方式,但是这个镜像还是达到了236MB,对于一个nginx服务来说还是太大了,所以还是需要在进一步优化。

基于这个原因,接下来通过这个Dockerfile使用多阶段构建的方式进一步优化镜像大小。

[root@docker101 02-optimize]# ll
total 2048
-rw-r--r-- 1 root root    1077 Aug  2 22:04 Dockerfile
-rw-r--r-- 1 root root 2090750 Aug  2 21:48 pcre-8.44.tar.gz
[root@docker101 02-optimize]# cat Dockerfile
FROM alpine:latest

LABEL auther="Tamy" 

ARG NGINX_VERSION=1.20.1

ENV SSH_ROOT_PASSWD=tamy

COPY pcre-8.44.tar.gz .

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
         apk update && \
        apk upgrade && \
        apk add wget gcc g++ make && \
        wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
        tar xf nginx-${NGINX_VERSION}.tar.gz && \
        tar xf pcre-8.44.tar.gz && \
        cd nginx-${NGINX_VERSION} && \
        ./configure --prefix=/usr/local/nginx --with-pcre=/pcre-8.44 --without-http_gzip_module && \
        make && make install


# ------------------------优化-------------------------------------------
FROM alpine:latest

# 将第一阶段编译完成的nginx服务拷贝到第二阶段的镜像中
COPY --from=0 /usr/local/nginx /usr/local/nginx

EXPOSE 80 22

RUN ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ && \
        rm -r /var/cache

HEALTHCHECK  --interval=3s \
             --timeout=3s \
             --start-period=30s \
             --retries=3 \
             CMD curl -f http://localhost/ || exit 1

CMD ["tail", "-f", "/etc/hosts"]

[root@docker101 02-optimize]# docker image build -t my-web:2.0 --build-arg NGINX_VERSION=1.20.2 .

# 通过优化,将镜像大小从原来的236MB,优化到10MB
[root@docker101 02-optimize]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my-web       2.0       c26b86a5409d   2 minutes ago   10MB

通过多阶段构建的方式,将镜像大小由236MB减小到了10MB

参考链接:Linux Alpine安装 Nginx

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值