【Docker】Dockerfile构建最小镜像
🥳🥳Welcome 的Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于Docker的相关操作吧
目录
🥳🥳Welcome 的Huihui's Code World ! !🥳🥳
前言
一.Dockerfile是什么
二.Dockerfile的基本结构
三.基础镜像的选择
四. 自定义镜像
0.jar包的准备
1.jar同级目录下创建Dockerfile文件
2.创建镜像
3.运行镜像
(1)上传jre
(2)编辑Dockerdile文件
(3)再次构建镜像
(4)运行jar包
五.优化镜像【构建最小镜像】
三.上传镜像与下载镜像
1.点击控制台之后,直接输入容器镜像服务ACR
2.选择实例
3.首次使用需要设置密码
4.将访问凭证在虚拟机中输入
5.创建命名空间
6.创建镜像仓库
7.根据提示上传镜像
(1)给镜像取别名
(2)将镜像上传到阿里云的镜像仓库中
(3)查看镜像
8.下载镜像
前言
我们在使用docker部署微服务项目的时候会发现这样一个问题:每个服务构建出的镜像文件都很大,几百M,有些原始镜像也已经占据了很多内存了...

这种大的镜像往往都会导致迁移的速度变慢。其实我们启动容器主要最需要的镜像是jdk,那么我们可以在构建镜像的时候就使用dk作为基础镜像,从而就可以减小镜像的大小了....
而且有的时候,项目的需求不同,也会需要让指定的镜像在启动容器的时候就启动...
上面所说到的这些情况,我们都可以使用Dockerfile去自定义镜像
一.Dockerfile是什么
Dockerfile是一种用于定义和构建Docker镜像的文本文件。它包含了一系列指令和参数,用于描述如何构建镜像以及运行容器时的配置。
通过编写Dockerfile,您可以指定所需的基础镜像、安装软件包、拷贝文件、设置环境变量、暴露端口等操作。Docker根据Dockerfile中的指令逐步执行构建过程,创建一个可运行的镜像
另外,使 用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙
二.Dockerfile的基本结构
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
方便大家理解,可以看下面这个图
下面就是Dockerfile的全部指令,排在前面的是比较常见常用的。
Dockerfile 指令
说明
FROM
指定基础镜像,用于后续的指令构建。
MAINTAINER
指定Dockerfile的作者/维护者。
LABEL
添加镜像的元数据,使用键值对的形式。
RUN
在构建过程中在镜像中执行命令。
CMD
指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT
设置容器创建时的主要命令。(不可被覆盖)
EXPOSE
声明容器运行时监听的特定网络端口。
ENV
在容器内部设置环境变量。
ADD
将文件、目录或远程URL复制到镜像中。
COPY
将文件或目录复制到镜像中。
VOLUME
为容器创建挂载点或声明卷。
WORKDIR
设置后续指令的工作目录。
USER
指定后续指令的用户上下文。
ARG
定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD
当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL
设置发送给容器以退出的系统调用信号。
HEALTHCHECK
定义周期性检查容器健康状态的命令。
SHELL
覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
三.基础镜像的选择
❗注意❗
基础镜像是构建Docker镜像的起点,它是构建过程中的第一个组成部分。基础镜像是已经预先构建好的镜像,包含了操作系统和一些最基本的软件包。
基础镜像在构建过程中是不可变的,即一旦选择了基础镜像,就无法更改其内容。因此,在选择基础镜像时需要考虑到您应用程序的需求和安全性要求。
这里也给大家推荐两个基础镜像:centos和alpine👇👇
centos和alpine的区别:
- 1. 空间大小差异,alpine默认5M左右,centos等都在200M左右。
- 2. 默认软件包差异,alpine选用busybox,centos等则是bash+coreutils几件套。
- 3. alpine中,国际化组件被优化掉了。
- 4. 还有一点,alpine中选用的都是“最简依赖”,这点和archlinux比较像,举个例子, openssh包不会自带pam插件,于是他也就不支持ldap。这点我给alpinelinux官方提过 issue。和php不一样,php可以做成php-pdo,php-dom的包,然后动态加载共享库。 openssh不行,“没带就是没写”。
- 5. glibc差异,alpine选用musl,centos等选用glibc,其他的倒还好,libc的差异对开发很重要。
四. 自定义镜像
0.jar包的准备
这里我用的连接工具是Mobaxterm,所以直接将jar包拖拽过去就行了
1.jar同级目录下创建Dockerfile文件
创建并且编辑Dockerfile文件,其中这个名字不要改动,就叫Dockerfile
FROM centos MAINTAINER 1913295768@qq.com WORKDIR /soft COPY spring.jar /soft
- FROM centos是基础镜像为CentOS
- MAINTAINER 1913295768@qq.com:Dockerfile作者的联系信息
- WORKDIR /soft:设置工作目录为/soft,即后续命令执行时的当前目录
- COPY spring.jar /soft:将主机上的spring.jar文件复制到容器中的/soft目录中
2.创建镜像
docker build -t spring:v1 .
- -v1 是给构建的镜像设定版本为 v1
- . 是代表使用当前路径进行构建
查看一下镜像
3.运行镜像
(1)上传jre
运行镜像需要java环境,这里我是用的是jre,是因为jre占取的空间更小。大家也可以使用jdk,因为jdk中是包含了jre的。
JDK和JRE区别:
JDK:JDK是Java开发工具包,它提供了开发和编译Java应用程序所需的工具和资源。JDK包括了JRE,同时还包含了编译器(javac)、调试器(jdb)、开发工具(例如Eclipse)和其他一些开发所需的库和工具。因此,JDK适用于开发人员,可以用来编写、编译和调试Java代码。
JRE:JRE是Java运行时环境,它是在用户计算机上执行Java应用程序的环境。JRE包含了Java虚拟机(JVM)和Java类库,能够解释和执行Java字节码。使用JRE,用户可以运行已编译的Java应用程序,但不能进行Java代码的编译和开发。
我们等会编辑Dockerfile文件时,需要配置JAVA_HOME,所以我们需要解压一下这个jre文件,不然我们就不知道这个jre解压后的名字是什么
tar -zxvf jre-8u391-linux-x64.tar.gz
(2)编辑Dockerdile文件
FROM centos MAINTAINER 1913295768@qq.com WORKDIR /soft COPY spring.jar /soft ADD jre-8u391-linux-x64.tar.gz /soft ENV JAVA_HOME=/soft/jre1.8.0_391 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$JAVA_HOME/bin:$PATH
- FROM centos:指定基础镜像为CentOS
- MAINTAINER 1913295768@qq.com:设置镜像的维护者信息
- WORKDIR /soft:设置工作目录为/soft
- COPY spring.jar /soft:将本地的spring.jar文件复制到镜像的/soft目录下
- ADD jre-8u391-linux-x64.tar.gz /soft:将本地的jre-8u391-linux-x64.tar.gz文件添加到镜像的/soft目录下
- ENV JAVA_HOME=/test/jre1.8.0_391:设置环境变量JAVA_HOME的值为/test/jre1.8.0_391
- ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:设置环境变量CLASSPATH的值为当前目录、$JAVA_HOME/lib/dt.jar和$JAVA_HOME/lib/tools.jar
- ENV PATH=$JAVA_HOME/bin:$PATH:将$JAVA_HOME/bin添加到系统路径中
(3)再次构建镜像
docker build -t spring:v2 .
可以看到jre和jar包都已经在里面了
(4)运行jar包
如果我们需要在构建容器时jar包就自动运行的话,就可以在Dockerfile文件配置中追加一个CMD命令
CMD java -jar spring.jar
如果其中CMD需要执行多个命令,那么我们可以使用命令分隔符:
CMD command1 ; command2 ; command3;
例如:CMD echo "Hello" ; echo "World"
因为做了修改,所以需要再构建一下镜像docker build -t spring:v3 .然后运行一下这个镜像
docker run -it spring:v3
五.优化镜像【构建最小镜像】
上面我们已经把镜像构建并且运行起来了,但是我们还是有很多优化的空间,现在我们自定义的镜像占取的空间很大,如果部署的容器多了,那占取的空间也会越大,这样会降低运行的速度,所以我们可以换一下基础镜像,不再使用centos了,而是使用前面给大家推荐的那个alpine镜像
这个alpine镜像只有13.1M
FROM jeanblanchard/alpine-glibc MAINTAINER 1913295768@qq.com WORKDIR /soft COPY spring.jar /soft ADD jre-8u391-linux-x64.tar.gz /soft ENV JAVA_HOME=/soft/jre1.8.0_391 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$JAVA_HOME/bin:$PATH CMD java -jar spring.jar
可以看到整个镜像的大小明显就比前面的要小很多了
因为做了修改,所以需要再构建一下镜像
docker build -t spring:v4 .然后运行一下这个镜像
docker run -it spring:v4
运行jar包,在外部访问一下
docker run -it --name w1 -p 8080:8080 spring:v4
三.上传镜像与下载镜像
上面我们已经把镜像给创建并且优化了,但是目前这个镜像只可以在我们本地使用,那如果想让别人也使用的话,就必须把已经创建好的镜像上传,这里我就没有选择上传到Docker中了,我是直接讲它上传到阿里云的中。
阿里云
https://www.aliyun.com/
1.点击控制台之后,直接输入容器镜像服务ACR
2.选择实例
3.首次使用需要设置密码
4.将访问凭证在虚拟机中输入
5.创建命名空间
6.创建镜像仓库
7.根据提示上传镜像
(1)给镜像取别名
docker tag d5f0b5db4d01 mydocker:v1
(2)将镜像上传到阿里云的镜像仓库中
docker push registry.cn-hangzhou.aliyuncs.com/wang-huihui/mydocker:v1
(3)查看镜像
推送完成便能够在镜像仓库的镜像版本中进行查看啦
8.下载镜像
docker pull registry.cn-hangzhou.aliyuncs.com/wang-huihui/mydocker:v1
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊
相关文章:
【Docker】Dockerfile构建最小镜像
🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 前言 一.Dockerfile是什么 二.Dock…...
【严重】GitLab 以其他用户身份执行 Slack 命令
漏洞描述 GitLab 是由GitLab公司开发的、基于Git的集成软件开发平台。使用 Slack 命令在 Slack 聊天环境中运行常见的 GitLab 操作。 GitLab 受影响版本中,由于配置Slack/Mattermost 集成时,未正确验证用户身份信息,导致攻击者可以使用其他…...
【卡梅德生物】纳米抗体文库构建
纳米抗体文库构建服务是一项提供定制化纳米抗体文库的服务,旨在满足研究者和生物制药公司对高质量抗体的需求。这项服务通常包括以下主要步骤: 1.抗原设计和制备: -客户提供目标抗原信息,或由服务提供商协助设计抗原。 -抗原制…...
MySQL修炼手册6:子查询入门:在查询中嵌套查询
目录 写在开头1 子查询基础概念1.1 了解子查询的基本概念1.2 子查询与主查询的关系 2 标量子查询详细展开2.1 学会使用标量子查询2.1.1 在SELECT语句中使用2.1.2 在WHERE子句中使用2.1.3 在ORDER BY子句中使用 2.2 标量子查询在条件判断中的应用2.2.1 使用比较运算符2.2.2 使用…...
01章【JAVA开发入门】
计算机基本概念 计算机组成原理 计算机组装 计算机:电子计算机,俗称电脑。是一种能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成,没有安装任何软件的计算机称为裸机。常见的形式有台式计算机、…...
ARM day1
一、概念 ARM可以工作的七种模式用户、系统、快中断、中断、管理、终止、未定义ARM核的寄存器个数 37个32位长的寄存器,当前处理器的模式决定着哪组寄存器可操作,且任何模式都可以存取: PC(program counter程序计数器) CPSR(current program…...
ImageNet Classification with Deep Convolutional 论文笔记
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池
在 Spring 中,Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时,该方法将在单独的线程中执行,而不会阻塞当前线程。这使得方法可以在后台执行,而不会影响主线程的执行。 在您提供的代码示例中,a1() 和…...
自动化理论基础(2)—开发语言之Python
一、知识汇总 掌握 Python 编程语言需要具备一定的基础知识和技能,特别是对于从事自动化测试等领域的工程师。以下是掌握 Python 的一些关键方面: 基本语法: 理解 Python 的基本语法,包括变量、数据类型、运算符、条件语句、循环…...
Spark算子(RDD)超细致讲解
SPARK算子(RDD)超细致讲解 map,flatmap,sortBykey, reduceBykey,groupBykey,Mapvalues,filter,distinct,sortBy,groupBy共10个转换算子 (一)转换算子 1、map from pyspark import SparkContext# 创建SparkContext对象 sc Spark…...
转盘寿司(100%用例)C卷 (JavaPythonC++Node.jsC语言)
寿司店周年庆,正在举办优惠活动回馈新老客户。 寿司转盘上总共有n盘寿司,prices[i]是第i盘寿司的价格,如果客户选择了第i盘寿司,寿司店免费赠送客户距离,第i盘寿司最近的下一盘寿司i,前提是prices[j]< prices[i],如果没有满足条件的j,则不赠送寿司。 每个价格的寿司都…...
【python】搭配Miniconda使用VSCode
现在的spyder总是运行出错,启动不了,尝试使用VSCode。 一、在VSCode中使用Miniconda管理的Python环境,可以按照以下步骤进行: a. 确保Miniconda环境已经安装并且正确配置。 b. 打开VSCode,安装Python扩展。 打开VS…...
从购买服务器到部署前端VUE项目
购买 选择阿里云服务器,地址:https://ecs.console.aliyun.com/home。学生会送一个300的满减券,我买了一个400多一年的,用券之后100多点。 使用SSH连接服务器 我选择的是vscode 中SSH工具。 安装一个插件 找到配置文件配置一下…...
python中print函数的用法
在 Python 中,print() 函数是用于输出信息到控制台的内置函数。它可以将文本、变量、表达式等内容打印出来,方便程序员进行调试和查看结果。print() 函数的基本语法如下: ``` print(*objects, sep= , end=\n, file=sys.stdout, flush=False) ``` 其中,objects 是要打印…...
SpringBoot整合MyBatis项目进行CRUD操作项目示例
文章目录 SpringBoot整合MyBatis项目进行CRUD操作项目示例1.1.需求分析1.2.创建工程1.3.pom.xml1.4.application.properties1.5.启动类 2.添加用户2.1.数据表设计2.2.pojo2.3.mapper2.4.service2.5.junit2.6.controller2.7.thymeleaf2.8.测试 3.查询用户3.1.mapper3.2.service3…...
Android Studio下载gradle反复失败
我的版本:gradle-5.1.1 首先检查设置路径是否正确,参考我的修改! 解决方案 1.手动下载Gradle.bin Gradle Distributions 下载地址 注意根据编译器提示下载,我这要求下载的是bin 而不是all 2.把下载好的整个压缩包放在C:\Users\…...
【HTML5】 canvas 绘制图形
文章目录 一、基本用法二、用法详见2.0、方法属性2.1、绘制线条2.2、绘制矩形2.3、绘制圆形2.4、绘制文本2.5、填充图像 一、基本用法 canvas 标签:可用于在网页上绘制图形(使用 JavaScript 在网页上绘制图像)画布是一个矩形区域,…...
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 目录 堆排序 第一种 编辑 第二种 …...
通过浏览器判断是否安装APP
场景 求在分享出来的h5页面中,有一个立即打开的按钮,如果本地安装了我们的app,那么点击就直接唤本地app,如果没有安装,则跳转到下载。 移动端 判断本地是否安装了app 首先我们可以确认的是,在浏览器中无…...
vivado Revision Control
2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html Using Vivado Design Suite with Revision Control https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html http://www.xi…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

































