• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > Docker buildx构建多平台镜像并推送到私有仓库的方法

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

作者:蓝胖子 字体:[增加 减小] 来源:互联网

本文主要包含Docker,buildx,多平台镜像,Docker,镜像推送到私有仓库等服务器相关知识,蓝胖子 希望可以进行参考

引子

最近发现有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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • 详解VMware接入Openstack—使用Openstack创建vCenter虚拟机
  • 详解Centos7 下建立 Docker 桥接网络
  • 详解在Ubuntu 14.04安装和使用Docker
  • 详解Docker容器可视化监控中心搭建
  • 利用Docker搭建本地https环境的完整步骤
  • 在Docker容器中不需要运行sshd的原因浅析
  • docker在已有的tomcat镜像上打新的镜像的Dockerfile编写说明介绍
  • Ubuntu 18.04 LTS安装KVM虚拟机的方法步骤
  • 如何为Go程序创建一个最小的Docker Image详解
  • Docker安装(Ubuntu 64bit)的方法步骤

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 开源技术促服务器虚拟化市场持续升温
    • 通过提前bake Docker镜像加快基础设施的启动速度
    • 在CentOS 7上安装Docker环境的方法与注意事项
    • Dockerfile 部署java web的环境详解
    • Docker中的镜像详细介绍
    • Docker 实现浏览器里开发Android应用的功能
    • virtualbox中ubuntu和windows共享文件夹设置教程
    • XenServer使用ISO安装虚拟机系统的方法
    • 服务器网络虚拟化应用现状分析
    • OpenStack Tempest的正确的打开方式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有