网站运营
位置:首页>> 网站运营>> Docker buildx构建多平台镜像并推送到私有仓库的方法

Docker buildx构建多平台镜像并推送到私有仓库的方法

作者:蓝胖子  发布时间:2022-01-12 22:53:14 

标签:Docker,buildx,镜像,私有仓库

引子

最近发现有ARM版Docker,hub.docker.com上也有ARM版本的镜像,但是ARM版本的Docker镜像构建是个问题。嵌入式程序可以在PC机上进行交叉编译,不知道Docker是否有交叉构建的方案。

方案

目前想到的Docker构建ARM镜像方法有如下几种。第三种就类似交叉编译。

  1. 使用ARM主机,安装ARM版本的Docker,docker build出来的就是ARM版本的镜像。

  2. 使用Linux的虚拟化软件,模拟ARM芯片+ Linux,例如qemu。

  3. 使用Docker试验功能buildx,可以构建多平台的镜像。

使用Docker buildx构建多个平台镜像

参考如下几个链接。
https://docs.docker.com/engine/reference/commandline/manifest/
https://docs.docker.com/buildx/working-with-buildx/
https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/

用到了两个docker的试验功能,使用时需要开启试验功能。

docker manifest,manifest是一个包含了镜像信息的文件。manifest list是一个镜像清单列表,用于存放不同os/arch的镜像信息。我们可以创建一个manifest list来指向两个镜像,然后可以支持多平台。

docker buildx,buildx是docker的一个插件,是下一代docker镜像构建。该插件通过qemu-user-static翻译不同平台的指令集,达到在x64上运行其他平台的程序。buildx实际使用了moby/buildkit:buildx-stable-1镜像进行多平台构建。

搭建docker registry多平台版本

参考如下链接,构建docker registry镜像。
https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/deploying-multi-architecture-docker-registry

搭建dns服务器,解决buildx bug

buildx插件不走本地hosts文件,必须走dns。这是个bug,https://github.com/docker/buildx/issues/218,社区也没人管。
解决方法:自建dns,把镜像的地址buildx.com指向registry的机器,后续用nginx。ubuntu有一个默认systemd-resolved,关闭之后在开启dnsmasq。

使用nginx代理解决命名问题

增加nginx代理同时支持HTTP和HTTPS。buildx这个插件强行使用了HTTPS,没有找到关闭的地方。
提示证书问题,证书不是这个域名的,解决方法: 重新生成一个证书,域名填自己的。
证书问题,不信任自签名证书,把自签名的证书加到buildx daemon容器的证书信任链中。https://github.com/docker/buildx/issues/80#issuecomment-533844117

nginx增加两个配置,解决客户端push时的几个问题。


# nignx.conf 配置
proxy_ignore_client_abort on; #忽略客户端告警
client_max_body_size 0;  #上传文件大小不限制

# 虚拟主机配置
server {
 listen 443;
 server_name buildx.com;
 ssl on;
 ssl_certificate crt/server.crt;
 ssl_certificate_key crt/server.key;
 ssl_session_timeout 5m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
 ssl_prefer_server_ciphers on;
 location / {
   proxy_pass http://192.168.1.11:81;
 }
}

server {
 listen 80;
 server_name buildx.com;
 location / {
   proxy_pass http://192.168.1.11:81;
 }
}

设置本地Docker环境

本地Docker需要开启实验功能。

  1. 在/etc/docker/daemon.json中配置 "experimental": true,重启Docker。开启Docker daemon的实验功能。

  2. 在本地执行export DOCKER_CLI_EXPERIMENTAL=enabled,开启Docker Client的实验功能。

  3. 使用docker version查看实验功能是否开启。

  4. 执行docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3,开启内核binfmt_misc功能,可以在当前平台上执行多平台的程序。

  5. 查看是否支持aarch64程序。cat /proc/sys/fs/binfmt_misc/qemu-aarch64

  6. 此时本地的docker可以运行各种平台的docker容器。比如arm64。可以使用如下命令测试。


# 拉取arm64版本镜像并运行
docker pull --platform arm64 alpine:3.10
docker run --rm -it alpine:3.10 sh

制作基础镜像

可以从hub.docker.com中获取多个平台的版本,生成manifest list,上传的registry中。


# pull arm64版本、改名、上传。 具体镜像是否支持多平台,可以到hub.docker.com上看。
docker pull --platform arm64 centos:7
docker tag centos:7 buildx.com/base/centos-arm64:7
docker push buildx.com/base/centos-arm64:7
# pull amd64版本、改名、上传
docker pull --platform amd64 centos:7
docker tag centos:7 buildx.com/base/centos-amd64:7
docker push buildx.com/base/centos-amd64:7
# 创建manifest list、上传。
docker manifest create --insecure buildx.com/base/centos:7 buildx.com/base/centos-amd64:7 buildx.com/base/centos-arm64:7
docker manifest push --insecure buildx.com/base/centos:7

构建业务镜像


# buildx 可以指定多个平台,但是要求Dockerfile中的FROM镜像必须有对应版本的。
# buildx 打包的镜像不会在本地存储,加--push,上传docker仓。或者可以使用--output指定输出方式。
docker buildx build --platform linux/amd64,linux/arm64 -t buildx.com/base/java-base:openjdk-8-centos7 . --push

来源:https://segmentfault.com/a/1190000021529637

0
投稿

猜你喜欢

  • 最近在研究Linux下Firewall的配置,发现配置好防火墙以后ftp就有问题了,一直都不能够用Filezilla 和 CuteFTP登录
  • Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就
  • 网站推广方法有很多种,本文简单地价绍一下今天流行的网站推广方法。方法一:搜索引擎不可否认搜索引擎在网站推广中的重要性仍然是第一位,新网站可以
  • 很久没更新了,今天(12月11日)新增三个网摘代码,分别是飞豆、抓虾、鲜果,这些都是著名的网摘网站。你可以在此篇文章最后看到新增的网摘代码。
  • 首先我先介绍下,我是站长网站长特训班的第一期学员。来这里已经3天了,学了很多在网上,在家里都学不到的经验,上午经过我们第一期的学员与铁风筝老
  • 今天向往常一样打开我的雅虎邮箱,看到一个标题是《phpwinds与贵站建议长期合作关系!》,phpwinds?是那个著名的php论坛吗?不过
  • 从事中文点击网赚的站长可以说是一个特殊的站长群体,这个群体不被主流网站看好,但其内部却是热闹非凡。很多的人从事网上的兼职活动都是从中文点击网
  • 一、SEO的工作原理一谈到SEO, 许多不是非常了解SEO的朋友容易想把它和“作弊”这个词扯到一块儿
  • 在各大知名网站投稿、写软文宣传是当今比较有效的宣传方法,很多站长都在用这个方法推广网站。但是如何投稿才能获得更大的宣传效果呢?这里面是有学问
  • 先看效果图:1.新建一个文件:850*800,底层填充#272727,再新一个图层1,利用矩形选区画一个矩形框,填充#121212.2.在图
  • 1、配置Ftp允许Root登录修改/etc/ftpusers,去掉root2、如果希望实现Root用户Ftp后可以切换到/目录一般用户只能切
  • 百度热门关键词能带来很大的流量,这是大家有目共睹的事情。看看百度指数,如“货架”、“手机”这些词每天的检索量都过千过万。现在SEO教程都是“
  • 谷歌与微软在操作系统的正面竞争已经步入倒计时阶段。谷歌产品副总裁Sundar Pichai首次对外透露,谷歌Chrome OS操作系统最大的
  • 笔者服务于一家小的电脑公司,随着业务的不断拓展,公司传统办公模式的弊端逐步显露出来:员工经常出差导致命令无法迅速上传下达;下级汇报工作时负责
  • 6、能够使用一个磁盘的第一个分区作为裸设备吗?可以,但是不推荐。在Unix的比较旧的版本是银行,磁盘的第一个分区常常包含这个磁盘的一些信息,
  • 目前,许多服务器设备都安装和配置了硬件RAID卡,通过配置硬件RAID卡来实现二个以上磁盘的容错功能。笔者在工作中遇到有一台服务器设备,没有
  • 7字开头的公交车在重庆可谓家喻户晓,私家车速度快、乱停乱靠的特点在其身上发扬的无比光大。由于其安全系数是所有公交车中最低的,所以我很少坐&a
  • SEO自古以来都是以搜索引擎权重为重或者是(目的)的,无论哪里或者哪个SEO的目的也不过如此而已,SEO万变不离其宗,始终也离不开几大烹调要
  • 服务器不仅仅是企业网络设备的中枢,也是企业软件及数据库应用的主体。在实际运行中服务器经常会出现这样或那样的故障,软件的或者硬件的。很多故障是
  • 大家都知道一般搜索引擎更新友情链接列表的时间是很长的,其实在搜索引擎内部更新友情链接是即时的,为了方便给站长分析外链的构建状态,其实利用Go
手机版 网站运营 asp之家 www.aspxhome.com