首页 > 其他分享 >Docker 推送跨平台镜像至 docker hub

Docker 推送跨平台镜像至 docker hub

时间:2022-12-02 23:06:27浏览次数:51  
标签:架构 hub onlyonelmm manifest 跨平台 jdk8 镜像 docker Docker


docker的神奇之处,目前大概也有了点初步的了解了,由于最近在处理跨平台构建镜像的问题,发现docker 在拉取镜像时,会自动根据当前机器的架构,拉取符合当前架构的镜像,这样保证了镜像拉下来之后可以正常运行。

这也是为什么有时候我们拉取别人构建的镜像,无法运行的问题。

如果镜像的架构和当前机器的架构不一致,则运行镜像的时候,容器会立马停掉,然后日志里面显示可恶的:​​standard_init_linux.go:228: exec user process caused: exec format error​

所以构建镜像时,如果有不同平台可以测试,构建两份镜像,就可以完美的解决这个问题了。

下面以​​jdk8​​镜像为例,创建一份多平台的镜像包。

这里不再叙述怎么打包的镜像了,只记录下如何将不同平台的镜像包提出来一个统一的入口,具体拉取哪个镜像,让机器自动匹配。其实也就是用到了docker的​​manifest​​​,关于​​manifest​​​的知识,可以看下这篇文章:​​Docker manifest 详解​

docker manifest命令来制作多架构镜像,这个命令目前还是实验性质的,需要把docker的实验模式打开。我这里是​​20.20.5​​版本的,已经打开了,忘记是不是自己手动打开的了,如果没有打开,手动配置下。

Docker 推送跨平台镜像至 docker hub_运维


首先保证本地已经包含两个平台的镜像包了

Docker 推送跨平台镜像至 docker hub_推送_02


这里可以看到,有两个镜像,分别是arm64和x86_64。还有一点需要保证的是:远程仓库里面也必须要有这两个镜像,否则下面创建 ​​manifest​​​时,会提示:​​no such manifest: onlyonelmm/jdk8:x86_64​

创建一个新的 ​​manifest​​,指定多架构镜像的名称,和具体的不同架构的镜像名称

docker manifest create --insecure onlyonelmm/jdk8:latest onlyonelmm/jdk8:x86_64 onlyonelmm/jdk8:arm64

声明不同架构镜像对应的操作系统和cpu架构类型,其中x86_64需要用amd64来指定

docker manifest annotate onlyonelmm/jdk8:latest onlyonelmm/jdk8:x86_64 --os linux --arch amd64 
docker manifest annotate onlyonelmm/jdk8:latest onlyonelmm/jdk8:arm64 --os linux --arch arm64

将manifest推送到私用仓库中

docker manifest push --insecure onlyonelmm/jdk8:latest

Docker 推送跨平台镜像至 docker hub_容器_03


Docker 推送跨平台镜像至 docker hub_linux_04


由于这两个不同架构的镜像,已经存在我的docker hub里面了,上面在推送的时候,就没有显示上传了。

可以看到docker hub上面已经有了​​latest​​版本,并且包含两个不同架构的镜像,其中镜像的ID分别是下面的两个不同架构的镜像的ID。

随便找一台​​x86_64​​架构的机器测试拉取镜像:

Docker 推送跨平台镜像至 docker hub_推送_05


可以看到正常拉下来了。然后看下镜像的架构是否一致。使用 ​​docker inspect 镜像ID​

Docker 推送跨平台镜像至 docker hub_推送_06

再找一台 ARM架构服务器测试拉取镜像看下。

Docker 推送跨平台镜像至 docker hub_linux_07


Docker 推送跨平台镜像至 docker hub_docker_08


完美。

这里也可以将我们的镜像推送至私有仓库里面。方法是一样的,只需要保证镜像的名称符合镜像仓库规范即可。


标签:架构,hub,onlyonelmm,manifest,跨平台,jdk8,镜像,docker,Docker
From: https://blog.51cto.com/linmengmeng/5907666

相关文章

  • Ubutu+Apache+Mono 实现.net开发的网站跨平台移植
    最近公司转型,需要将现有使用的.net技术开发的平台系统在linux系统上跑起来,一方面是为了节省成本(Linux免费),另一方面,现在是大数据的填写,所有的技术要向java平台移植,起到一个......
  • SignalR循序渐进(二)泛型Hub
    接上一篇,文章末尾抛出了2个问题:能不能让客户端声明一个强类型的方法列表呢?这样首先不容易写错。同样的,能不能让服务端声明一个强类型的方法列表给客户端调用呢?如果要......
  • SignalR 循序渐进(四) Hub的生命周期以及IoC
    有阵子没更新这个系列了,最近太忙了。本篇带来的是Hub的生命周期以及IoC。首先,Hub的生命周期,我们用一个Demo来看看:publicclassTestHub:Hub{publicTe......
  • SignalR 循序渐进(五)多个Hub服务器下的消息订阅
    SignalR的通讯方式决定了其高性能,但是即便如此,当消息的并发量上来以后,单节点的Hub服务器依然可能无法承载总的消息吞吐量,那么如何对Hub服务器做水平扩展呢?从微软官方的文......
  • Jenkins打包项目提示Docker的2375端口连接超时问题
    Jenkins报错内容如下:[ChecksAPI]Nosuitablecheckspublisherfound.[Docker]ERROR:Failedtoexecstart:Connectto192.168.40.37:2375[/192.168.40.37]failed:c......
  • 【Docker】Failed to create docker image: org.apache.http.client.ClientProtocolEx
    使用Jenkins打包docker镜像时报这个错,并且还是在有别的项目正常打包的情况下,新建的任务就不好使了。完整的错误信息:[Docker]ERROR:Failedtoexecstart:null[Docker]ERR......
  • 记录 Windows 系统上配置 GitHub 的 SSH Key
    今天在拉取自己的github项目时,明明输入的账号和密码是正确的,从网页上可以正常登录github,但是拉取代码的时候,输入账号密码,死活提示验证失败。那就配下SSH得了。首先打开git......
  • Docker安装
    官方参考文档:InstallDockerEngineonDebian设置存储库下载所需工具:sudoaptupdate&&sudoaptinstallca-certificatescurlgnupglsb-release-y添加Dock......
  • java语言——跨平台原理,jre,jdk
    day1Java是一种混合的编译运行方式:编译+解释(虚拟机)java的跨平台:在虚拟机中运行(jvm)jdk:jvm,核心类库,开发工具(开发环境)jre:Java的运行环境 ......
  • docker常用
    docker镜像网址https://hub.docker.com/search?q=&type=imagehttps://hub.docker.com/后续......