Docker镜像构建优化及上传

news2024/10/5 18:28:10

前言

Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使
Dockerfile 去构建镜像好比使用 pom 去构建 maven 项目一样,有异曲同工之妙

一.Dockerfile镜像构建

1.Dockerfile基本结构

Dockerfile 是一个包含一组指令的文本文件,用于告诉 Docker 如何构建一个镜像

Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令 

  1. 基础镜像指令 (FROM): 指定构建过程中使用的基础镜像。

    FROM centos:latest
  2. 维护者信息指令 (MAINTAINER) [已过时]: 指定镜像的作者和联系方式。现在更推荐使用标签方式,例如

    MAINTAINER Your Name <your-email@example.com>
  3. 工作目录指令 (WORKDIR): 设置后续指令的工作目录。

    WORKDIR /app
  4. 复制文件指令 (COPY): 将本地文件复制到镜像中的指定路径。

    COPY . /app
  5. 添加文件指令 (ADD): 类似于 COPY,但支持更多功能,例如远程文件、URL 自动解压缩等。

    ADD https://example.com/file.tar.gz /app/
    
  6. 运行命令指令 (RUN): 在镜像中执行命令,通常用于安装软件包、设置环境等。

    RUN apt-get update && apt-get install -y python3
    
  7. 暴露端口指令 (EXPOSE): 声明容器将在运行时监听的端口。

    EXPOSE 80
  8. 环境变量指令 (ENV): 设置环境变量,用于配置容器的运行时行为。

    ENV DATABASE_URL="mysql://user:password@localhost/db"
  9. 容器启动命令指令 (CMD or ENTRYPOINT): 定义容器启动时执行的默认命令。

    CMD ["python", "app.py"]

    或者使用 ENTRYPOINT

    ENTRYPOINT ["python", "app.py"]
  10. 标签指令 (LABEL): 添加元数据标签到镜像,例如版本信息、作者、描述等。

    LABEL version="1.0" \ description="My custom image" \ maintainer="your-email@example.com"

2.基础镜像构建

1.编写基础镜像文件

首先创建一个工作目录文件夹并进入

mkdir software
cd software

 在当前目录下编写dockerfile文件(注:名字不能更改,当前操作为编写并创建dockerfile文件)

vim dockerfile

将以下基础信息编写到dockerfile中

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test

命令详解:From为基础镜像,MAINTAINER为联系者信息,后面的2187...可自行更改,WORKDIR为工作目录,COPY spring.jar /test是将当前目录下的spring.jar(已开发完的项目模块)复制到镜像中 

2.根据当前路径的Dockerfile文件构建镜像

docker build -t spring:v1 .

解析:

docker build 镜像构建

-t spring 为当前镜像命名(spring)

v1 版本号

. 当前路径

当出现Building Finished时说明构建成功了 

创建并运行新的容器

docker run -it 容器名:版本号

示例

docker run -it spring:v1

3.构建携带JDK镜像

将jdk上传到当前工作目录

 将以下命令替换Dockerfile文件的内容

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test
ADD jdk-8u221-linux-x64.tar.gz /test
ENV JAVA_HOME=/test/jdk1.8.0_221
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH

 然后重新执行命令构建镜像

docker build -t spring:v2 .

 创建并运行容器

docker run -it spring:v2

 验证jdk是否安装成功,在当前容器中执行以下命令

echo $JAVA_HOME

出现jdk路径时说明安装成功

 4.构建一个创建后自动运行项目的镜像

和上面的操作一样,将Dockerfile文件进行更改,构建镜像然后创建运行容器,当容器运行后,容器中的项目也会跟着运行,不过这里需要注意的是spring.jar为当前项目,根据实际情况替换为自己的项目,

在运行创建新的容器时记得要将容器名进行更改防止重名

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test
ADD jdk-8u221-linux-x64.tar.gz /test
ENV JAVA_HOME=/test/jdk1.8.0_221
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
CMD  java -jar spring.jar

二.镜像优化

优化思路:

1.在上面的构建镜像时可以看到,每一个模块都需要去携带JDK,但是由于jdk的空间占用量过于庞大,当我们的模块数量变多时,对于我们的服务器资源消耗也是巨大的,所以我们采取另一种方案,对于JDK而言,我们更多的是能利用到它是在代码编写方面,但是在服务器中我们并不需要对其进行一个代码编写,而我们运行项目时可以只需要用到JRE,JRE相对于JDK空间占用量就小很多了,可以很好地节省我们的服务器资源

2.替换更加实用且更简洁的镜像文件(将centos替换成jeanblanchard/alpine-glibc)

1.构建携带JRE版本镜像

 1.将jre压缩包上传到当前目录

2.替换Dockerfile文件 

From jeanblanchard/alpine-glibc
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test
ADD jre-8u391-linux-x64.tar.gz /test
ENV JAVA_HOME=/test/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

3. 执行命令构建镜像

docker build -t spring:v6 .

2.对比所有镜像

对比所有镜像,明显不同版本的所需容量不同,可以节省很多服务器资源 

三.镜像上传

以实际实施情况为例,当我们需要给客户安装镜像时,有时我们会采用镜像仓库的方式去对客户进行安装,那么我们就需要将我们提前准备好的镜像上传到仓库中

这里以阿里云为例

 容器镜像服务 (aliyun.com)icon-default.png?t=N7T8https://cr.console.aliyun.com/cn-heyuan/instance/credentials

根据链接 进入到阿里云镜像服务,因为隐私原因,所以使用个人版进行演示

注意:提前设置一个固定密码

我们进入到访问凭证中,复制当前命令到虚拟机中进行一个登录

执行命令后填写密码,当出现Loin Succeed说明登录成功

 然后重新回到阿里云创建命名空间

然后去根据命名空间创建我们的仓库 

创建仓库时我们可以选择不同的仓库例如github、本地仓库等等,这里我们选择本地仓库

 根据官方为我们提供的方法为我们原本存在的镜像取一个别名并创建

 我们输入命令 docker images 查看我们所有镜像的images_id

将我们所需要上传的镜像id对下面的命令镜像替换,版本号默认输入v1(注意要把中括号一起替换掉)

docker tag [ImageId] registry.cn-heyuan.aliyuncs.com/medical_yu/outpatient:[镜像版本号]

执行完成后我们可以继续查看我们的镜像,就会新生成一个以阿里云规则命名的镜像

然后执行命令准备开始进行推送

docker push 镜像名:版本号

示例

docker push registry.cn-heyuan.aliyuncs.com/medical_yu/outpatient:v1

 点击阿里云镜像版本,可以看到我们推送的镜像

镜像拉取

docker pull镜像名:版本号

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

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

相关文章

【教学类-43-21】20240113 数独(三)11-12-13-14-15宫格 无空行A4模板 上下结构(附加3宫格 4宫格)

作品展示&#xff1a; 11-15宫格 A4 两份 下面空行做一点4-5宫格题目 &#xff1a; 已经制作没有分割线的连在一起的3-10宫格模板 【教学类-43-19】20240113 数独&#xff08;一&#xff09; 3-5-6-7-8-10宫格 无空行A4模板-CSDN博客文章浏览阅读399次&#xff0c;点赞13次…

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…

Python中执行定时任务详细教程与示例代码

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 定时任务是自动化执行的一种方式&#xff0c;它可以在指定的时间间隔或特定时间点运行Python代码。无论是自动化数据备份、定期清理文件还是其他周期性任务&#xff0c;Python都提供了多种方式来执行定时任务。本…

Java实现天然气工程运维系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

2023 China DevOpsDays(DOD) DXCon 国际数字化转型与创新管理企业峰会:核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;数字化转型已成为企业持续发展的必经之路。2023年的China DevOpsDays & DXCon国际数字化转型与创新管理企业峰会&#xff0c;汇集了业界顶尖的专家、学者和企业领袖&#xff0c;共同探讨数字化转型的最新趋势和实践。本文将深入剖析大会的核…

MySQl导入与导出远程备份

文章目录 一. navicat导入导出 二. mysqldump命令导入导出导入导出 三. load data infile命令导入导出导入导出 四. 远程备份导入导出思维导图 一. navicat 导入 右键——>运行SQL文件 导出 选中要导出的表➡右键➡转储SQL文件➡数据和结构 二. mysqldump命令导入导出…

QTabelView使用代理自定义,第一列为QLabel第二列为下拉框

预览界面 代理源文件 CustomParamViewDelegate.cpp #include "CustomParamViewDelegate.h"CustomParamViewDelegate::CustomParamViewDelegate(QObject *parent): QStyledItemDelegate(parent) {}CustomParamViewDelegate::~CustomParamViewDelegate() {}QWidget* …

postgresql16 物理复制与逻辑复制的实现和对比

本文面向想要练习 PostgreSQL 中数据库复制基础知识但可能无法访问远程服务器的初学者。我认为学习新技术时&#xff0c;在自己的机器上运行示例以巩固概念是至关重要的。对于副本来说&#xff0c;这可能很困难&#xff0c;因为许多可用的资源假设用户具有一定的 PostgreSQL 经…

快乐学Python,如何使用爬虫从网页中提取感兴趣的内容?

前面的内容&#xff0c;我们了解了使用urllib3和selenium来下载网页&#xff0c;但下载下来的是整个网页的内容&#xff0c;那我们又怎么从下载下来的网页中提取我们自己感兴趣的内容呢&#xff1f;这里就需要Python的另一个库来实现-BeautifulSoup。 BeautifulSoup 是一个 Py…

【Py/Java/C++三种语言详解】LeetCode每日一题240115【链表】LeetCode82、删除排序链表中的重复节点II

文章目录 题目链接题目描述解题思路代码pythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode82、删除排序链表中的重复节点II 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不…

Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知&#xff0c;Java类的相关信息都是存储在元空间中的&#xff0c;但是是怎么存储的&#xff0c;相信很多读者是不清楚的&#xff0c;这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…

容器化postgres备份策略

文章目录 1. 策略和背景1.1 背景1.2 备份策略 2. docker-compose的修改2.1 挂载备份目录2.2 备份脚本3.3 重启容器 3. 定时任务 1. 策略和背景 1.1 背景 使用docker-compose管理的postgres数据库需要备份工作目录在 /data/postgres下 1.2 备份策略 要备份的库 shu_han 库 每…

vue3中组合式api的常用方法

vue3中组合式api的常用方法 记录一下vue3中常用的组合式api&#xff0c;包括计算属性computed、监听器watch及watchEffective 一、computed 作用&#xff1a;根据已有数据计算出新数据&#xff08;和Vue2中的computed作用一致&#xff09;。 <template><div class&…

JavaScript 异步编程解决方案-中篇

天下事有难易乎&#xff1f; 为之&#xff0c;则难者亦易矣&#xff1b;不为&#xff0c; 则易者亦难矣。人之为学有难易乎&#xff1f; 学之&#xff0c;则难者亦易矣&#xff1b;不学&#xff0c;则易者亦难矣。 async 函数 和promise then的规则一样 async function fun() …

HarmonyOS4.0——ArkUI应用说明

一、ArkUI框架简介 ArkUI开发框架是方舟开发框架的简称&#xff0c;它是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发框架&#xff0c;它使用极简的UI信息语法、丰富的UI组件以及实时界面语言工具&#xff0c;帮助开发者提升应用界面开发效率 30%&#xff0c;开发…

element + table 每两行对比相同值列合并

在开始之前先要明确几个概念&#xff1a; 保持不变&#xff1a;{ rowspan: 1, colspan: 1 } 删除一个单元格&#xff1a;{ rowspan: 0, colspan: 0 } 合并一个单元格&#xff1a;{ rowspan: 2, colspan: 1 } <template><div><el-table:data"tableData&quo…

二叉树的遍历 Java

二叉树的遍历 递归法前序遍历中序遍历后序遍历改进 迭代法前序、后序遍历中序遍历 Java 中 null、NULL、nullptr 区别 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, Tree…

LLM推理部署(七):FireAttention——通过无损量化比vLLM快4倍

Mixtral作为第一个在数万亿tokens上训练的OSS模型&#xff0c;最近在人工智能社区掀起了波澜&#xff0c;它支持“混合专家”&#xff08;MoE&#xff09;&#xff0c;并且训练和推理速度非常快。 Fireworks AI是第一个托管Mixtral的平台&#xff0c;在Mixtral公开发布之前就托…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音识别(一)

官方文档链接&#xff1a;https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件&#xff0c;目前该插件仅认证后的小程序。 语音识别…

༺༽༾ཊ—游戏-01_2D-开发—ཏ༿༼༻

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…