Docker镜像构建优化及上传

前言

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镜像名:版本号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库知识汇总之MySQL

目录 MySQL数据库特点MySQL下载MySQL配置文件初始化MySQL配置安装MySQL服务 启动MySQL服务登录数据库修改数据库登录密码MySQL错误代码1130 MySQL数据库特点 MySQL是一个开源关系型数据库管理系统(RDBMS)&#xff0c;由Oracle公司维护和开发。它使用SQL语言进行数据库管理和操…

Linux下安装Mysql8.0版本【保姆级】

&#x1f95a;今日鸡汤&#x1f95a; 等风来&#xff0c;不如追风去。 ——《一禅小和尚》 目录 &#x1f37f;1.Linux查看glibc版本 &#x1f9c2;2.mysql下载 &#x1f9c8;3.上传到指定目录 &#x1f953;4.解压并操作 &#x1f32d;5.启动mysql 1.Linux查看glibc版本…

腾讯实验平台基于 StarRocks 构建湖仓底座

作者&#xff1a; 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年&#xff0c;腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …

常用文件文档能做二维码吗?多种文件在线做二维码的方法

二维码是现在工作和生活中随处可见&#xff0c;可以用来展现很多不同的内容。现在很多下发通知的文件、教程或者其他文件内容&#xff0c;也会制作成二维码图片后&#xff0c;让其他人通过扫码来获取文件内容。最简单的制作方法就是通过二维码生成器来制作&#xff0c;支持多种…

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

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

#AIGC##VDB# 【一篇入门VDB】矢量数据库-从技术介绍到选型方向

文章概览&#xff1a; 这篇文章深入探讨了矢量数据库的基本概念、工作原理以及在人工智能领域的广泛应用。 首先&#xff0c;文章解释了矢量的数学和物理学概念&#xff0c;然后引入了矢量在数据科学和机器学习中的应用。随后&#xff0c;详细介绍了什么是矢量数据库&#xff0…

【unity学习笔记】语音驱动blendershape

1.导入插件 https://assetstore.unity.com/packages/tools/animation/salsa-lipsync-suite-148442 1.选择小人&#xff0c;点击添加组件 分别加入组件&#xff1a; SALSA EmoteR Eyes Queue Processor&#xff08;必须加此脚本&#xff09;&#xff1a;控制前三个组件的脚本。…

基于深度学习的桃子熟度与大小智能检测

基于深度学习的桃子熟度与大小智能检测 基于深度学习的桃子熟度与大小智能检测引言1. 环境搭建与准备2. 数据准备3. 模型准备4. 训练准备5. 服务器端部署结语 基于深度学习的桃子熟度与大小智能检测 引言 随着时代的快速发展&#xff0c;人工智能时代为中国农业带来了新的机遇…

idea修改pom.xml没有重新导入maven的按钮

问题描述&#xff1a; IDEA修改pom.xml配置以后&#xff0c;不会展示 Load Maven Changes弹窗。 解决方法&#xff1a; 方式一、pom.xml右键&#xff0c;Maven--Run Maven--Reimport。但我感觉这个太麻烦了。 方式2、选择Building Tool Settings&#xff0c;点击Auto-Reload …

python -- str 字符串相减

从一个字符串中减去另一个字符串&#xff0c;得到一个新的字符串结果 replace() 方法 host_ip hello world host world ip host_ip.replace(host, "") print(ip)re.sub() 方法 import rehost_ip hello world host world ip re.sub(host, "", host_…

IDEA 启动错误提示:Command line is too long. Shorten command line

IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line Command line is too long. Shorten command line IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line快速修改原因解释 快速修改 Edit Configurations->configu…

IPv6路由综合运用

一、基础配置: SWA: sw1(config)#host swA swA(config)#ipv6 ena swA(config)# vlan 100 swA(config-vlan100)#int vlan 100 swA(config-if-vlan100)#ipv6 ena swA(config-vlan100)#ip add 172.16.1.1 255.255.255.252 swA(config-if-vlan100)#int e1/0/24 swA(conf…

C函数详解 | 函数的作用、定义与声明、函数的调用、函数与指针

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…

远程访问及控制

文章目录 远程访问及控制一、SSH远程管理1、SSH&#xff08;Secure Shell&#xff09;协议定义2、SSH的优点3、OpenSSHell 二、配置OpenSSH服务端1、sshd_config配置文件的常用选项2、sshd服务支持的两种验证方式2.1 密码验证2.2 秘钥对验证 三、SSH客户端程序的使用1、基本用法…

C# OpenCvSharp DNN 部署yolov3目标检测

目录 效果 yolov3.cfg 项目 代码 下载 C# OpenCvSharp DNN 部署yolov3目标检测 效果 yolov3.cfg [net] # Testing #batch1 #subdivisions1 # Training batch16 subdivisions1 width416 height416 channels3 momentum0.9 decay0.0005 angle0 saturation 1.5 exposure 1…

User-Agent(用户代理)是什么?

User-Agent&#xff08;用户代理&#xff09;是什么&#xff1f; User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客…

【Web】什么是 XSS 攻击,如何避免?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 常见方法&#xff1a; 结语 我的其他博客 前言 在当今数字化时代&#xff0c;网络安全成为信息技术领域中的一项至关重要的任务。X…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题&#xff1a;Mac 使用命令下载nvm 成功后执行 nvm -v 查看&#xff0c;报错&#xff1a;nvm command not found 2、原因&#xff1a;可能是系统更新后&#xff0c;默认的 shell 是 zsh&#xff0c;所以找不到配置文件 3、解决&#xff1a;可添加编辑.bash_profile 和 …

WebStom中代码美化工具prettier的配置

如果你的项目使用到了prettier代码美化工具之后&#xff0c;使用ctrlaltL调整代码格式的时候会发现&#xff0c;代码没有被正确格式化&#xff0c;这是因为prettier代码美化工具没有设置格式化vue代码的设置。在下面中的run for files的括号里面加上vue即可 最后一步就是确保es…