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

目录

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

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

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

基于以上三个镜像构建

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

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


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

[root@localhost nginx]#cp Dockerfile{,.bak}
[root@localhost nginx]#ls
Dockerfile  Dockerfile.bak  html  nginx-1.24.0.tar.gz  nginx.conf
##修改dockerfile
[root@localhost nginx]#vim Dockerfile

##多级构建nginx镜像
[root@localhost nginx]#docker build -t nginx:lnmp .

[root@localhost nginx]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        lnmp      4dca9c42d983   5 seconds ago   208MB
nginx        centos    cd7bd0d67d77   6 hours ago     560MB
centos       7         eeb6ee3f44bd   2 years ago     204MB

FROM centos:7 as build
#基于centos7镜像
MAINTAINER nginx on centos7 by lxy-20240125
#注释信息
ADD nginx-1.24.0.tar.gz /opt/
#将nginx安装包传输到镜像中
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
    cd /opt/nginx-1.24.0 && \
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
    make && make install
#下载编译安装nginx的依赖环境,以及创建nginx用户,进入nginx目录中,完成配置--编译--安装
ENV PATH=$PATH:/usr/local/nginx/sbin/
#创建镜像的环境变量
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
#将配置文件传输的镜像中,覆盖原有的nginx.conf文件
RUN chmod 777 -R /usr/local/nginx/html/
#修改权限

FROM centos:7
#再次基于centos7
COPY --from=build /usr/local/nginx /usr/local/nginx
#把第一阶段的安装目录复制到第二阶段
RUN useradd -M -s /sbin/nologin nginx
#必须的有个nginx用户
EXPOSE 80
#暴露80端口
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置启动命令

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

[root@localhost php]#cp Dockerfile{,.bak} 
[root@localhost php]#ls
Dockerfile  Dockerfile.bak  php-7.1.10.tar.bz2  php-fpm.conf  php.ini  www.conf

[root@localhost php]#vim Dockerfile
[root@localhost php]#docker build -t php:lnmp .

[root@localhost php]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
php          lnmp      0e64d9300be2   About a minute ago   520MB
php          centos    6ae7f531fd8a   4 hours ago          965MB

FROM centos:7
#基础镜像为centos7
MAINTAINER this is php image <lxy:20240125>
#注释信息
ADD php-7.1.10.tar.bz2 /opt/
#将文件传输到镜像中
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 && \
yum clean all && \
cd /opt/php-7.1.10 && \
 ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 2&& make install && \
useradd -M -s /sbin/nologin nginx
#通过RUN依次下载php的依赖环境,清理yum缓存
#进入文件,配置--编译--安装
#创建nginx用户
COPY php.ini    /usr/local/php/lib/php.ini
COPY php-fpm.conf /usr/local/php/etc/php-fpm.conf
COPY www.conf /usr/local/php/etc/php-fpm.d/www.conf
#将三个配置文件传输到镜像中

FROM centos: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 && \
yum clean all && \
useradd -M -s /sbin/nologin nginx
COPY --from=0 /usr/local/php /usr/local/php
EXPOSE 9000
#暴露9000端口
CMD [ "/usr/local/php/sbin/php-fpm", "-F" ]
#启动

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

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

 

基于以上三个镜像构建

 

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

核心:降本增效以及安全

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

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

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

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

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

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

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

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

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

7)使用多阶段构建;

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

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/350416.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

变相体罚的行为有哪些

你是否在无意中“伤害”了学生&#xff1f;每一位老师都如同辛勤的园丁&#xff0c;努力耕耘&#xff0c;期待花开。但在这个过程中&#xff0c;有些行为&#xff0c;虽不带皮肉之苦&#xff0c;却可能给学生的心灵留下难以愈合的创伤。今天&#xff0c;就让我们来谈谈这些隐蔽…

OpenHarmony—TypeScript到ArkTS约束说明

对象的属性名必须是合法的标识符 规则&#xff1a;arkts-identifiers-as-prop-names 级别&#xff1a;错误 在ArkTS中&#xff0c;对象的属性名不能为数字或字符串。通过属性名访问类的属性&#xff0c;通过数值索引访问数组元素。 TypeScript var x { name: x, 2: 3 };c…

2024最新幻兽帕鲁服务器多少钱一个?

幻兽帕鲁服务器多少钱&#xff1f;价格便宜&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;4核32G配置113元1个月、339元3个月&#xff1b;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

苹果笔记本MacBook电脑怎么卸载软件?三种方法快速卸载软件

苹果笔记本MacBook电脑是一款非常流行的电脑&#xff0c;但是有时候我们可能需要卸载一些不需要的软件。下面是一些简单的步骤&#xff0c;可以帮助您在MacBook电脑上卸载软件。 苹果笔记本MacBook电脑怎么卸载软件&#xff1f;三种实用方法快速卸载软件&#xff01; 方法一&a…

【开源】基于JAVA语言的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

1. MySQL 数据库

本章内容 关系型数据库基础 安装 MySQL 管理数据库和表 用户和权限管理 函数&#xff0c;存储过程&#xff0c;触发器和事件 MySQL 架构 存储引擎 服务器选项&#xff0c;系统和状态变量 优化查询和索引管理 锁和事务管理 日志管理 备份还原 MySQL 集群 压力测试…

【星海随笔】unix 启动问题记录.

启动Ubuntu操作系统时&#xff0c;直接进入GRUB状态。 调试时候&#xff0c;曾显示 no bootable device no known filesystem detected 注意&#xff1a; 目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy &#xff0c;从 1.x 开始的就称…

软件功能测试如何确定测试需求?CMA、CNAS软件测试报告获取

软件功能测试是为了验证软件的功能是否按照设计要求正常工作的过程&#xff0c;可以确保软件的质量&#xff0c;提高用户体验&#xff0c;也是保证软件安全和可靠性的重要一环。我们需要从多个角度对软件的各个功能模块进行测试&#xff0c;确保每个功能都能正常运行&#xff0…

75 C++对象模型探索。C++关于 虚函数表指针位置分析。C++ 面向对象和基于对象的概念。

如果一个类中&#xff0c;有虚函数&#xff0c;针对这个类会产生一个虚函数表。 生成这个类对象的时候&#xff0c;会有一个虚函数表指针&#xff0c;这个指针会指向这个虚函数表的开始地址。 我们本节就研究这个vptr指针。注意&#xff0c;vptr指针在 类对象中的位置。 证明…

AI Agents系列—— 探究大模型的推理能力,关于Chain-of-Thought的那些事儿

一、写在前面&#xff1a;关于AI Agents与CoT 本文是2023.07.24发表在同名公众号「陌北有棵树」上的一篇文章&#xff0c;个人观点是基础理论的学习现在仍是有必要的&#xff0c;所以搬运过来。 今天要读的论文是《Chain-of-Thought Prompting Elicits Reasoning in Large La…

【C++】C++入门基础讲解(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读 经过一段时间的C语言学习&#xff0c;我们以及基本掌握了C语言的知识&#xff0c;今天&#xff0c;我们就开始学习C&#xff0c;…

张维迎《博弈与社会》笔记(2)导论:个体理性与社会最优:协调与合作问题

有节选&#xff0c;相当于按照自己的方式将内容组织了下吧&#xff1f; 协调与合作问题 什么是一个社会面临的基本问题&#xff1f; 这似乎是一个我们每一个人都可以触摸得到但又难以说清的问题&#xff0c;因为在不同的语境下&#xff0c;“社会”一词的内涵有所差异。但其基…

如何阅读xml电子发票

xml电子发票是官方给出的电子存档的文件格式&#xff0c;本质是文本&#xff0c;所以文件很小&#xff0c;大量发票存储&#xff0c;能够更加凸显优势。 但是xml电子发票不方便阅读&#xff0c;因为里面是xml格式&#xff0c;对于财务人员来讲&#xff0c;看“代码”简直太难了…

网络安全防御保护实验(二)

一、登录进防火墙的web控制页面进行配置安全策略 登录到Web控制页面&#xff1a; 打开Web浏览器&#xff0c;输入防火墙的IP地址或主机名&#xff0c;然后使用正确的用户名和密码登录到防火墙的Web管理界面。通常&#xff0c;这些信息在防火墙设备的文档或设备上会有说明。 导…

【创建vue项目的两种方式】

Vue环境搭建 NodeJs安装包安装淘宝镜像 环境搭建webpack安装全局安装vue/cli查看模板创建项目1.webpack2. vue-cli NodeJs安装包 下载链接&#xff1a;官网链接 下载下来后&#xff0c;直接傻瓜式的安装即可。 通过在cmd控制台输入以下命令查看是否安装成功 node -v因为适配某…

如何使用WinSCP公网远程访问本地CentOS服务器编辑上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

利用ADS建立MIPI D-PHY链路仿真流程

根据MIPI D-PHY v1.2规范中对于互连电气参数的定义,本次仿真实例中,需要重点关注如下的设计参数: 1. 差分信号的插入损耗Sddij和回拨损耗Sddii; 2. 模式转换损耗Sdcxx、Scdxx; 3. 数据线与时钟线之间的串扰耦合(远、近端)。 设计者还可以结合CTS中的补充…

Mediasoup Demo-v3笔记(五)——Mediasoup 的启动

Mediasoup是由两部分组成的&#xff0c;一部分是js的控制模块&#xff0c;一部分是c的传输模块&#xff0c;在这里我们用mediasoup demo的代码开始&#xff0c;分析整个进程的启动过程 1、在mediasoup-demo-3的server.js中&#xff0c;调用启动方法 mediasoup-demo-3是一个dem…

快乐学Python,DataFrame的基本操作

在上一篇文章中&#xff0c;我们了解了如何使用 pandas 的函数来从多种数据源&#xff1a;csv、excel 和 html 网页。其中不管是哪一种数据读取的方式&#xff0c;最终返回的都是一个 DataFrame 对象。 对于 DataFrame 对象&#xff0c;我们只是简单将其打印出来&#xff0c;这…

四、MyBatis 动态语句

本章概要 动态语句需求和简介if 和 where 标签set 标签trim 标签(了解)choose/when/otherwise 标签foreach 标签sql 片段 4.1 动态语句需求和简介 经常遇到很多按照很多查询条件进行查询的情况&#xff0c;比如智联招聘的职位搜索等。其中经常出现很多条件不取值的情况&#…
最新文章