手搓Docker-Image-Creator(DIC)工具(03):实现alpine+jre的镜像

此篇博客将介绍如何使用 Docker 创建一个alpine3.10-jre1.8.0_401 的 Docker 镜像,并使用 Docker 运行起来。将用到 Dockerfile 的 COPY 命令、RUN 命令、ENV 命令,最终实现基于单一应用的 Dockerfile 构建镜像和运行。

紧急修改:代码我是在macOS下调试的,突然想到 Windows 调试的问题,刚测试了一下,使用 Windows 版本的 Git Bash 是没有问题的,使用效果和 macOS 终端基本一样。Git Bash 下载在文末附上。

1 关于 Alpine 镜像

alpine 是一个极简单的 Linux 系统,官网地址为:https://alpinelinux.org。

在这里插入图片描述

图1 Alpine Linux 官网 Banner

从上图可以看到,Alpine Linux是一个基于musl-libc和busybox的面向安全的轻量级Linux发行版。主打的理念是:体积小、功能简洁、安全。后续我们的很多镜像都是基于 Alpine Linux。

下面将一步步来搭建单一应用的 Docker 镜像。

2 下载相关资源

将相关用到的资源下载下来,方便快速构建镜像。

2.1 创建应用目录

作为一个基于 apline3.10 和 jre1.8.0_401 的 Docker 镜像示例,我们就直接创建一个目录 alpine3.10-jre1.8.0_401 ,作为应用的根目录,用于存放单个应用的 Dockerfile 文件,以及用于编译生成镜像和验证的 shell 脚本文件。

2.2 下载 jre1.8.0_401 的运行包

包下载地址:https://www.java.com/en/download/manual.jsp
在这里插入图片描述

图2 jre1.8.0_401 下载入口

下载的文件名为:jre-8u401-linux-x64.tar.gz,解压后的文件夹放到应用根目录 alpine3.10-jre1.8.0_401 中。

目录路径为:alpine3.10-jre1.8.0_401/jre1.8.0_401

2.3 下载 glibc 安装包

由于 alpine 是基于 musl-libc 的,所以需要将 glibc 安装到 alpine 中。包下载地址:

glibc-2.29-r0.apk

glibc-bin-2.29-r0.apk

glibc-i18n-2.29-r0.apk

下载的三个文件都放到 alpine3.10-jre1.8.0_401/glibc 下,便于统一操作。

最终形成的资源包目录如下:

在这里插入图片描述

图3 资源包目录位置

3 编写 Dockerfile 文件

# Dockerfile
# 导入的镜像源
FROM alpine:3.10

# 作者 LABEL
LABEL maintainer="tanbushi@qq.com"

# 设置工作目录
WORKDIR /opt/app

# 更新源
RUN apk update && apk upgrade

# 拷贝 jre 到镜像中
COPY jre1.8.0_401 /opt/app/jre1.8.0_401/

# 拷贝 glibc 到镜像中
COPY glibc /opt/app/glibc/

# 安装glibc
RUN apk --no-cache add ca-certificates wget 
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
RUN apk add /opt/app/glibc/glibc-2.29-r0.apk
RUN apk add /opt/app/glibc/glibc-bin-2.29-r0.apk
RUN apk add /opt/app/glibc/glibc-i18n-2.29-r0.apk

# 删除 缓存文件及 glibc
RUN rm -rf /var/cache/apk/* /opt/app/glibc

# 配置环境变量
ENV JAVA_HOME=/opt/app/jre1.8.0_401
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH

4 编写并运行脚本 build.sh 和 run.sh

4.1 build.sh

build.sh 用来编译生成 Docker 镜像的脚本,脚本内容如下:

#!/bin/bash

# 将当前应用根目录中的 Dockerfile 文件编译生成 Docker 镜像,镜像名为 alpine3.10-jre1.8.0_401
docker build -t alpine3.10-jre1.8.0_401 .(再提醒一下注意最后的点“.”)

通过 Docker 桌面版,可以看到 images 里面多了一个 alpine3.10-jre1.8.0_401 镜像。

4.2 run.sh

run.sh 用来运行 Docker 镜像的脚本,脚本内容如下:

#!/bin/bash
docker run -it --name alpine3.10-jre1.8.0_401 alpine3.10-jre1.8.0_401

通过 Docker 桌面版,可以看到 containers 里面多了一个 alpine3.10-jre1.8.0_401 容器,并且容器状态为 running。

4.3 验证镜像内容

Docker 桌面端打开容器 alpine3.10-jre1.8.0_401 ,进入容器。

  • 检查文件夹

可以看到 jre1.8.0_401 文件夹,说明镜像已经成功拷贝了 jre1.8.0_401 文件夹,没有看到 glibc 文件夹,说明该文件夹已成功删除。

在这里插入图片描述

图4 容器里的文件改动情况

  • 检查 java 命令

执行 java -version 命令,可以看到 java 版本为 1.8.0_401。

在这里插入图片描述

图5 执行j ava 成功

验证了基于 alpine3.10 和 jre1.8.0_401 的 Docker 镜像已经创建成功。

5 思考:

尽管上述示例已成功展示了如何借助 Dockerfile 创建满足基本需求的 Docker 镜像,但仍存在以下几个值得改进之处:

  • 内容管理细化:观察实例可知,镜像内部分内容(例如 /opt/app/jre1.8.0_401 等持久化运行环境)需永久保留,而另一部分如安装包(如 /opt/app/glibc)则在安装后即可移除。因此,区分并合理管理这两类不同性质的内容对于提升镜像管理效率至关重要。

  • 构建与运行脚本标准化:虽然建议采用 build.shrun.sh 这样的统一脚本来构建和运行镜像,但在脚本中直接硬编码镜像名称和容器名称会降低脚本的通用性。为此,在处理多个镜像构建场景时,引入配置文件以分离此类变量,从而提高脚本复用率。

  • 资源管理增强:尽管目前主要依赖 Dockerfile 来进行镜像内容编排,然而面对大量镜像管理的需求时,发现资源文件的管理更为关键。有必要设计一种统一且灵活的资源管理机制,如通过配置文件、定制化脚本或命令行参数等方式来简化管理流程。

  • 镜像版本控制及自动化:当用户的资源库规模逐渐庞大、镜像数量激增时,镜像版本管理变得不可或缺。仅依靠 shell 脚本手动管理可能无法满足复杂项目的实际需求,此时应当探索通过组织镜像内容结构、动态生成 Dockerfile 等方法实现自动化管理,以适应更高级别的项目管理要求。

请注意,本系列文章着重于个人日常学习的实践与记录,故在内容深度和广度上可能并不全面,但力求真实展现学习过程与实践经验。

接下来的篇章中,我将着手按照已介绍的架构规范,逐步展示如何构建一个用于多个应用共享资源的 Docker 镜像库。这一系列操作实操性极强,请保持关注,敬请期待!

附加说明:
Git 官网:https://git-scm.com/
Windows Git 下载页面:https://git-scm.com/download/win
下载安装后,会产生5个快捷方式,一般只使用 Git Bash 就可以了。


上一篇:手搓 Docker Image Creator(DIC)工具(02):预备知识

下一篇:手搓Docker-Image-Creator(DIC)工具(04):DIC的代码实现


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

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

相关文章

python笔记(9)Dictionary(字典)

目录 创建字典 取值 修改字典 删除 内置函数和方法 创建字典 字典键值和value用:隔开,键值是不可变的,而且必须是唯一的,值可以变,可以是任意类型 dict {key1 : value1, key2 : value2 } 1)不允许同…

【C语言】“vid”Microsoft Visual Studio安装及应用(检验内存泄露)

文章目录 前言安装包获取配置VLD完成 前言 我们在写代码时往往容易存在内存泄漏的情况,所以存在这样一个名为VLD的工具用来检验内存泄漏,现在我来教大家安装一下 安装包获取 vld下载网址:https://github.com/KindDragon/vld/releases/tag/…

mysql中主键索引和联合索引的原理解析

mysql中主键索引和联合索引的原理解析 一、主键索引二、什么是联合索引? 对应的B树是如何生成的?1、建立索引方式2、什么是最左前缀原则?3、回表4、为什么要遵守最左前缀原则才能利用到索引?5、什么是覆盖索引?6、索引扫描底层原理7、order by为什么会导致索引消失&#x…

vue3和vue2项目中如何根据不同的环境配置基地址?

在不同环境下取出的变量的值是不同的, 像这样的变量称为环境变量 为什么要使用环境变量呢? 开发环境生产环境下的接口地址有可能是不一样的,所以我们需要根据环境去配置不同的接口基地址 1、vue2环境变量配置 在根目录创建:.env.development和.env.p…

RTPS协议概述

一.RTPS协议概述 RTPS协议主要由四个部分组成: 1.发现模块(Discovery) ​ 发现模块是定义了RTPS的参与者(Participant)获取其他RTPS的参与者(Participant),端点(Endpo…

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592,做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题,可以正常使用。 如果接入某些特定方案的USB Hub(例如GL3510、GL3520),可能会出现以下2种情况&#xf…

C# MES通信从入门到精通(9)——c#使用visual studio2019社区版部署webservice服务

前言 在上位机软件开发领域,我们经常使用调用webservice接口来和mes系统进行交互,我们在开发Mes程序之前也可以自己先模拟发布客户的webservice接口进行调用从而加快软件开发进度,本文就是详细介绍如何自己发布webservice接口。 1、创建 参考这篇博文:webservice服务创建…

【MYSQL进阶篇】详细版MYSQL优化

Mysql优化,让你彻底知道优化的各种情况以及解决方案 有一系列的代码和图片让你一步一步走,成为索引的真正实践者 坚持看完这篇文章,会让你功力瞬间提升一个档次 制作不易,觉得不错请点赞收藏 &#xff01…

java——文件上传

一、文件上传——简介 文件上传的简介:文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中,文件上传通常指的是将用户通过 Web 页面提交的文件(如图像、文档、音频、视频等)传输到服务器…

包子凑数【蓝桥杯】/完全背包

包子凑数 完全背包 完全背包问题和01背包的区别就是,完全背包问题每一个物品能取无限次。 思路:当n个数的最大公约数不为1,即不互质时,有无限多个凑不出来的,即n个数都可以表示成kn,k为常数且不为1。当n个…

DFS序列

什么是DFS序 DFS序是指对一棵树进行DFS时,每个节点被访问到的顺序。DFS序分成两个部分:进入该节点的顺序和退出该节点的顺序。 如何求DFS序 对于DFS中当前节点 1:计数 2:进入当前节点的顺序等于当前计数 3:想所有…

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例问题:达梦数据库在使用disql登录时,显示“未连接”。 指定了IP和端口号还是连接异常。 […

淘宝扭蛋机小程序源码搭建:打造专属电商娱乐新平台

在数字化浪潮的推动下,电商平台不断创新,以满足消费者日益多样化的需求。淘宝扭蛋机小程序作为一种创新的电商娱乐形式,受到了广大用户的热烈追捧。为了满足市场需求,许多企业和开发者开始关注淘宝扭蛋机小程序的源码搭建&#xf…

SAP S/4HANA的常见部署方式

SAP S/4HANA是SAP面向企业数字化转型推出一代商务ERP 套件,与传统的SAP ERP系统相比,它基于内存计算和先进的数据处理技术,提供更快的数据处理速度、实时分析和更好的用户体验。SAP S/4HANA可以根据企业的需求以多种部署方式进行实施&#xf…

【零基础学数据结构】顺序表实现书籍存储

目录 书籍存储的实现规划 ​编辑 前置准备: 书籍结构体: 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用,相较于BPMNJS相对容易一些,更加灵活一些,但是扩展代码可能写得更多一些。 示例展示 使用方式 这个的使用方式就简单很多了,利用cdn把js下载下来,引入到HTML文…

Python爬虫-懂车帝新能源汽车近一年销量榜

前言 本文是该专栏的第24篇,后面会持续分享python爬虫干货知识,记得关注。 笔者在本专栏之前,有详细介绍以“懂车帝平台的新能源汽车销量榜单”为例,获取各车型的销量排行榜单数据。而本文,笔者将单独详细来介绍如何获取“近一年的新能源汽车销量榜单”数据。 具体实现思…

信创(统信)系统上的软件安装及软件使用手册

一.各软件的安装文档 1.达梦数据库在统信系统上的安装 官方手册:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html 1.1下载安装包 官网:https://www.dameng.com/list_103.html 点击”服务与合作”--> “下载中心” 这里选择对应的cpu和操作…

#include<初见c语言之字符函数和字符串函数>

目录 一、字符分类函数 二、字符转换函数 三、strlen的使⽤和模拟实现 1.strlen使用 2.strlen函数的模拟实现 四、 strcpy的使⽤和模拟实现 1.strcpy使用 2.strcpy函数的模拟实现 五、strcat的使用和模拟实现 1.strcat的使用 2.strcat的模拟实现 六、strcmp的使用…

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器,相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性,如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…