【嵌入式】Docker镜像构建指南:引领应用部署的革新之路

news2024/9/29 13:28:33

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。

📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服务,有需要可私信联系。

Docker镜像构建指南:引领应用部署的革新之路

  • 1. 概述
    • 1.1 什么是Docker?
    • 1.2 docker能干嘛?
    • 1.3 从哪里获取docker镜像
      • 1.3.1 Docker Hub
      • 1.3.2 其它Docker镜像服务平台
      • 1.3.3 线下分发
  • 2. Ubuntu如何安装docker
  • 3. 如何构建docker镜像
    • 3.1 组装基础Dockerfile
    • 3.2 按需修改Dockerfile
    • 3.3 编译镜像
    • 3.4 查看镜像列表和镜像ID
    • 3.5 验证镜像
  • 4. 如何使用阿里云docker镜像服务
    • 4.1 创建实例
      • 4.1.1 创建个人实例
      • 4.1.2 确认风险
      • 4.1.3 设置密码
    • 4.2 创建命名空间
    • 4.3 创建镜像仓库
      • 4.3.1 填写仓库基本信息
      • 4.3.2 设置代码源
  • 5. docker镜像上传到阿里云
    • 5.1 镜像打tag
    • 5.2 登录授权
    • 5.3 推送到服务器
  • 6. 总结

1. 概述

1.1 什么是Docker?

Docker是一种开源的容器化平台,它允许开发人员将应用程序及其所有依赖项(如库、环境变量、配置文件等)打包成一个容器,从而实现应用程序在不同环境中的快速部署、可移植性和可复制性。Docker利用Linux内核提供的容器技术,将应用程序和其依赖项隔离在一个容器中,使得应用程序能够在不同的计算机、虚拟机或云平台上进行高效地部署和运行。

1.2 docker能干嘛?

Docker的应用场景包括但不限于:

  1. 应用程序打包和部署:开发人员可以将应用程序以及其所有依赖项打包成一个容器,从而实现一次构建,到处运行的部署方式。

  2. 微服务架构:Docker容器适合部署微服务架构,每个微服务可以打包成一个独立的容器,实现高度的模块化和可扩展性。

  3. 环境一致性:Docker容器提供了一种可靠的环境隔离方式,能够确保应用程序在不同环境中的一致性,从开发到测试再到生产环境的部署都能保持一致。

  4. 快速开发和测试:开发人员可以在本地环境中快速地启动、停止、删除容器,进行开发和测试,从而提高开发效率。

  5. 持续集成和持续部署:Docker容器可以与持续集成/持续部署工具集成,实现自动化构建、测试和部署流程,加快软件交付速度。

在嵌入式开发领域,Docker一般用于快速部署开发环境,保证所有服务器,所有开发人员的开发环境一致性,避免因环境差异带来各种各样的问题。

1.3 从哪里获取docker镜像

1.3.1 Docker Hub

Docker官方镜像平台提供了很多基础镜像,可以访问https://hub.docker.com/来查找。

1.3.2 其它Docker镜像服务平台

除了Docker Hub之外,国内外也有大量的平台提供了镜像搭建和维护服务,比如阿里云的容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances。

1.3.3 线下分发

他人构建好的镜像,可以打包后进行线下分发,他人获取后可以直接导入。

举例子:
可以使用docker save命令将myubuntu镜像导出为myubuntu.tar

sudo docker save -o myubuntu.tar myubuntu

myubuntu.tar镜像可以自由分发,另外一个人拿到myubuntu.tar后就可以使用docker load导入到自己的机器上,然后就可以使用该镜像创建并启动容器了。

sudo docker load -i myubuntu.tar

2. Ubuntu如何安装docker

要在Ubuntu上安装Docker,可以按照以下步骤进行:

  1. 更新apt软件包索引:

    sudo apt update
    
  2. 安装依赖包,以允许apt软件包在HTTPS上使用存储库:

    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    
  3. 添加Docker的官方GPG密钥:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  4. 添加Docker APT存储库:

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
  5. 再次更新apt软件包索引:

    sudo apt update
    
  6. 确保从Docker存储库而不是默认存储库中安装:

    apt-cache policy docker-ce
    
  7. 最后,安装Docker:

    sudo apt install docker-ce
    
  8. 验证Docker是否正确安装:

    sudo systemctl status docker
    

通过这些步骤,可以在Ubuntu上成功安装Docker,并可以开始使用Docker引擎了。

3. 如何构建docker镜像

要构建Docker镜像,需要编辑一个Dockerfile文件,来描述镜像的构建过程。现以更新java版本为例,讲述整个更新过程。

3.1 组装基础Dockerfile

新建一个空目录,然后创建一个名为Dockerfile的文本文件,将如下内容拷贝进去

FROM ubuntu:1604
MAINTAINER Alex <guoyong.lei@163.com>

WORKDIR /home/admin/workspace

ENTRYPOINT ["/bin/bash"]

3.2 按需修改Dockerfile

将下载好的java运行环境压缩包拷贝到Dockerfile同一目录下。然后我们使用Dockerfile的ADD命令将本地当前目录下的OpenJDK11U-jdk_x64_linux_11.0.12_7.tar.gz解压并拷贝到/opt/目录下,然后用过ENV命令修改PATH环境变量,追加新的java执行目录即可。

对应代码如下所示:

FROM ubuntu:1604
MAINTAINER Alex <guoyong.lei@163.com>

ADD ./OpenJDK11U-jdk_x64_linux_11.0.12_7.tar.gz /opt/
ENV PATH /opt/openjdk-11.0.12_7/bin:$PATH

WORKDIR /home/admin/workspace

ENTRYPOINT ["/bin/bash"]

3.3 编译镜像

Dockerfile编写完成后,使用docker build命令在Dockerfile所在的目录中构建镜像:

$ sudo docker build -f Dockerfile -t ubuntu1604_update_java .

Sending build context to Docker daemon   203 MB
Step 1 : FROM ubuntu:1604
---> 961496ae44f2
Step 2 : MAINTAINER Alex <guoyong.lei@163.com>
---> Using cache
---> ae3210afff6e
Step 3 : ADD ./OpenJDK11U-jdk_x64_linux_11.0.12_7.tar.gz /opt/
---> 7ea4f23aa58e
Removing intermediate container 66d7e8d08a31
Step 4 : ENV PATH /opt/openjdk-11.0.12_7/bin:$PATH
---> Running in 9681ee611e2d
---> 4de8fc80f273
Removing intermediate container 9681ee611e2d
Step 5 : WORKDIR /home/admin/workspace
---> Running in 015127eea321
---> 12d61d78f3fb
Removing intermediate container 015127eea321
Step 6 : ENTRYPOINT /bin/bash
---> Running in cd95f1c5a241
---> 586de0560544
Removing intermediate container cd95f1c5a241
Successfully built 586de0560544

上述命令中,

  • -f Dockerfile 表示使用Dockerfile描述文件来构建镜像
  • -t ubuntu1604_update_java表示为新镜像指定一个名称(在此示例中为ubuntu1604_update_java
  • .表示Dockerfile在当前目录下。

3.4 查看镜像列表和镜像ID

镜像编译成功后,就可以通过docker images命令查看镜像列表了。如下所示,第一个就是我们钢构件成的镜像:

$ sudo docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
ubuntu1604_update_java                                            latest              586de0560544        7 minutes ago       1.701 GB
dev_x86_backup_20211227                                           latest              12173815dc73        9 weeks ago         90.53 GB
dev_x86_backup_20211226                                           latest              14a64e5c857c        9 weeks ago         144.5 GB
ubuntu_1604_build_20211014                                        latest              961496ae44f2        4 months ago        1.376 GB
ubuntu18.04_sifeng                                                latest              4bb2e57d175c        13 months ago       915.7 MB
ubuntu16.04_x64                                                   latest              6a7a6103b47d        3 years ago         14.87 GB

3.5 验证镜像

镜像编译成功之后,可以用个docker run命令来验证。如下所示,执行docker run命令之后,会进入Docker环境,之后自行查看改动是否生效即可。确认完成之后,执行exit命令退出docker环境。

$ sudo docker run -it --rm ubuntu1604_update_java:latest
admin@1d7377478901:~/workspace$
admin@1d7377478901:~/workspace$ ls /opt/
openjdk-11.0.12_7
admin@1d7377478901:~/workspace$
admin@c66458d193aa:~/workspace$ type java
java is /opt/openjdk-11.0.12_7/bin/java
admin@1d7377478901:~/workspace$
admin@1d7377478901:~/workspace$ java --version
openjdk 11.0.12 2021-07-20
OpenJDK Runtime Environment 18.9 (build 11.0.12+7)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7, mixed mode)
admin@1d7377478901:~/workspace$
admin@69bd748cfdc4:~/workspace$ exit
exit

构建镜像的过程中,Docker将执行Dockerfile中指定的每个步骤,包括基础镜像的拉取、文件的复制、环境变量的设置等。最终,我们会获得一个包含指定应用程序和配置的Docker镜像,可以将其推送到Docker Hub或阿里云等镜像仓库中,也可以在本地使用。

4. 如何使用阿里云docker镜像服务

本章,我们以阿里云的Docker镜像服务为例,讲述如何其使用方法,包括平台初始化和镜像创建等操作。

待云端初始化完成并创建镜像之后,我们就可以将上一章中创建的docker镜像上传到阿里云存储下来,以备其它机器拉取使用了。

4.1 创建实例

打开阿里云容器镜像服务制台,新建实例。可按需选择企业版和个人版。下文都以个人版为例进行演示。

4.1.1 创建个人实例

在这里插入图片描述

4.1.2 确认风险

按照页面提示,个人版实例不提供SLA保障且有数量、安全性等限制,不保障安全和稳定,不建议生产业务中使用,以避免影响线上业务。如有需要可选择企业版实例或者其它方案进行存储分发。
在这里插入图片描述

4.1.3 设置密码

该密码在docker login命令登录阿里云Docker服务器时输入,用于docker pull命令下载私有镜像和docker push命令上传镜像时鉴权使用,请务必谨记。
在这里插入图片描述

4.2 创建命名空间

个人实例创建成功之后,需要先继续创建命名空间,命名空间用来管理镜像仓库,所以必须先创建命名空间,才能创建镜像。

点击左侧的命名空间,点击创建命名空间按钮,填入命名空间的名字之后,点击确定按钮保存即可。
在这里插入图片描述

4.3 创建镜像仓库

命名空间创建成功后,就可以创建镜像仓库了。

4.3.1 填写仓库基本信息

点击左侧的镜像仓库,点击创建镜像仓库,依次选择命名空间,填入仓库名称,选择仓库类型,填入摘要之后,点击下一步按钮。
在这里插入图片描述

4.3.2 设置代码源

我们最终是要将本地创建好的镜像上传到该镜像仓库,因此代码源选择本地仓库即可,最后点击创建镜像仓库按钮即可。
在这里插入图片描述
到此为止,镜像仓库就创建成功了,如下图所示,可以查看到相关信息以及操作指南。
在这里插入图片描述

5. docker镜像上传到阿里云

在第三章中,我们已经把docker镜像编译完成并验证OK,也已在阿里云镜像平台创建好了镜像仓库,接下来就可以将本地的镜像上传阿里云docker镜像服务器了。

5.1 镜像打tag

先对本地镜像打tag,标记本地镜像,将其归入某一仓库。
如下所示,我们将586de0560544(ubuntu1604_update_java的Image ID,docker image命令可以查看到)这个镜像归入registry.cn-hangzhou.aliyuncs.com/android_product/ubuntu16.04_android仓库。

sudo docker tag 586de0560544 registry.cn-hangzhou.aliyuncs.com/android_product/ubuntu16.04_android:latest

5.2 登录授权

$ docker login --username=<修改为自己的阿里云账号> registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为创建实例时设置的密码。

5.3 推送到服务器

镜像准备就绪,即可使用docker push命令推送到docker镜像服务器了。

sudo docker push reg.docker.alibaba-inc.com/tmjl_service/ubuntu-1604-build:latest

6. 总结

通过本文的探索,我们更深入地了解了Docker技术,并对其在软件开发和部署中的价值有了更清晰的认识。Docker的出现为应用程序的开发、部署和管理带来了革命性的变化,相信在未来,它将继续发挥重要作用,推动软件开发和部署的进步。

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

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

相关文章

深度学习pytorch——GPU加速(持续更新)

使用 .to(device)&#xff0c;以前使用 .cuda() &#xff0c;但是现在基本不使用了。 代码示例&#xff1a; 查看电脑GPU运行情况&#xff1a; 使用Ctrl Shift ESC快捷键&#xff1a;

Unreal中的四元数FQuat

四元数&#xff1a;Quaternion&#xff0c;四维数域内的数&#xff0c;可用于描述点在三维空间内的旋转&#xff08;因为三维的旋转可以理解为绕某个轴旋转一个角度&#xff0c;所以需要4个维度的信息&#xff09; 注意这里的旋转的轴&#xff0c;指的是从原点到 ( x , y , z )…

vue3+threejs新手从零开发卡牌游戏(九):添加抽卡逻辑和动效

首先优化下之前的代码&#xff0c;把game/deck/p1.vue中修改卡组方法和渲染卡组文字方法提到公共方法中&#xff0c;此时utils/common.ts完整代码如下&#xff1a; import { nextTick } from vue; import * as THREE from three; import * as TWEEN from tweenjs/tween.js impo…

数据库基础篇-------语法结构

友友们&#xff0c;大家好&#xff0c;今天我们来回顾我们的数据库啦&#xff0c;数据库技术是在我们大一就进行了解的&#xff0c;但是在大二的时候有的学校会进行数据库开发技术的教学&#xff0c;这两本书是不一样的&#xff0c;数据库基础更加偏向于对应的基础语法结构&…

计算方法实验2:列主元消元法和Gauss-Seidel迭代法解线性方程组

Task 即已知 y 0 0 , y 100 1 y_00,y_{100}1 y0​0,y100​1&#xff0c;解线性方程组 A y b \mathbf{A}\mathbf{y} \mathbf{b} Ayb&#xff0c;其中 A 99 99 [ − ( 2 ϵ h ) ϵ h 0 ⋯ 0 ϵ − ( 2 ϵ h ) ϵ h ⋯ 0 0 ϵ − ( 2 ϵ h ) ⋯ 0 ⋮ ⋮ ⋱ ⋱ ⋮ 0 0 ⋯…

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…

(C语言)浮点数在内存中的存储详解

1. 浮点数 常见的浮点数&#xff1a;3.14159、 1E10等 &#xff0c;浮点数家族包括&#xff1a; float、double、long double 类型。 浮点数表示的范围&#xff1a; float.h 中定义. 2. 浮点数的存储 我们先来看一串代码&#xff1a; int main() {int n 9;float* pFloa…

高中信息技术教资刷题笔记_大题篇

1.选择排序 2. SMTP属于TCP/IP协议体系结构中的哪一层&#xff1f;请列出其通信的三个阶段。 3.高中信息技术课程的基本理念/意义 4.视频作品制作和发布的主要环节 5.信息社会责任内涵及学生表现 6.教学活动意图 ①突出学生的主体地位。材料中&#xff0c;王老师设计的“扮演谍…

关系型数据库mysql(4)事务

目录 一.事务的概念 1.事务的定义 2.事务的特点 2.1原子性 2.2一致性 2.4持久性 3.事务之间的相互影响 3.1脏读 3.2不可重复读 3.3幻读 3.4丢失更新 4. 事务的隔离级别&#xff08;如何解决事务的干扰&#xff09; 4.1查询全局事务隔离级别 4.2查询全局事务 …

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

详解|temu选品师是什么?算蓝海项目吗?

在快速发展的跨境电商行业中&#xff0c;temu选品师这一岗位逐渐受到人们的关注。temu作为拼多多旗下的跨境电商平台&#xff0c;致力于为中国商家提供一个通向全球市场的桥梁。而temu选品师&#xff0c;则是这个桥梁上不可或缺的角色。 temu选品师主要负责在海量商品中挑选出具…

探索Zalo:从社交APP到Mini App开发指南

1.Zalo是什么&#xff1f; Zalo是一款源自越南的即时通讯和社交软件&#xff08;相当于国内的微信&#xff09;&#xff0c;由越南VNG公司开发。它集成了多种功能&#xff0c;包括但不限于免费的文字、语音、视频消息发送&#xff0c;高质量的语音和视频通话&#xff0c;群聊功…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…

Redis入门到实战-第四弹

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些&#xff1f; 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态&#xff08;别陷入一个误区不是只有客户端才能主动关闭连接的&#xff09;&#xff0c;所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接&#xff0c;就是…

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

关于mysql无法添加中文数据的问题以及解决方案

往数据库表插入语句时&#xff0c;插入中文字段&#xff0c;中文直接变成&#xff1f;的问题&#xff0c; 出现这样的问题就是在创建数据库时 数据库字符集 没有选择uft8, 数据库校对规则没有选择utf8-bin 用 SHOW CREATE DATABASE 数据名; 可以查看你的这个数据库的定义…

设计模式之状态模式(一)

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…