Docker自定义镜像上传阿里云

news2024/11/16 11:55:10

目录

1. alpine 简介

2. 基于alpine构建jdk8镜像

2.1 Dockerfile

2.2 将构建目录上传到linux中

2.3 执行构建

3. 镜像瘦身

4. 上传阿里云镜像仓库


 

1. alpine 简介

Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗。

Alpine Linux提供了自己的包管理工具:apk(注意:ubuntu中是apt-get,centos中式yum),我们可以通过Alpine Linux packages 查询包信息。

Alpine Docker镜像继承了Alpine Linux发行版的这些优势,相比于其他Linux Docker镜像,它的体积非常小对比常用的、没有压缩过的基础镜像(查看当前的:latest标签)。

Alpine - 4.8MB

Ubuntu - 124.8 MB (现在ubuntu18.04镜像已经压缩到80几M了)

Debian - 125.1MB

Centos - 196MB

关于alpine最新的信息请参看官网

2. 基于alpine构建jdk8镜像

2.1 Dockerfile

1)在本地创建一个目录,并将构建所需要的软件包放入目录,如下图所示:

所用文件下载地址

天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享(访问码:uoa5)

1e5754792ab041e8a763bb6af3c6d93e.png

注:glibc相关的东东是什么?为什么需要?

glibc是GNU发布的libc库(即c语言库),是linux的的最底层api,是linux系统的基石。因为alpine默认是使用musl libc作为底层api(该api优点是小),该musl libc仅能支持openjdk,我们需要安装oracle jdk必须用glibc才行

为什么需要将glibc相关包,及jdk8都先下载好放在目录里呢? 在构建镜像时不能下载吗?

可以在构建时下载,但太慢了,预先将包放在构建目录下要快得多。

上面参照图片中目录名是alpine,是必须叫这个名字吗?

不是,名称随便你命名,但要有意思,这是个好习惯,就像代码要注意可读性一样。

2)Dockerfile内容

 

# 指定基础镜像,并且必须是第一条指令
FROM alpine:3.10

# 维护信息,指明作者和邮件
MAINTAINER lisen "lisen@163.com"

# 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java

# 将jdk复制到容器的/usr/local/java目录中,ADD会执行解压,如果是COPY则仅复制
ADD jdk-8u151-linux-x64.tar.gz /usr/local/java

# glibc安装包如果从网络下载速度实在是太慢了,先提前下载复制到镜像中
COPY glibc-i18n-2.30-r0.apk /usr/local/java
COPY glibc-bin-2.30-r0.apk /usr/local/java
COPY glibc-2.30-r0.apk /usr/local/java

# 更新Alpine的软件源为阿里云,因为从默认官源拉取实在太慢了
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \
echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories
RUN apk update && apk upgrade

# 运行指定的命令
## Alpine linux为了精简本身并没有安装太多的常用软件,apk类似于ubuntu的apt-get,
## 用来安装一些常用软V件,其语法如下:apk add bash wget curl git make vim docker
## wget是linux下的ftp/http传输工具,没安装会报错“/bin/sh:   wget: not found”
## ca-certificates证书服务,是安装glibc前置依赖
RUN apk --no-cache add ca-certificates wget &&\
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub &&\
    apk add glibc-2.30-r0.apk glibc-bin-2.30-r0.apk glibc-i18n-2.30-r0.apk &&\
    rm -rf /var/cache/apk/* glibc-2.30-r0.apk glibc-bin-2.30-r0.apk glibc-i18n-2.30-r0.apk

# 设置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_151
ENV PATH=$JAVA_HOME/bin:$PATH

2.2 将构建目录上传到linux中

 

0d6c473158d44c2599362ecc229f3066.png

2.3 执行构建

1)登录linux系统

2)来到构建目录下

3)执行构建命令即可

root@ubuntu:/home/lisen/alpine# docker build -t lisen/tiny-jdk8:v1.0 .

注意:

我怎么报错了:"docker build" requires exactly 1 argument.

不要忘了最后的那个点“.” 表示当前目录,这个比较容易被忽略。

我可以在这个目录外执行构建不?

不行,这个目录是构建目录,是构建时的执行上下文

3. 镜像瘦身

瘦身的思路很简单,分为三个步骤:

  • 将jdk换为jre,因为我们在容器中只用运行时环境就可以了,jre体积比jdk小
  • 将jre中可以删除的内容删除,如文档资料等
  • 使用jre重新构建镜像

1)将jre-8u221-linux-x64.tar.gz上传到linux中

2)在linux中执行解压

root@ubuntu:/home/lisen# tar zxf jre-8u221-linux-x64.tar.gz
root@ubuntu:/home/lisen# ls
alpine                       jre1.8.0_221

3)进入jre1.8.0_221目录,进行jre瘦身

#jre瘦身
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.* THIRDPARTYLICENSEREADME.* Welcome.html 

rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin   

    rm -rf lib/deploy* \
    lib/*javafx* \
    lib/*jfx* \
    lib/amd64/libdecora_sse.so \
    lib/amd64/libprism_*.so \
    lib/amd64/libfxplugins.so \
    lib/amd64/libglass.so \
    lib/amd64/libgstreamer-lite.so \
    lib/amd64/libjavafx*.so \
    lib/amd64/libjfx*.so

4)将瘦身之后的jre拷入alpine(构建目录)

root@ubuntu:/home/lisen# mv jre1.8.0_221/ alpine

5)进入alpine目录修改Dockerfile文件

acd8e70825dd45a187f322158ab485f9.png

6)重新通过Dockerfile重新构建镜像

root@ubuntu:/home/lisen/alpine# docker build -t lisen/tiny-jdk8:v2.0 .

7)通过镜像运行容器,主要为测试镜像

 

#构建镜像
root@ubuntu:/home/lisen/alpine# docker run -itd --name tinyjdk8-container lisen/tiny-jdk8:v2.0
ed346c332ef0c30459820b6deab14dad2a7655440bd79f6490ed9cade0511430

#进入容器
root@ubuntu:/home/lisen/alpine# docker exec -it ed346c /bin/sh
/usr/local/java # java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
/usr/local/java #

#停止所有容器
root@ubuntu:/home/lisen/alpine# docker stop $(docker ps -aq)

4. 上传阿里云镜像仓库

阿里云镜像仓库简介:

阿里云默认实例版(免费版):命名空间:3个, 单命名空间下私有仓库数200个,单命名空间下公开仓库总数1000个,镜像版本总数不限制,构建规则总数5个,构建任务并发3个,同步任务并发3个,不支持交付链。

1) 登录阿里云账户

2) 控制台 -> 容器镜像服务 -> 创建命名空间(建议组织,个人,公司的名字) -> 创建仓库(选择本地仓库)

点击进入 个人实例

bb6269a6f3364854881e7adb4658e776.png

a9f9c556428544b89a57221f22dd8e81.png

注意在👆 方创建时会让你设置仓库密码 仓库选择本地,需要记住 -- 下一步 - 点击仓库test 进入仓库

a320012516ce474593c26f72196c8a2f.png

注:在创建仓库时那个“代码源”是个什么东东,作用是什么?镜像容器服务提供源码仓库的镜像构建功能(如:github,云code等),支持源码修改后自动进行镜像构建,本示例为配置简单选择了本地仓库。

3)在仓库创建成功后,按提示步骤进行操作,将镜像推送到阿里云

注意 现需要登录!!!

docker login --username=aliyun9823651489 registry.cn-hangzhou.aliyuncs.com #运行后 输入你设置的仓库密码

第一步:打标签

格式:

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/test-alpine/test:[镜像版本号]

示例:

sudo docker tag 457b3f475453 registry.cn-hangzhou.aliyuncs.com/test-alpine/test:v1.0
  • 457b3f475453 为需要上传的镜像ID, [镜像版本号]为需要上传的镜像的版本号

第二步:push

格式:

sudo docker push registry.cn-hangzhou.aliyuncs.com/test-alpine/test:[镜像版本号]

示例:

sudo docker push registry.cn-hangzhou.aliyuncs.com/test-alpine/test:v1.0

成功后可以在“镜像版本”中看到上传的镜像

a6de675be05c486684e11dc2532e9ab8.png

4)拉取镜像

格式:

sudo docker pull registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:[镜像版本号]

示例:

sudo docker pull registry.cn-hangzhou.aliyuncs.com/test-alpine/test:v1.0

5)通过拉取的镜像运行容器(目的是为了测试)

root@ubuntu:/# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
lisen/tiny-jdk8                                       v1.0                457b3f475453        About an hour ago   173MB
registry.cn-hangzhou.aliyuncs.com/test-alpine/test:v1.0   v1.0                457b3f475453        About an hour ago   173MB

root@ubuntu:/# docker run -itd --name tinyjdk8 457b3f475453
a7566e8904d681825633e3fe1b7168031e83127d784f24b225367d512746a77d
root@ubuntu:/# docker exec -it a7566 /bin/sh
/usr/local/java # java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
/usr/local/java #

 

 

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

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

相关文章

斯坦福联合Meta提出多模态模型RA-CM3,检索增强机制或成文本图像领域新制胜法宝

原文链接:https://www.techbeat.net/article-info?id4403 作者:seven_ 论文链接: https://arxiv.org/abs/2211.12561 相信目前很多AI大模型研究者都会遇到一个非常困难的问题,那就是很难控制的模型参数和容量,由于参与…

【Three.js入门】纹理及其常用属性、透明纹理、环境遮挡贴图与强度

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

消息队列—RabbitMQ(万字详解)

消息队列—RabbitMQ 笔记整理自 【涛哥】最适合小白入门的RabbitMQ教程 1. 消息队列介绍 Ⅰ. 消息队列需求场景 在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出…

矢量网络分析仪如何测量史密斯图及滤波器的带宽?

矢量网络分析仪是一种很神奇的测量仪器,它的功能很强大也值得人们去探索。今天,安泰测试工程师就针对矢量网络分析仪中的史密斯图及滤波器的带宽测量进行简单的介绍,希望能够让更多的人对此有所了解,并产生兴趣。 首先仪器了解一下…

数字孪生可视化图表:了解堆叠的条形图

数据可视化已成为我们日常数据分析工作当中的重要组成部分,可视化大屏是数据可视化发展的产物。这又不得不说到一个概念:可视化组件。可视化组件是制作数字孪生可视化大屏必不可少的一部分,在一个完整的数字孪生可视化大屏中用到的图表可不少…

Android系统之路(初识MTK) ------Android11.0给辅助工具-手电筒添加低电Toast提醒

Android11.0给辅助工具-手电筒添加低电Toast提醒 今天因为在复测昨天的一个monkey压测并且还没测完,所以打算记录最近做系统开发的一些心得和经验,也记录一下自己的系统开发历程 修改前的效果图: 修改后的效果图: 后期补上… 修改前当电量小于等于15%时,按钮依旧可以打…

11条非常实用的Git 和 Git 命令,值得你收藏

基本命令 01. init git init 在当前目录中创建一个新的空仓库。 02. clone git clone https://github.com/facebook/react.git 将远程存储库复制到当前目录。 03. add git add 命令将工作目录中的新文件或更改的文件添加到 Git 暂存区。 git add <file1> <file2&…

【WAF绕过-4】漏洞利用之注入上传跨站等绕过

1、SQL注入 如需sqlmap注入测试&#xff0c; 防cc拦截&#xff1a;修改user-agent头代理&#xff08;付费代理池&#xff09; 修改user-agent头&#xff1a; &#xff08;1&#xff09;加参数&#xff1a;--random-agent &#xff08;2&#xff09;加参数&#xff1a;--user-a…

几十年前的老旧照片如何修复?还不知道旧照片怎么恢复清晰吗?

那些旧照片本身会随着时间的推移而褪色、褶皱。老旧照片修复主要是从褪色、变色、破损、发霉、的旧相片修复翻新&#xff0c;到模糊不清清晰化处理&#xff0c;大面积严重破损照片修补。 十年以前&#xff0c;没有电脑&#xff0c;没有手机&#xff0c;更没有存储照片工具。大…

【关于时间序列的ML】项目 5 :用机器学习预测天气

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

基于Canal+kafka监听数据库变化的最佳实践

1、前言 工作中&#xff0c;我们很多时候需要根据某些状态的变化更新另一个业务的逻辑&#xff0c;比如订单的生成&#xff0c;成交等&#xff0c;需要更新或者通知其他的业务。我们通常的操作通过业务埋点、接口的调用或者中间件完成。 但是状态变化的入口比较多的时候&#x…

位图详解.

1.位图概念 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f; 思考&#xff1a; 1.用哈希表&#xff1f;遍历一遍&#xff1f;时间复杂度O(N) 40亿个不重复无符号整数占多大内存&#xff1…

springcloud配置中心nacos动态线程池Dynamic-tp配置接入实战

最近业务上需要把项目组几个微服务接入动态线程池框架Dynamic-tp监控&#xff0c;同时支持webhook机器人接受变更通知、容量报警、活性报警、拒绝报警、任务超时报警等通知&#xff0c;方便项目组同事企业微信群实时监控线程池状态&#xff0c;动态调整线程参数。 接手开始上手…

【C++学习】对二维数组进行排序

1 问题描述 今天在学习 CUDA-NMS 算法时&#xff0c;遇到一个小问题&#xff0c;就是希望对一个二维数组进行排序&#xff0c;具体是这样的&#xff1a; 需要对存储目标框的二维数组进行排序&#xff0c;排序的方式是按照目标框的得分score从高往低排序&#xff0c;也就是结果…

微服务系列 - Zookeeper上篇:入门到精通

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 视频教程&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程 源码学习&#xff1a;微服务系列 - Zookeeper下篇&#xff1a;源码解析 二、Zookeeper入门 1、概述 Zookeeper是一个开…

消息队列(MQ)

文章目录什么是消息队列定义消息队列的特性&#xff1a;1、解耦&#xff1a;2、削峰&#xff1a;3、异步&#xff1a;使用场景传统串行化设计串行化思想&#xff1a;并行处理调优高可用&#xff1a;高并发高性能MQ的两种流派MQ常见的问题1&#xff0c;mq如何避免消息堆积问题。…

如何解决甲乙双方需求理解巨大偏差的问题?

1、对双方进行专业培训 需求分析人员对需求方应用领域不熟悉&#xff0c;而需求方对软件开发也不熟悉&#xff0c;通过对双方进行专业知识培训&#xff0c;让双方对用户专业领域和软件开发领域都有较为清晰的认识。在此基础上&#xff0c;需求方提出的需求更精准&#xff0c;双…

Java中的多线程——线程安全问题

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 多线程所带来的不安全问题 什么是线程安全 线程不安全的原因 修改共享数据 修改操作不是原子的 内存可见性对线程的影响 指令重排序 解决线程…

一个高性能、无侵入的Java性能监控和统计工具,有点东西!

背景 随着所在公司的发展&#xff0c;应用服务的规模不断扩大&#xff0c;原有的垂直应用架构已无法满足产品的发展&#xff0c;几十个工程师在一个项目里并行开发不同的功能&#xff0c;开发效率不断降低。 于是公司开始全面推进服务化进程&#xff0c;把团队内的大部分工程…

你造Python中的上下文管理器是啥吗

上下文管理器(Context managers)让我们在需要的时候可以准确地分配或释放资源 Python中最常用的上下文管理例子就是with语句了&#xff0c;一般是在操作文件的时候&#xff0c;比如&#xff1a; 有PY基础的小伙伴都知道&#xff0c;上面的代码等价于&#xff1a; 对比两个例子…