docker镜像构建企业级示例
华子目录
- 示例(在centos容器中源码编译nginx(单介构建))
- 包准备
- 为`centos容器`提供`网络源`
- 添加`企业7`的`ISO文件`
- 提交为新的centos镜像
- 编写dockerfile文件
- 构建镜像
- 如何优化自己构建的镜像大小
- 多介构建
- ldd命令
- 基本用法
- 示例
- 镜像优化方案
示例(在centos容器中源码编译nginx(单介构建))
单介构建:只有一个from指令
包准备
-
上传
镜像centos-7.tar.gz -
导入
centos7镜像
[root@docker-node1 ~]# docker load -i centos-7.tar.gz
- 上传
源码包nginx-1.26.1.tar.gz - 将
nginx源码包放到上下文路径下
[root@docker-node1 ~]# cp nginx-1.26.1.tar.gz docker/
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# ls
nginx-1.26.1.tar.gz
为centos容器提供网络源
- 宿主机光盘中的包作为容器的yum网络源
[root@docker-node1 ~]# yum install httpd -y
[root@docker-node1 ~]# vim /etc/httpd/conf/httpd.conf

添加企业7的ISO文件

[root@docker-node1 ~]# mkdir /var/www/html/rhel7[root@docker-node1 ~]# mount /dev/sr
sr0 sr1[root@docker-node1 ~]# mount /dev/sr1 /var/www/html/rhel7/
[root@docker-node1 ~]# systemctl restart httpd
[root@docker-node1 ~]# ifconfig

- 运行
centos7镜像,容器名为centos
[root@docker-node1 ~]# docker run -d --name centos centos:7 sleep 10000
- 查看
centos容器的详细信息
[root@docker-node1 ~]# docker inspect centos

- 我们发现
宿主机和centos容器的网络是通的
[root@docker-node1 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) 比特的数据。
64 比特,来自 172.17.0.2: icmp_seq=1 ttl=64 时间=0.341 毫秒
64 比特,来自 172.17.0.2: icmp_seq=2 ttl=64 时间=0.156 毫秒
64 比特,来自 172.17.0.2: icmp_seq=3 ttl=64 时间=0.070 毫秒
- 进入
centos容器,添加yum源
[root@docker-node1 ~]# docker exec -it centos /bin/sh
sh-4.2# cd /etc/yum.repos.d/
sh-4.2# rm -rf *
sh-4.2# vi centos7.repo
[rhel7]
name=rhel7
baseurl=http://172.17.0.1:8080/rhel7/
gpgcheck=0
sh-4.2# #ctrl+p+q退出不停止容器
[root@docker-node1 ~]#
提交为新的centos镜像
[root@docker-node1 ~]# docker commit -a "huazi" -m "add yum repo" centos centos:repo
[root@docker-node1 ~]# docker images centos:repo
REPOSITORY TAG IMAGE ID CREATED SIZE
centos repo c618983b610f About a minute ago 204MB[root@docker-node1 ~]# docker history centos:repo
IMAGE CREATED CREATED BY SIZE COMMENT
c618983b610f 44 seconds ago sleep 10000 72B add yum repo
eeb6ee3f44bd 3 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 years ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
编写dockerfile文件
[root@docker-node1 ~]# cd docker
[root@docker-node1 docker]# vim dockerfile
FROM centos:repo
LABEL Mail=huazi@huazi.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"][root@docker-node1 docker]# ls
dockerfile nginx-1.26.1.tar.gz
构建镜像
[root@docker-node1 docker]# docker build -t nginx:centos7 .

[root@docker-node1 docker]# docker history nginx:centos7
IMAGE CREATED CREATED BY SIZE COMMENT
939f29314f9a About a minute ago CMD ["/usr/local/nginx/sbin/nginx" "-g" "dae… 0B buildkit.dockerfile.v0
<missing> About a minute ago VOLUME [/usr/local/nginx/html] 0B buildkit.dockerfile.v0
<missing> About a minute ago EXPOSE map[443/tcp:{} 80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> About a minute ago RUN /bin/sh -c make install # buildkit 6.11MB buildkit.dockerfile.v0
<missing> About a minute ago RUN /bin/sh -c make # buildkit 20.6MB buildkit.dockerfile.v0
<missing> About a minute ago RUN /bin/sh -c ./configure --prefix=/usr/loc… 78.9kB buildkit.dockerfile.v0
<missing> About a minute ago RUN /bin/sh -c yum install gcc make pcre-dev… 118MB buildkit.dockerfile.v0
<missing> About a minute ago WORKDIR /mnt/nginx-1.26.1 0B buildkit.dockerfile.v0
<missing> About a minute ago ADD nginx-1.26.1.tar.gz /mnt # buildkit 7.35MB buildkit.dockerfile.v0
<missing> About a minute ago LABEL Mail=huazi@huazi.org 0B buildkit.dockerfile.v0
<missing> About a minute ago /bin/sh 68B add centos7.repo
<missing> 3 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 years ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
[root@docker-node1 docker]# docker images nginx:centos7
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx centos7 939f29314f9a About a minute ago 356MB
- 我们发现构建出来的
镜像大小为356MB
如何优化自己构建的镜像大小
- 因为
一个指令为一层,所以我们可以减少层数,来优化镜像大小
[root@docker-node1 docker]# vim dockerfile
FROM centos:repo
LABEL Mail=huazi@huazi.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -rf /mnt/nginx-1.26.1 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"]
[root@docker-node1 docker]# docker build -t nginx2:centos7 .
[root@docker-node1 docker]# docker images nginx2:centos7
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx2 centos7 643164382b66 41 seconds ago 292MB
- 我们发现镜像大小
变小了
多介构建
- 一个
dockerfile中有多个from指令
FROM centos:repo AS build #AS标记为build阶段
LABEL Mail=huazi@huazi.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -rf /mnt/nginx-1.26.1 && yum clean allFROM centos:repo
LABEL mail=huazi@huazi.org
COPY --from=build /usr/local/nginx /usr/local/nginx #将build阶段中的/usr/local/nginx复制到当前阶段中的/usr/local/nginx
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"]
[root@docker-node1 docker]# docker build -t nginx3:centos7 .
[root@docker-node1 docker]# docker images nginx3:centos7
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx3 centos7 27a5c3dd15c1 14 seconds ago 210MB
- 我们发现镜像大小
变小了
ldd命令
当你对一个可执行文件或共享库使用ldd命令时,它会列出该文件所依赖的所有共享库,以及这些共享库在文件系统中的路径
基本用法
ldd <可执行文件或共享库>
示例
假设你有一个名为my_program的可执行文件,你可以使用以下命令来查看它的共享库依赖关系:
ldd my_program
输出可能类似于:
linux-vdso.so.1 (0x00007fffdc9d7000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8a6c61c000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a6c22b000)/lib64/ld-linux-x86-64.so.2 (0x00007f8a6c91b000)
这里,my_program依赖于libm.so.6(数学库)、libc.so.6(C标准库)和ld-linux-x86-64.so.2(动态链接器/加载器)
镜像优化方案
- 选择
最精简的基础镜像 - 减少
镜像的层数 清理镜像构建的中间产物
相关文章:
docker镜像构建企业级示例
华子目录 示例(在centos容器中源码编译nginx(单介构建))包准备为centos容器提供网络源添加企业7的ISO文件 提交为新的centos镜像编写dockerfile文件构建镜像如何优化自己构建的镜像大小多介构建 ldd命令基本用法示例 镜像优化方案…...
【源码】Sharding-JDBC源码分析之SQL中读写分离动态策略、数据库发现规则及DatabaseDiscoverySQLRouter路由的原理
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...
Spark 之 partitons
Listing leaf files and directories 分析其并行化 org.apache.spark.util.HadoopFSUtils sc.parallelize(paths, numParallelism).mapPartitions { pathsEachPartition >val hadoopConf serializableConfiguration.valuepathsEachPartition.map { path >val leafFiles…...
使用Zerotier配置虚拟局域网,踏坑
配置虚拟局域网有多种方式,包括带桌面的和纯网络的。 一、带桌面的(不是本次重点) 常见工具:向日葵、todesk、anydesk、restDesk 前两者是常见商业工具,anydesk好像很轻,restDesk是开源项目,…...
【优选算法 二分查找】二分查找算法模板详解:二分查找 & 在排序数组中查找元素的第一个和最后一个位置
二分查找 题目描述 题目解析 暴力解法 我们可以从左往右遍历一次数组,如果存在 target 则返回数组的下标,否则返回 -1; 时间复杂度 O(N),因为没有利用数组有序的特点,每次比较只能舍弃一个要比较的数&…...
gitlab 生成并设置 ssh key
一、介绍 🎯 本文主要介绍 SSH Key 的生成方法,以及如何在GitLab上添加SSH Key。GitLab 使用SSH协议与Git 进行安全通信。当您使用 SSH密钥 对 GitLab远程服务器进行身份验证时,您不需要每次都提供您的用户名和密码。SSH使用两个密钥&#x…...
计算机视觉在科学研究(数字化)中的实际应用
计算机视觉是一种利用计算机技术来解析和理解图像和视频的方法。.随着计算机技术的不断发展,计算机视觉被广泛应用于科学研究领域,为科学家提供了无限的可能。 一、生命科学领域 在生命科学领域,计算机视觉被广泛用于图像识别、分类和测量等…...
移动应用开发课程第六次实验:为实验2添加登陆页面,用SQList存储好友基本信息
1、在Android Studio中,请在第二次实验成果的基础上完成以下实验要求。 向右滑动 请添加登录页面。在登录页面中,如果用户输入的用户名和密码正确,则跳转至如上图所示的好友列表,并记录用户的登录信息,在用户第一次登…...
nextjs增加系统路径前缀(basePath)适配方案
在 Next.js 中,路由是通过文件夹结构来定义的,使用类似于 History 模式的 URL 结构。所以如果想通过nginx来代理一个nextjs开发的系统, 除非直接使用跟路径/来进行代理,否则代理将非常麻烦,这时添加basePath就非常有必…...
嵌入式蓝桥杯学习拓展 LCD翻转显示
通过配置SS和GS两个标志位,实现扫描方向的切换。 将lcd.c的REG_932X_Init函数进行部分修改。 将LCD_WriteReg(R1, 0x0000);修改为LCD_WriteReg(R1,0x0100); 将LCD_WriteReg(R96, 0x2700); 修改为LCD_WriteReg(R96, 0xA700); void REG_932X_Init1(void) {LCD_Wr…...
学习threejs,实现配合使用WebWorker
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️WebWorker web端多线程 二、…...
TDengine 新功能 复合主键
1. 简介 从 TDengine 3.3.0.0 版本之后,新增了复合主键的功能。 TDengine 原来的时间列是不允许有重复时间戳的,有了复合主键功能后,时间列即允许有重复,重复后的时间戳按紧跟其后第二列主键列的值来确定唯一性。 此功能的常用…...
JVM 面试题
Java 虚拟机(JVM)是运行 Java 程序的引擎,它是 Java 语言 “一次编译,处处运行” 的核心技术。JVM 的主要任务是将 Java 字节码(Bytecode)解释成机器码并执行,负责内存管理、线程管理、垃圾回收…...
组件上传图片不回显问题
import { Plus } from "element-plus/icons-vue"; // 图片上传 const img_add ref([]); function httpRequest_add(option) {let dataForm new FormData();dataForm.append("file", option.file);dataForm.append("id", user.data.id);axios({…...
【JavaWeb后端学习笔记】Spring AOP面向切面编程
AOP 1、Spring AOP概述2、SpringAOP快速入门3、SpringAOP核心概念4、通知类型5、通知顺序6、切入点表达式6.1 execution方式6.2 annotation方式 7、连接点 1、Spring AOP概述 AOP:Aspect Oriented Programming,面向特定方法编程。 AOP是通过动态代理技术…...
6.584-Lab5B
6.584-Lab5B Reference CodeReference BlogHomeworkMyself Code Sharded Key/Value Service 梗概 这个图是我从上面参考blog中拿来的,觉得做的不错,借助这张图来讲解一下需要一个什么样的 Service。 ShardCtrler Client: 接收来自客户发出的命…...
OceanBase 的探索与实践
作者:来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…...
安卓调试环境搭建
前言 前段时间电脑重装了系统,最近准备调试一个apk,没想到装环境的过程并不顺利,很让人火大,于是记录一下。 反编译工具下载 下载apktool.bat和apktool.jar 官网地址:https://ibotpeaches.github.io/Apktool/install…...
动画Lottie
Lottie简介 Lottie是一个Airbnb 开发的用于Android,iOS,Web和Windows的库,用于解析使用Bodymovin导出为json的Adobe After Effects动画,并在移动设备和网络上呈现 — GitHub Lottie主要特性 After Effects 兼容性: …...
C++感受14-Hello Object 封装版 - 上
1. 封装即约束——封装和派生、多态的本质区别 一门计算机语言,要如何帮助程序员写出优秀的代码?两个方法:一是给程序员更多能力,二是给程序员更多约束。之前我们学习的派生和多态,更多的是给我们技能,而封…...
告别复杂配置!Qwen-Image-2512-SDNQ一键部署,打造专属AI绘画网站
告别复杂配置!Qwen-Image-2512-SDNQ一键部署,打造专属AI绘画网站 1. 为什么选择Qwen-Image-2512-SDNQ镜像? 在AI绘画领域,模型部署往往意味着复杂的配置和环境搭建。Qwen-Image-2512-SDNQ-uint4-svd-r32镜像彻底改变了这一现状&…...
Python实战:3种高效连接ClickHouse的方法对比(附性能测试)
Python实战:3种高效连接ClickHouse的方法对比(附性能测试) 在数据分析领域,ClickHouse凭借其卓越的列式存储和向量化执行引擎,已成为处理海量数据的首选解决方案之一。而Python作为数据科学家的瑞士军刀,如…...
解决QGroundControl或华科尔地面站因QT版本冲突导致的启动失败问题
1. 当QGroundControl或华科尔地面站打不开时该怎么办 遇到QGroundControl或华科尔地面站安装后无法启动的问题,很多用户第一反应是软件安装包损坏了。但实际上,这很可能是由于QT框架版本冲突导致的。QT是一个跨平台的C图形用户界面应用程序开发框架&…...
Minica 源码解读:深入理解证书生成的核心算法
Minica 源码解读:深入理解证书生成的核心算法 【免费下载链接】minica minica is a small, simple CA intended for use in situations where the CA operator also operates each host where a certificate will be used. 项目地址: https://gitcode.com/gh_mirr…...
vLLM-v0.17.1参数详解:--disable-log-stats与--log-level日志调优
vLLM-v0.17.1参数详解:--disable-log-stats与--log-level日志调优 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在…...
零基础学编程:借助快马与claude code生成交互式代码示例入门javascript
最近刚开始学习JavaScript,发现数组操作是编程中最基础也最常用的部分。作为一个完全零基础的小白,我尝试用InsCode(快马)平台结合Claude Code来学习这个知识点,整个过程比想象中顺利很多。这里记录下我的学习过程,希望能帮到同样…...
天津专业的阀门厂排名
在天津,阀门行业发展态势良好,众多阀门厂各有特色与优势。中国通用机械工业协会最新发布的《2026年阀门行业高质量发展白皮书》显示,天津的阀门产业在技术创新、产品质量和市场份额等方面都有不错的表现。下面为大家介绍几家天津比较知名的阀…...
量子行走:从理论到Python实现——4. 量子算法设计与实现
目录 4. 量子算法设计与实现 4.1 基础量子算法 4.1.1 Deutsch-Jozsa算法 4.1.2 量子傅里叶变换 4.1.3 Grover搜索算法 4.2 Shor因数分解与离散对数 4.2.1 算法框架与经典预处理 4.2.2 量子相位估计的精度分析 4.3 变分量子算法 4.3.1 变分量子本征求解器 4.3.2 量子近…...
EDCNN在低剂量CT图像去噪中的边缘增强与复合损失优化策略
1. 低剂量CT图像去噪的挑战与EDCNN的突破 低剂量CT扫描在临床应用中越来越普遍,因为它能显著降低患者接受的辐射剂量。但随之而来的问题是图像噪声增加,这给医生的诊断带来了巨大挑战。传统去噪方法往往难以在噪声抑制和细节保留之间取得平衡࿰…...
OpenClaw任务编排:GLM-4.7-Flash驱动复杂工作流
OpenClaw任务编排:GLM-4.7-Flash驱动复杂工作流 1. 为什么需要任务编排? 去年我接手了一个重复性极高的数据整理工作——每周需要从十几个不同来源收集数据,清洗后生成可视化报告。最初尝试用Python脚本自动化,但随着需求变化&a…...
