【Docker】镜像的构建与上传下载阿里云

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《Docker实战》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

✨前言

一、构建镜像

1.基本结构

2.构建镜像

2.1.初步了解

2.2.镜像运行jdk

二、镜像的优化

三、镜像上传与下载

3.1.上传镜像

①登录阿里云进入控制台搜索容器镜像服务ACR

②实例列表选择自己需要的实例

③设置Registry密码

④设置访问凭证固定密码

⑤在虚拟机中登录Docker

⑥创建命名空间

⑦创建镜像仓库

​编辑⑧推送镜像到阿里云

3.2.下载镜像


 

✨前言

镜像往往都是我们用的别人已经构建好的,但是他们相互之间又没有关联,如果我想要一个镜像就把一系列的事情完成了,那显然是不可能的,所以我们要根据我们自己的需求构建一个属于我们自己的镜像,而且我们可以在任何地方使用它而无需担心配置问题或者依赖项缺失的问题。此外,镜像还可以被用来进行容器化部署,这种方式可以更加高效地利用计算资源,提高应用程序部署和运行的效率。

一、构建镜像

我们构建镜像也是需要一个基础镜像的,作为我们的“地基”,但是这个镜像没有要求限制随便你搞一个都可以,我这里提供两个镜像给大家选择。

  • 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的差异对开发很重 要。

1.基本结构

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

部分命令
基础镜像信息FROM
维护者信息MAINTAINER
镜像操作指令
RUN ENV COPY ADD EXPOSE WORKDIR ONBUILD USER
VOLUME
容器启动时执行指令
CMD ENTRYPOINT
我这里还有一个比较具象化的图片方便大家理解

2.构建镜像

2.1.初步了解

创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件

①上传jdk

②同级目录下创建Dockerfile文件并编辑

FROM centos
MAINTAINER 1409726556@qq.com
WORKDIR /test
COPY spring.jar /test
  • FROM centos:指定基础镜像为 CentOS,即以 CentOS 作为镜像的基础环境。
  • MAINTAINER 1409726556@qq.com:指定维护者的信息,这里是邮箱地址。
  • WORKDIR /test:设置工作目录为 /test,即在容器内部创建并切换到 /test 目录。
  • COPY spring.jar /test:将主机上的 spring.jar 文件复制到容器内的 /test 目录。
编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。
docker build -t spring:v1.0 .
1 -t spring:v1.0 给新构建的镜像取名为spring, 并设定版本为 v1.0
2 :注意最后有个点,代表使用当前路径的 Dockerfile 进行构建

我们可以查看一下看有没有这个镜像

我们再来根据这个镜像构建一个容器看看

完全是可以构建的并且初始目录就是我们所设置的/test

2.2.镜像运行jdk

首先我们要明白jdkjre的区别是什么?jdk可以粗略的理解为编译器调试器,而我们的jre是真正运行我们java文件的,如果我们只需要运行环境就只需要jre即可。

①首先将jre的压缩包放入宿主机的目录下

由于我们需要在Dockerfile文件下进行编辑配置JAVA的环境变量,但是我们不知道该压缩文件解压后叫什么名字,所以我们可以提前在外面解压一遍看看

②编辑Dockerfile文件

FROM centos
MAINTAINER 1409726556@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
  • ADD :将我们压缩包复制到该容器目录下并解压
  • ENV:键值对的形式配置我们JAVA的环境变量和我们Windows中的一样

 ③将镜像进行构建

docker build -t spring:v2.0 .

 我们先查看一下我们的jre和jar包有没有在容器中

 ④运行jar包

java -jar spring.jar

但是这里还有一个小问题,我们是需要进到容器里面进行jar包的运行的,我想要构建容器的时候就自动运行怎么办呢?我们可以在Dockerfile文件配置中追加一个CMD命令

  •  CMD:容器启动时需要执行的命令

如果CMD需要运行容器执行多条命令应该怎么描述?

1.使用分号 ; 将多个命令放在一行:

CMD command1 ; command2 ; command3

2.使用换行符 \ 将多个命令分行编写:

CMD command1 \command2 \command3

直接构建运行一下试试

docker build -t spring:v2.0 .docker run -it spring:v3.0

 可以看到我刚刚构建镜像直接创建容器就会执行jar,说明我们的指令成功了

二、镜像的优化

 在上面的内容中我们学习了如何构建一个镜像以及镜像运行jar包,现在我们看一下我们的镜像

 可以看到除了我们的普通镜像是250MB另外两个带有jre的都是526MB,这个容量说大不大说小不小,但是我们还有可以优化的空间,刚刚我们不是提到两个基础镜像centosalpine吗?alpine只有5MB现在我们换成它试一下

FROM jeanblanchard/alpine-glibc
MAINTAINER 1409726556@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

然后我们构建和运行一下看下是否正常?

完全没有问题,现在来看一下镜像的容量是多少?

可以看到使用alpine的基础镜像容量明显少了218MB,在项目中一个模块可能要部署五六个容器甚至更多,一个项目那么多模块,这么算下来相当于减少了大量的空间浪费。

最后我们试一下这个jar跑起来在外面能不能访问?

成功访问没有问题

 

三、镜像上传与下载

我们将镜像做好了也只是在本机,如果我们的电脑不在身边或者别人需要使用我们做好的镜像应该怎么办?我们可以将镜像上传到Docker,但是Docker服务在国外还是比较慢的,我们就可以上传到阿里云镜像仓库。

3.1.上传镜像

①登录阿里云进入控制台搜索容器镜像服务ACR

②实例列表选择自己需要的实例

③设置Registry密码

 ④设置访问凭证固定密码

阿里云的 Docker 设置访问凭证固定密码和 Registry 密码是不同的,并且它们也不是同一个密码。

  1. Docker 设置访问凭证固定密码:此功能是指在创建阿里云容器实例时,为了保护 Docker 服务而设置的密码。该密码将用于访问 Docker 服务,用于验证身份并进行相关操作。这个密码是您自己设置的,用于对 Docker 服务进行身份验证,提供访问权限。

  2. Registry 密码:阿里云容器镜像服务(Registry)是用于存储和管理 Docker 镜像的云服务。当您使用阿里云容器镜像服务时,会创建一个 Registry,其中包含您上传的镜像。为了保护镜像的安全,阿里云容器镜像服务需要设置一个密码来对 Registry 进行访问控制。这个密码是阿里云为您自动生成的,用于对 Registry 进行身份验证。

所以,Docker 设置访问凭证固定密码和 Registry 密码是不同的密码。一个用于访问 Docker 服务,另一个用于访问和管理阿里云容器镜像服务中的镜像。

 ⑤在虚拟机中登录Docker

将官方提供给你的命令复制进行修改后进行登录

 ⑥创建命名空间

⑦创建镜像仓库

⑧推送镜像到阿里云

阿里云这边也是会有实例代码告诉你的,直接复制将自定信息修改成自己的即可

首先为我们需要上传的镜像取个别名 

 将目标推送的镜像仓库换成阿里云的镜像仓库

 推送镜像

推送成功我们就可以上阿里云镜像仓库看看了

 

3.2.下载镜像

我们先将该镜像删除在进行下载,也是没有任何问题的

docker rmi registry.cn-hangzhou.aliyuncs.com/java-ar/java-jar:v1.0

 

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

C++ Primer 6.4 函数重载 知识点+练习题

C Primer 6.4 函数重载 定义重载函数重载和const形参const_cast和重载重载与作用域练习题 定义重载函数 void lookup(int a); void lookup(double b); void lookup(int a,double b); 此三个函数构成函数重载,具体调用时根据传入实参进行匹配void lookup(int a); bo…

【iOS】UIColor、CGColor、CIColor的区别和联系

编者在实验室小组的指导下,仿写了许多App,其中UI的颜色模仿也是令人头痛的点。设计颜色一般使用UIColor类方法直接获取颜色: 有时会使用 (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alph…

C++中什么时候应该使用结构体,什么时候应该使用类

第一点: 在C中,结构体和类都可以用来定义自定义数据类型, 它们之间的主要区别在于默认的访问控制和成员变量的默认初始化方式。 结构体: - 结构体的成员变量默认为public访问权限。 - 结构体的成员变量默认为公共可见的&#x…

代码随想录算法训练营day8|344.反转字符串、541.反转字符串II、54.替换数字、151.翻转字符串里的单词、55.右旋转字符串

344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串 344.反转字符串 建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用…

权限修饰符-面向对象——java学习笔记

什么是权限修饰符? 用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围 各权限修饰符的限制范围: 修饰符在本类中同一个包下的其他类里任意包下的子类里任意包下的任意类里private√缺省√√protec…

2023.1.13 关于在 Spring 中操作 Redis 服务器

目录 引言 前置工作 前置知识 实例演示 String 类型 List 类型 Set 类型 Hash 类型 ZSet 类型 引言 进行下述操作的前提是 你的云服务器已经配置好了 ssh 端口转发即已经将云服务器的 Redis 端口映射到本地主机 注意: 此处我们配置的端口号为 8888 可点击下…

jmeter如何做接口测试?

Jmeter介绍&测试准备: Jmeter介绍:Jmeter是软件行业里面比较常用的接口、性能测试工具,下面介绍下如何用Jmeter做接口测试以及如何用它连接MySQL数据库。 前期准备:测试前,需要安装好Jmeter以及jdk并配置好jdk环…

小知识分享2

文章目录 1.TCP/IP协议2.四次挥手断开连接3.TCP的三次握手和四次挥手4.在什么情况下需要设置WINS Proxy?5.用户与用户账户有什么不同?为什么需要使用用户账户? 1.TCP/IP协议 1、TCP/IP、Transmission Control Protocol/internet Protocol,传…

杨中科 EFCORE 第三部分 主键

主键 自增主键 1、EF Core支持多种主键生成策略:自动增长;Guid;Hi/Lo算法等。 2、自动增长。 优点:简单; 缺点: 数据库迁移以及分布式系统中(多数据库合并,会有重复主键值)比较麻烦;并发性能差(大并发情况下,为了保证…

函数栈桢的创建和销毁

函数栈桢的创建和销毁 一、解决的问题二、认识常用的寄存器及其指令操作三、函数栈桢解析三、回答问题 一、解决的问题 1.局部变量是怎么创建的?  2.为什么局部变量的值是随机值?  3.函数是怎么传参的?传参的顺序是怎样的?  4.…

python24.1.14while循环

当条件结束时间未知时,while循环比for循环更合适 实践

Vue 3面试题

Vue 3面试题 以下是一些常见的Vue 3面试题: Vue 3中的Composition API是什么?它与Options API有什么区别? 答案: Composition API是Vue 3中引入的一种新的组件设计模式,它允许开发者通过函数的形式组织和重用组件的逻…

带你拿捏SpringBoot自动装配的核心技术?模块装配(@EnableXXX注解+@Import)+ 条件装配(@ConditionalXXX)

文章目录 Profile激活指定配置文件主配置文件中指定激活的profile命令行激活设置虚拟机参数激活 profile控制不到的地方 Spring原生的条件装配注解ConditionalConditional接口讲解案例讲解 Spring Boot封装的条件装配注解ConditionalXXX自己实现ConditionalOnBeanSpringBoot 源…

自制数据库空洞率清理工具-C版-03-EasyClean-V1.2(支持南大通用数据库Gbase8a)

目录 一、环境信息 二、简述 三、升级点 四、支持功能 五、空洞率 六、工具流程图 1、流程描述 2、注意点 (1)方法一 (2)方法二 七、清理空洞率流程图 八、安装包下载地址 九、参数介绍 1、命令模板 2、命令样例 3…

【集合大练习】---------------简易学生管理系统

目标: 实现学生对象新增,删除,查看,对象信息修改 整体实现思路: 1.定义学生类-------------创建学生对象 2.管理界面代码编写-------------命令提示面板 3.添加学生的代码编写---------add功能实现 4.查看学生信…

4、C语言:指针与数组

数组与指针 指针与地址指针与函数参数指针与数组地址算数运算字符指针与函数指针数组以及指向指针的指针多维数组命令行参数指向函数的指针复杂声明 指针是一种保存变量地址的变量。C语言中,指针的使用非常广泛,原因之一是,指针常常是表达某个…

智能合约笔记

前言: 首先了解下为什么会出现智能合约,打个比方现在有两个人A和B打赌明天会不会下雨,每个人赌注100元,如果第二天下雨则A拿走200元,否则B拿走200元,这样就有一个问题,赌注要到第二天才能见效&…

Python 中的字符串分割函数 split() 详解

更多Python学习内容:ipengtao.com 在 Python 编程中,处理字符串是一项常见的任务。字符串分割是其中的一个常见操作,而 Python 提供了强大的 split() 函数,用于将字符串拆分成多个部分。本文将详细介绍 split() 函数的用法、参数和…

Linux 转换文字编码与换行符 nkf命令

参考资料 【 nkf 】コマンド――文字コードと改行コードを変換するnkfコマンドでファイルの文字コードと改行コードを統一する 目录 一. 前期准备二. 乱码现象与分析三. nkf命令3.1 nkf --guess 查看文件编码3.2 nkf -w8 UTF-8(BOM)编码显示3.3 nkf -wd --overwrite 覆盖源文件…

MySQL核心SQL

一.结构化查询语言 SQL是结构化查询语言(Structure Query Language),它是关系型数据库的通用语言。 SQL 主要可以划分为以下 3 个类别: DDL(Data Definition Languages)语句 数据定义语言,这…