Docker基于Dockerfile多级构建,实现缩小镜像体积

ZYC·2024-01-28 02:05·95 次阅读

Docker基于Dockerfile多级构建,实现缩小镜像体积

Docker基于Dockerfile多级构建,实现缩小镜像体积

 

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

 

 

复制代码
FROM centos:7 as build
#基于centos7镜像
MAINTAINER this is nginx of LNMP on centos by yr 2024-01-27
#注释信息
ADD nginx-1.24.0.tar.gz /opt/
#将nginx安装包传输到镜像中
RUN yum -y install pcre-devel zlib-devel openssl-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.comnf文件
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端口
#EXPOSE 443

CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置启动后命令
复制代码

 

 

基于上次的MYSQL的Dockerfile修改做多级构建#

 

 

 

复制代码
FROM centos:7
#基于centos7镜像
MAINTAINER this is mysql image for LNMP  by <yr>
#注释信息
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 -R mysql:mysql /usr/local/mysql/ && \
    chown mysql:mysql /etc/my.cnf && \
    /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
#创建一个MySQL用户
#修改配置文件权限
#修改安装目录的权限
#直接用命令启动mysql
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
#配置环境变量
EXPOSE 3306
#暴露端口3306
CMD ["/usr/local/mysql/bin/mysqld"]
#设置默认启动命令
复制代码

 

 

基于上次的PHP的Dockerfile修改做多级构建#

 

 

复制代码
FROM centos:7
#基础镜像为centos7
MAINTAINER this is php image for LNMP by (yr 20240127)
#注释信息
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-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缓存
#进入php文件中,进行配置--编译--安装
#创建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
ENV PATH $PATH:/usr/local/php/bin:/usr/local/php/sbin
#进行容器环境变量
EXPOSE 9000
#暴露端口9000
CMD [ "/usr/local/php/sbin/php-fpm", "-F" ]
#启动
复制代码

 

 

 

基于以上三个镜像构建容器#

#创建容器nginx

 #验证下是否共享

docker run -d --name nginx -v /opt/dockerfile/nginx/html/:/usr/local/nginx/html -p 80:80 --network mynetwork --ip 172.18.0.2 nginx:lnmp

docker run -d --name mysql --privileged -v /usr/local/mysql --network mynetwork --ip 172.18.0.4 mysql:lnmp

 

 

 

 #空间缩小后依然正常可以访问网站

 

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

核心:降本增效以及安全

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

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

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

复制代码
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 指定启动命令
复制代码

 

posted @   citywalk  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
目录