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)使用多阶段构建;
-
FROM 第一构建阶段的基础镜像 as 别名
-
....
-
FROM 第二构建阶段的基础镜像
-
COPY --from=别名|阶段ID(第一阶段为0) 第一阶段构建的文件|目录 当前阶段的路径
-
....
-
CMD|ENTRYPOINT 指定启动命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?