当前位置:   article > 正文

【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积

【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积

目录

一、基于上次的nginx的Dockerfile做多级构建

二、基于上次的php的Dockerfile修改做多级构建

三、基于上次的mysql的Dockerfile修改做多级构建

基于以上三个镜像构建

四、镜像体积是不是越小越好?为什么要缩减镜像体积?

五、缩小镜像体积的方法有哪些?


一、基于上次的nginx的Dockerfile做多级构建

  1. [root@localhost nginx]#cp Dockerfile{,.bak}
  2. [root@localhost nginx]#ls
  3. Dockerfile Dockerfile.bak html nginx-1.24.0.tar.gz nginx.conf
  4. ##修改dockerfile
  5. [root@localhost nginx]#vim Dockerfile
  6. ##多级构建nginx镜像
  7. [root@localhost nginx]#docker build -t nginx:lnmp .
  8. [root@localhost nginx]#docker images
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. nginx lnmp 4dca9c42d983 5 seconds ago 208MB
  11. nginx centos cd7bd0d67d77 6 hours ago 560MB
  12. centos 7 eeb6ee3f44bd 2 years ago 204MB

  1. FROM centos:7 as build
  2. #基于centos7镜像
  3. MAINTAINER nginx on centos7 by lxy-20240125
  4. #注释信息
  5. ADD nginx-1.24.0.tar.gz /opt/
  6. #将nginx安装包传输到镜像中
  7. RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
  8. cd /opt/nginx-1.24.0 && \
  9. ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
  10. make && make install
  11. #下载编译安装nginx的依赖环境,以及创建nginx用户,进入nginx目录中,完成配置--编译--安装
  12. ENV PATH=$PATH:/usr/local/nginx/sbin/
  13. #创建镜像的环境变量
  14. ADD nginx.conf /usr/local/nginx/conf/nginx.conf
  15. #将配置文件传输的镜像中,覆盖原有的nginx.conf文件
  16. RUN chmod 777 -R /usr/local/nginx/html/
  17. #修改权限
  18. FROM centos:7
  19. #再次基于centos7
  20. COPY --from=build /usr/local/nginx /usr/local/nginx
  21. #把第一阶段的安装目录复制到第二阶段
  22. RUN useradd -M -s /sbin/nologin nginx
  23. #必须的有个nginx用户
  24. EXPOSE 80
  25. #暴露80端口
  26. CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
  27. #设置启动命令

二、基于上次的php的Dockerfile修改做多级构建

  1. [root@localhost php]#cp Dockerfile{,.bak}
  2. [root@localhost php]#ls
  3. Dockerfile Dockerfile.bak php-7.1.10.tar.bz2 php-fpm.conf php.ini www.conf
  4. [root@localhost php]#vim Dockerfile
  5. [root@localhost php]#docker build -t php:lnmp .
  6. [root@localhost php]#docker images
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. php lnmp 0e64d9300be2 About a minute ago 520MB
  9. php centos 6ae7f531fd8a 4 hours ago 965MB

  1. FROM centos:7
  2. #基础镜像为centos7
  3. MAINTAINER this is php image <lxy:20240125>
  4. #注释信息
  5. ADD php-7.1.10.tar.bz2 /opt/
  6. #将文件传输到镜像中
  7. RUN yum -y install gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel gcc gcc-c++ make pcre-develgcc gcc-c++ make pcre-devel && \
  8. yum clean all && \
  9. cd /opt/php-7.1.10 && \
  10. ./configure \
  11. --prefix=/usr/local/php \
  12. --with-mysql-sock=/usr/local/mysql/mysql.sock \
  13. --with-mysqli \
  14. --with-zlib \
  15. --with-curl \
  16. --with-gd \
  17. --with-jpeg-dir \
  18. --with-png-dir \
  19. --with-freetype-dir \
  20. --with-openssl \
  21. --enable-fpm \
  22. --enable-mbstring \
  23. --enable-xml \
  24. --enable-session \
  25. --enable-ftp \
  26. --enable-pdo \
  27. --enable-tokenizer \
  28. --enable-zip && make -j 2&& make install && \
  29. useradd -M -s /sbin/nologin nginx
  30. #通过RUN依次下载php的依赖环境,清理yum缓存
  31. #进入文件,配置--编译--安装
  32. #创建nginx用户
  33. COPY php.ini /usr/local/php/lib/php.ini
  34. COPY php-fpm.conf /usr/local/php/etc/php-fpm.conf
  35. COPY www.conf /usr/local/php/etc/php-fpm.d/www.conf
  36. #将三个配置文件传输到镜像中
  37. FROM centos:7
  38. RUN yum -y install gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel gcc gcc-c++ make pcre-develgcc gcc-c++ make pcre-devel && \
  39. yum clean all && \
  40. useradd -M -s /sbin/nologin nginx
  41. COPY --from=0 /usr/local/php /usr/local/php
  42. EXPOSE 9000
  43. #暴露9000端口
  44. CMD [ "/usr/local/php/sbin/php-fpm", "-F" ]
  45. #启动

三、基于上次的mysql的Dockerfile修改做多级构建

  1. FROM centos:7
  2. #基于centos7镜像
  3. MAINTAINER this is mysql image <lxy>
  4. #注释信息
  5. ADD mysql-boost-5.7.44.tar.gz /opt/
  6. #将安装包和配置文件传输到镜像中
  7. RUN yum -y install make gcc gcc-c++ ncurses ncurses-devel bison cmake openssl-devel && \
  8. yum clean all && \
  9. cd /opt/mysql-5.7.44/ && \
  10. cmake \
  11. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  12. -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
  13. -DSYSCONFDIR=/etc \
  14. -DSYSTEMD_PID_DIR=/usr/local/mysql \
  15. -DDEFAULT_CHARSET=utf8 \
  16. -DDEFAULT_COLLATION=utf8_general_ci \
  17. -DWITH_EXTRA_CHARSETS=all \
  18. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  19. -DMYSQL_DATADIR=/usr/local/mysql/data \
  20. -DWITH_BOOST=boost \
  21. -DWITH_SYSTEMD=1 && make -j 2 && make install
  22. #依次安装依赖环境,注意新版本必须要openssl环境,注意提示报错查看
  23. #清理yum缓存
  24. #进入mysql解压包中,完成cmake--编译--安装
  25. FROM centos:7
  26. COPY --from=0 /usr/local/mysql /usr/local/mysql
  27. COPY my.cnf /etc/my.cnf
  28. RUN useradd -M -s /sbin/nologin mysql && \
  29. chown mysql:mysql /etc/my.cnf && \
  30. chown -R mysql:mysql /usr/local/mysql/ &&\
  31. /usr/local/mysql/bin/mysqld \
  32. --initialize-insecure \
  33. --user=mysql \
  34. --basedir=/usr/local/mysql \
  35. --datadir=/usr/local/mysql/data
  36. #创建一个mysql用户
  37. #修改配置文件的权限
  38. #修改安装目录的权限
  39. #直接用命令启动mysql
  40. ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
  41. #配置环境变量
  42. EXPOSE 3306
  43. #暴露端口
  44. CMD ["/usr/local/mysql/bin/mysqld"]
  45. #设置默认启动命令

 

基于以上三个镜像构建

 

四、镜像体积是不是越小越好?为什么要缩减镜像体积?

核心:降本增效以及安全

容器是镜像运行起来的实例,容器是宿主机的一个进程,那么肯定是镜像越小越好

  • 镜像越小说明占用宿主机的磁盘、内存资源越少,节约资源;
  • 镜像越小说明需要处理的文件越少,构建越快,提高效率;
  • 镜像越小,那么可以被攻击的面越小,就越安全。

五、缩小镜像体积的方法有哪些?

1)尽量使用体积小的基础镜像,比如alpine,这是专门为容器创建的;

2)尽量减少dockerfile的指令,因为每一条指令对应一层文件系统;(镜像是一层一层文件系统叠加的整体文件系统,对外展现为一个整体);

3)RUN指令的最后可以清理一下yum缓存,清理一下安装包等;

4)COPY尽量放在RUN后面,docker可以更好使用缓存功能;

5)使用.dockerignore文件,将不复制的文件定义在文件中;

6)容器镜像里一般只运行单个应用,这样体积更小,也更好管理;

7)使用多阶段构建;

  1. FROM 第一构建阶段的基础镜像 as 别名
  2. ....
  3. FROM 第二构建阶段的基础镜像
  4. COPY --from=别名|阶段ID(第一阶段为0) 第一阶段构建的文件|目录 当前阶段的路径
  5. ....
  6. CMD|ENTRYPOINT 指定启动命令

在mysql镜像构建过程中的报错

 No space left on device
表示磁盘空间不足,当前是虚拟机测试环境,虚拟机只给了40G,没想到报错,也查看挂载点使用量,确实是磁盘空间不够了。这个时候直接重新换一台主机太难受了,然后通过逻辑卷扩容实现的

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46716
推荐阅读
相关标签
  

闽ICP备14008679号