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. 封装即约束——封装和派生、多态的本质区别 一门计算机语言,要如何帮助程序员写出优秀的代码?两个方法:一是给程序员更多能力,二是给程序员更多约束。之前我们学习的派生和多态,更多的是给我们技能,而封…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...