【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中了,我是直接讲它上传到阿里云的中。

阿里云icon-default.png?t=N7T8https://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

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】队列+bfs算法 解决树的相关算法题(C++)

文章目录 1. 前言2. 算法题429.N叉树的层序遍历103.二叉树的锯齿形层序遍历662.二叉树最大宽度515.在每个树行中找最大值 1. 前言 队列 与 宽度优先算法(BFS)是解决很多算法问题的常见工具。 BFS通过逐层遍历图或树的节点来寻找解决问题的最短路径或最…

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载

前言:经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参, 例如日常开发中 我们使用Objects.equals去比较 status(入参),statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() ,再比…

C++ 多条件比较的几种实现方式

文章目录 1 sort()使用自定义比较器1.1 在类内部定义比较器 -- 声明为静态成员函数1.2 在函数内部定义比较器 -- lamda表达式1.3 全局函数比较器 2 重载运算符<2.1 在结构体中重载运算符<2.2 在类中重载运算符< 3 重写仿函数bool operator()4 使用pair排序5 priority_…

IPO:动力电池行业变天,不生产电芯的幂源科技为何也要卷?

幂源科技的真正角色&#xff0c;是月老&#xff1f; 最近&#xff0c;动力电池正处于市场重构阶段。一边是供给端动力电池产能过剩&#xff0c;一边是需求端新能源车企加码电池自研。供需不匹配孕育出了新机遇&#xff0c;产业链的连接者与赋能者成为市场所需。而幂源科技控股…

学生用台灯哪个品牌比较好?口碑最好的护眼台灯推荐

台灯是现在很多朋友都在使用的照明灯具&#xff0c;对于晚上工作学习、看书休闲都有很大的裨益&#xff0c;但是选择台灯也注重护眼效果&#xff0c;在此基础上才是讨论性价比的问题&#xff0c;如果光线让人眼不舒适&#xff0c;那么多便宜的台灯都不划算。 ● 怎样的护眼台灯…

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:FPGA 实现UDP万兆以太网的速度测试 1 代码结构 2 硬件需求 SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。 3 Xilinx IP 10 Gigabit Ethernet Subsystem IP说明 文章链接: Xilinx IP 10 Gigabit Ethernet Subsystem IP 4 E…

Vue3响应式系统(二)

Vue3响应式系统(一)https://blog.csdn.net/qq_55806761/article/details/135587077 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢&#xff1f;听我娓娓道来。 就用Vue.js来说吧&#xff0c;Vue.js的渲染函数就是在effect中执行的&#xff1a; /*Foo组件*/ const…

循环神经网络的变体模型-LSTM、GRU

一.LSTM&#xff08;长短时记忆网络&#xff09; 1.1基本介绍 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种深度学习模型&#xff0c;属于循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的一种变体。…

Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)

Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…

HCIA的路由协议

动态路由协议/静态路由协议 静态路由协议和动态路由协议的区别&#xff1a; 静态路由协议的缺点&#xff1a; 配置繁琐 针对拓扑的变化不能够自动收敛 只适用于小型网络 静态路由协议优点&#xff1a; 占用资源少 安全 稳定 动态路由协议的优点&#xff1a; 配置简单 针对拓…

前端项目配置 Dockerfile 打包后镜像部署无法访问

Dockerfile 配置如下&#xff1a; FROM node:lts-alpineWORKDIR /app COPY . . RUN npm install RUN npm run buildEXPOSE 3001CMD ["npm", "run", "preview"]构建镜像 docker build -t vite-clarity-project .启动镜像容器 docker run -p 30…

进程(一) 进程概念

文章目录 什么是进程呢&#xff1f; 描述进程-PCBtask_struct-PCB的一种task_struct内容分类 查看进程通过系统目录查看通过ps命令查看通过系统调用获取进程的PID和PPID通过系统调用创建进程- fork&#xff08;&#xff09;函数 fork()函数fork函数做了什么&#xff1f;fork之后…

Vue加载序列帧动图

解读方法 使用<img :src"currentFrame" alt"加载中" /> 加载图片动态更改src的值使用 requestAnimationFrame 定时更新在需要的页面调用封装的组件 <LoadToast v-if"showLoading" /> 封装组件 <template><div class"…

CTF CRYPTO 密码学-1

题目名称&#xff1a;enc 题目描述&#xff1a; 压缩包中含两个文件&#xff1a;一个秘钥d.dec&#xff0c;一个密文flag.enc 解题过程&#xff1a; Step1&#xff1a;这题是一个解密他题目&#xff0c;尝试openssl去ras解密 工具简介 在Kali Linux系统中&#xff0c;openss…

React16源码: React中的异步调度scheduler模块的源码实现

React Scheduler 1 ) 概述 react当中的异步调度&#xff0c;称为 React Scheduler发布成单独的一个 npm 包就叫做 scheduler这个包它做了什么&#xff1f; A. 首先它维护时间片B. 然后模拟 requestIdleCallback 这个API 因为现在浏览器的支持不是特别的多所以在浏览当中只是去…

【计算机图形学】习题课:Viewing

【计算机图形学】Viewing 部分问题与解答 CS100433 Computer Graphics Assignment 21 Proof the composed transformations defined in global coordinate frame is equivalent to the composed transformations defined in local coordinate frame but in different composing…

1月14-17日为技术测试期!字节与腾讯上演“大和解”,抖音全面开放《王者荣耀》直播

综合整理&#xff5c;TesterHome社区 来源&#xff5c;《王者荣耀》官方、界面新闻 北京商报、IT之家 1月13日&#xff0c;腾讯游戏《王者荣耀》官方微博发布消息宣布&#xff0c;从1月21日起&#xff0c;《王者荣耀》抖音直播将全面开放。 为了筛查开播期间可能遇到的所有技…

几何_直线方程 Ax + By + C = 0 的系数A,B,C几何含义是?

参考&#xff1a; 直线方程 Ax By C 0 的系数A&#xff0c;B&#xff0c;C有什么几何含义&#xff1f;_设直线 l 的方程为axbyc0 怎么理解-CSDN博客 1. A B的含义&#xff1a;组成一个与直线垂直的向量 我们先来看A和B有什么含义。 在直线上取任意两点 P1:&#xff08;x1…

OceanBase集群部署

我认为学习一个中间件比较好的方式是&#xff0c;先了解它的架构和运行原理&#xff0c;然后动手部署一遍&#xff0c;加深对它的了解&#xff0c;再使用它&#xff0c;最后进行总结和分享 本篇介绍OceanBase部署前提配置和集群部署 1.使用开源免费的社区版&#xff0c;企业版…

[Android] Android架构体系(1)

文章目录 Android 的框架Dalvik 虚拟机JNI原生二进制可执行文件Android NDK中的binutils Bionic谷歌考虑到的版权问题Bionic与传统的C标准库&#xff08;如glibc&#xff09;的一些不同 参考 Android 的框架 Android 取得成功的关键因素之一就是它丰富的框架集。 没有这些框架…