当前位置:   article > 正文

Docker:(七)dockerfile优化小技巧_dockerfile 构建镜像优化

dockerfile 构建镜像优化

目录

一:镜像优化概述

1.1为什么在存储如此便宜的今天我们仍然需要对Docker镜像进行优化?

1.2小镜像的优点

1.3小镜像的制作原则

二:dockerfile构建容器指定挂载点

 三:镜像优化

3.1优化前示例

 3.2优化方案一

不需要输出的指令丢入/dev/null (需要确定命令执行的是正确的)

 3.2优化方案一

不需要输出的指令丢入/dev/null (需要确定命令执行的是正确的)

 3.3优化方案二

减少RUN构建

 3.4优化方案三

多阶段构建(使用FROM命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建)

 3.5优化方案四

使用更为轻量级的linux发行版本


一:镜像优化概述

1.1为什么在存储如此便宜的今天我们仍然需要对Docker镜像进行优化?

因为docker镜像太大,带来了以下几个问题:

存储开销

会导致用户服务器的磁盘空间很紧张

部署时间

这块影响真的很大,交付件zip包太大,导致用户部署该产品时,花费的时间变长,客户现场中反馈部署时间超过1.5小时,这严重影响用户的体验,降低满意度

性能不稳定

如果客户的服务器规格不够(特别是磁盘读写性能不够),会增大部署失败的概率。

1.2小镜像的优点

加速构建/部署。虽然存储资源较为廉价,但是网络IO是有限的,在带宽有限的情况下,部署一个1G的镜像和10M的镜像带来的时间差距可能就是分钟级和秒级的差距。特别是在出现故障,服务被调度到其他节点时,这个时间尤为宝贵。

提高安全性,减少攻击面积。越小的镜像表示无用的程序越少,可以大大的减少被攻击的目标。
减少存储开销。

1.3小镜像的制作原则

选用最小的基础镜像

减少层,去除非必要的文件

在实际制作镜像的过程中,一味的合并层不可取,需要学会充分的利用Docker的缓存机制,提取公共层,加速构建。

依赖文件和实际的代码文件单独分层

团队/公司采用公共的基础镜像等

二:dockerfile构建容器指定挂载点

dockfike构建nginx镜像

  1. mkdir nginx
  2. cd nginx
  3. vim Dockerfile
  4. FROM centos:7
  5. MAINTAINER THIS IS NGINX IMAGE
  6. RUN yum -y update
  7. RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
  8. RUN useradd -M -s /sbin/nologin nginx
  9. ADD nginx-1.22.0.tar.gz /usr/local/src
  10. WORKDIR /usr/local/src
  11. WORkDIR nginx-1.22.0
  12. VOLUME ["/usr/local/nginx/html"] #在容器中创建一个挂载点
  13. RUN ./configure \
  14. --prefix=/usr/local/nginx \
  15. --user=nginx \
  16. --group=nginx \
  17. --with-http_stub_status_module && make && make install
  18. ENV PATH /usr/local/nginx/sbin:$PATH
  19. EXPOSE 80
  20. RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
  21. CMD nginx #不加[]是shell写法

  1. docker build -f Dockerfile -t nginx:v1 . #构建镜像
  2. docker images
  3. docker run -d -P nginx:v1 #启动容器
  4. docker ps -a
  5. docker inspect #查看容器信息

  1. cd /var/lib/docker/volumes/7e6e370119cdd5161ff1bc9dfef8ef41555868054c81fffe3e7cd761ffcfcd19/_data
  2. echo "ming zhen tan ke nan" >> index.html
  3. docker ps -a
  4. docker exec -it ef34050b92cd bash

 指定挂载目录

 扩展:

PS 1 : 不要用docker run -d -P nginx:v1 /bin/bash 

/bin/bash 指定了shell环境,而我们的dockerfile 已指定CMD,即默认启动时加载的命令/执行程序,使用/bin/bash这种

shell环境会覆盖cmd命令,导致容器运行时nginx 不会加载

PS 2: VOLUME 宿主机的挂载点可使用docker insepct 查看

① 默认会放在var/lib/docker/volumes/容器ID/_data中

② 可以使用docker run -d -P -v /data1:/usr/local/nginx/html 来指定

 三:镜像优化

以构建nginx为例

3.1优化前示例

  1. mkdir /nginx
  2. vim Dockerfile
  3. FROM centos:7
  4. RUN yum install -y gcc pcre pcre-devel devel zlib-devel make
  5. ADD nginx-1.22.0.tar.gz /mnt
  6. WORKDIR /mnt/nginx-1.22.0
  7. #关闭debug日志
  8. RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
  9. RUN ./configure --prefix=/usr/local/nginx
  10. RUN make
  11. RUN make install
  12. EXPOSE 80
  13. VOLUME ["/usr/local/nginx/html"]
  14. CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
  15. docker build -f Dockerfile -t nginx:v1 .

 3.2优化方案一

不需要输出的指令丢入/dev/null (需要确定命令执行的是正确的)

减少不必要的缓存(丢到黑洞)删除不必要的缓存文件/磁盘文件

  1. mkdir -p nginx/nginx_v2 nginx/nginx_v3 nginx/nginx_v4
  2. cp nginx-1.22.0.tar.gz nginx/nginx_v2
  3. cd nginx_v2/
  4. ls
  5. docker build -f Dockerfile -t nginx:v2 .
  1. FROM centos:7
  2. RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
  3. ADD nginx-1.22.0.tar.gz /mnt
  4. WORKDIR /mnt/nginx-1.22.0
  5. #关闭debug日志
  6. RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
  7. RUN ./configure --prefix=/usr/local/nginx &> /dev/null
  8. RUN make &> /dev/null
  9. RUN make install &> /dev/null
  10. RUN rm -rf /mnt/nginx-1.22.0
  11. EXPOSE 80
  12. VOLUME ["/usr/local/nginx/html"]
  13. CMD ["/usr/local/nginx/sbin/nginx""-g","daemon off;"]

 3.2优化方案一

不需要输出的指令丢入/dev/null (需要确定命令执行的是正确的)

减少不必要的缓存(丢到黑洞)删除不必要的缓存文件/磁盘文件

  1. mkdir -p nginx/nginx_v2 nginx/nginx_v3 nginx/nginx_v4
  2. cp nginx-1.22.0.tar.gz nginx/nginx_v2
  3. cd nginx_v2/
  4. ls
  5. docker build -f Dockerfile -t nginx:v2 .
  1. FROM centos:7
  2. RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
  3. ADD nginx-1.22.0.tar.gz /mnt
  4. WORKDIR /mnt/nginx-1.22.0
  5. #关闭debug日志
  6. RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
  7. RUN ./configure --prefix=/usr/local/nginx &> /dev/null
  8. RUN make &> /dev/null
  9. RUN make install &> /dev/null
  10. RUN rm -rf /mnt/nginx-1.22.0
  11. EXPOSE 80
  12. VOLUME ["/usr/local/nginx/html"]
  13. CMD ["/usr/local/nginx/sbin/nginx""-g","daemon off;"]

 3.3优化方案二

减少RUN构建

可以使用&&连接

  1. FROM centos:7
  2. ADD nginx-1.22.0.tar.gz /mnt
  3. WORKDIR /mnt/nginx-1.22.0
  4. RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
  5. yum clean all && \
  6. sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
  7. ./configure --prefix=/usr/local/nginx &> /dev/null && \
  8. make &> /dev/null && make install &> /dev/null &&\
  9. rm -rf /mnt/nginx-1.22.0
  10. EXPOSE 80
  11. VOLUME ["/usr/local/nginx/html"]
  12. CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
  13. docker build -f Dockerfile -t nginx:v3 .

 3.4优化方案三

多阶段构建(使用FROM命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建)

  1. FROM centos:7 as build
  2. ADD nginx-1.22.0.tar.gz /mnt
  3. WORKDIR /mnt/nginx-1.22.0
  4. RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
  5. yum clean all &&\
  6. sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
  7. ./configure --prefix=/usr/local/nginx &> /dev/null && \
  8. make &>/dev/null && \
  9. make install &>/dev/null && \
  10. rm -rf /mnt/nginx-1.22.0
  11. FROM centos:7
  12. EXPOSE 80
  13. VOLUME ["/usr/local/nginx/html"]
  14. COPY --from=build /usr/local/nginx /usr/local/nginx
  15. CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
  16. docker build -f Dockerfile -t nginx:v4 .

 3.5优化方案四

使用更为轻量级的linux发行版本

  • debian
  • alpine
  • apt add

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号