dockerfile优化小技巧

目录

一、镜像优化概述

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

1.2  小镜像的优点

1.3   小镜像的制作原则

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

三、镜像优化

3.1   未优化前

3.2   优化一:把不需要的命令丢入/dev/null 

3.3   优化二:减少RUN构建

3.4   优化三:多阶段构建

3.5  优化方法4: 使用更为轻量级的linux 发行版本


一、镜像优化概述

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

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

存储开销

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

部署时间

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

性能不稳定

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

1.2  小镜像的优点

  • 加速构建/部署。虽然存储资源较为廉价,但是网络IO是有限的,在带宽有限的情况下,部署一个1G的镜像和10M的镜像带来的时间差距可能就是分钟级和秒级的差距。特别是在出现故障,服务被调度到其他节点时,这个时间尤为宝贵。
  • 提高安全性,减少攻击面积。越小的镜像表示无用的程序越少,可以大大的减少被攻击的目标。
  • 减少存储开销。

1.3   小镜像的制作原则

  • 选用最小的基础镜像
  • 减少层,去除非必要的文件
  • 在实际制作镜像的过程中,一味的合并层不可取,需要学会充分的利用Docker的缓存机制,提取公共层,加速构建。
  • 依赖文件和实际的代码文件单独分层
  • 团队/公司采用公共的基础镜像等

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

dockfike构建nginx镜像

[root@docker ~]# mkdir nginx
[root@docker ~]# cd nginx  && vim nginx/Dockerfile
FROM centos:7
MAINTAINER THIS IS NGINX IMAGE
RUN yum  -y update
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD  nginx-1.21.6.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORkDIR nginx-1.21.6
VOLUME ["/usr/local/nginx/html"]                #在容器中创建一个挂载点
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
CMD nginx                   #不加[]是shell写法
[root@docker nginx]# ls     #上传nginx-1.12.2.tar.gz包
Dockerfile  nginx-1.21.6.tar.gz
[root@docker nginx]# docker build -f Dockerfile -t centos:v1  . #构建镜像
[root@docker nginx]# docker images             
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        v1        3197c931c8b7   4 minutes ago   673MB
[root@docker nginx]# docker run -d -P nginx:v1                 #启动容器
56ff8520680c6a65005c4752876207e58055e1f513b06812b0a14bf56859d657
[root@docker nginx]# docker ps -a 
CONTAINER ID   IMAGE      COMMAND              CREATED         STATUS         PORTS                                     NAMES
56ff8520680c   nginx:v1   "/bin/sh -c nginx"   7 seconds ago   Up 6 seconds   0.0.0.0:49155->80/tcp, :::49155->80/tcp   practical_jang
[root@docker nginx]# docker inspect   8216e7e4ba82              #查看容器信息        

dockerfile优化小技巧_第1张图片

dockerfile优化小技巧_第2张图片

dockerfile优化小技巧_第3张图片

dockerfile优化小技巧_第4张图片

dockerfile优化小技巧_第5张图片

指定挂载目录

dockerfile优化小技巧_第6张图片

dockerfile优化小技巧_第7张图片

dockerfile优化小技巧_第8张图片

扩展:

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   未优化前

FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
#关闭debug日志
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@docker nginx]# docker build -f Dockerfile -t centos:v1 .

3.2   优化一:把不需要的命令丢入/dev/null 

[root@docker nginx]# mkdir -p  nginx/nginx_v1 nginx/nginx_v2 nginx/nginx_v3 
[root@docker nginx]# cp nginx-1.21.6.tar.gz  nginx/nginx_v1
[root@docker nginx]# cd nginx_v1/
[root@docker nginx_v1]# ls
Dockerfile  nginx-1.21.6.tar.gz
[root@docker nginx_v1]# docker build -f Dockerfile -t nginx:v2 .

dockerfile优化小技巧_第9张图片

FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

3.3   优化二:减少RUN构建

RUM命令比较多得时候 

FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &> /dev/null && make install &> /dev/null &&\
rm -rf /mnt/nginx-1.21.6
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

dockerfile优化小技巧_第10张图片

3.4   优化三:多阶段构建

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

FROM centos:7 as build
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &> /dev/null && make install &> /dev/null &&\
rm -rf /mnt/nginx-1.21.6
FROM centos:7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

dockerfile优化小技巧_第11张图片

3.5  优化方法4: 使用更为轻量级的linux 发行版本

  • debian
  • alpine
  • apt add

你可能感兴趣的:(服务器,java,运维)