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

来源:脚本之家  责任编辑:小易  

青云QingCloud日前宣布推出Docker镜像仓库服务。该服务包括Docker公有镜像仓库和Ha

引子

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

  目前系统或基础语言的镜像选官方的就可以了,多数情况下以他们为 base image 做自己的镜像

方案

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

    使用ARM主机,安装ARM版本的Docker,docker build出来的就是ARM版本的镜像。 使用Linux的虚拟化软件,模拟ARM芯片+ Linux,例如qemu。 使用Docker试验功能buildx,可以构建多平台的镜像。

Dockerfile结构dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作

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

  初次安装部署好docker后,大多数镜像可以从DockerHub 提取,但是大多数人都希望自己可

参考如下几个链接。

Windows 10系统要取消开机密码,需打开“设置”选项,然后找到“账户”设置,然后就可以取消开机

https://docs.docker.com/engine/reference/commandline/manifest/

首先谈谈吴亦凡的外形:吴亦凡4675px的身高条件,足以达到男模的基础要求,其次他的长相相较于鹿晗、黄子韬等其他EXO的姐妹们,更加硬朗且具有时尚感,还有洋气时髦的潮流气质加持,似乎改革开放以来我国大陆地区还没出现过这么一个不带土腥气的偶像。简单点总结,也即“颜正条顺”。当然,想要搞时尚,并非只要脸好身材棒就混得好的。否则娱乐圈人人都能混得风生水起,也不至于如今各路明星为了打造时尚人设竞争日臻白日化、为了时尚资源争得头破血流。其次,吴亦凡拥有新生代敢于大胆尝试、积极改变的心态,同一般正青春的青年人一样,喜欢搞点不一样的。于是仗着有颜任性,跟那些打安全牌不出错的人相比,吴亦凡多了一份敢于尝试的果

https://docs.docker.com/buildx/working-with-buildx/

银元的延展性和弹性的综合作用有利于振动,侧吹银元时等于给了银元边缘一个侧向力,银元等半径的各个部分相互间产生了共振,共振通过空气传播后形成了你能听到的声音。能吹响不是鉴定银元的手段,因为只要是金属的,例如铁,都会产生共振,都会吹出响声。盖因当年银元造假手法不多,不外加铜、加铅、加锡、加锌。由于当年的银币铸造工艺相较现在偏简单,唯一的防伪标识只有翻铸法一种。私铸难度不大。所以对银元真伪的辨识要从工艺以外的材质上判断。掺杂了不同材质的银元,密度就不同。在基本相似的受力方式下产生的振动,震颤声音和共鸣声音自然是不同的。这和现在的共振音箱放在不同平面上发出不同的音质是一个道理。加铜银元震动之后声音尖脆

https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/

不超过15万!不考虑日韩!15万减去9000购置税和6000保险和2000杂费,你的裸车预算只有13.3万左右!说实话就这个钱,买日系SUV也只能勉强买那种小型SUV【其实就是小型车换个壳】国产神车哈弗H6显然不省油!就不推荐了,博越嘛口碑可以!可是油耗不比哈弗低。长安CS75太久没更新了不推荐东风标致-标致2008、福特翼博嘛太小了!不过还是可以推荐推荐“德国豪华”宝沃汽车-宝沃BX5德国血统与简约设计的交相辉映,动静之间的完美融合,传承经典的鹰翼式设计,呈现完美动感的车身姿态。宝沃BX5,动态宽跑设计和鲜明个性的完美融合。更有鹰翼式环体座舱及全知觉智能交互系统,让您在纵情驰骋中尽享豪华互联

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

既然被邀请我就发表一下自己的观点吧!我是一个才当爸爸7个月的男士,作为孩子妈妈抛弃你们,不知道有什么原因,但是客观的说我觉得应该考虑几个问题再做决定!第一,孩子十岁了,他有了一定的思维,他对于你再找一个会是什么看法需要充分沟通吧!第二,你找的这个女士对你的孩子是什么看法,他能容忍吗?能给他母爱吗?甚至不会当面一套被着一套吗?第三,如果这个女士还没有怀过孩子,你们在一起肯定女方会想要个孩子,当你们的孩子出生了,会不会冷落到你现在的这个孩子,或者现在这个孩子自己把自己边缘化呢?我们都知道,单亲带孩子总会有弊病,父爱是威严的,母爱是慈祥的,每个人对自己的孩子都是一种骨子里的爱!所以在孩子成长过程中缺

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需要开启实验功能。

    在/etc/docker/daemon.json中配置 "experimental": true,重启Docker。开启Docker daemon的实验功能。 在本地执行export DOCKER_CLI_EXPERIMENTAL=enabled,开启Docker Client的实验功能。 使用docker version查看实验功能是否开启。 执行docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3,开启内核binfmt_misc功能,可以在当前平台上执行多平台的程序。 查看是否支持aarch64程序。cat /proc/sys/fs/binfmt_misc/qemu-aarch64 此时本地的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

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

如何从docker将image镜像到私有的registry

将ubuntu push到私有registry

docker push rd-server:5000/ubuntu

如何将ubuntu的所有分支都镜像到自己的私有仓库?

1.先打TAG,把需要的版本打上标签,然后进行推送

语句大概是这个样子的:

docker tag eb601b8965b8 rd-server:5000/ubuntu:raring

docker tag eb601b8965b8 rd-server:5000/ubuntu:13.04

docker tag 9f676bd305a4 rd-server:5000/ubuntu:saucy

docker tag 9f676bd305a4 rd-server:5000/ubuntu:13.10

docker tag 9cd978db300e rd-server:5000/ubuntu:precise

docker tag 9cd978db300e rd-server:5000/ubuntu:latest

docker tag 9cd978db300e rd-server:5000/ubuntu:12.04

docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:lucid

docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:10.04

docker tag 5ac751e8d623 rd-server:5000/ubuntu:quantal

docker tag 5ac751e8d623 rd-server:5000/ubuntu:12.10

开始推送

docker push rd-server:5000/ubuntu

如果返回的内容的最后一行是下面这个样子的

2014/03/14 08:22:14 push: }

请反复执行,没错,不要怀疑,请循环一直反复执行下去

docker pull rd-server:5000/ubuntu

直到不再出现 push:

}的字样

不知道这是docker的BUG还是本身设计是这样的,需要反复多次push才能将完整的tag推送到private

registry里,否则在客户端下载的时候总会提示某些image找不到,个人猜测可能是这么设计的,因为docker

image比较大,而一个repo会有很多的块文件,每次push的时候只Push一个块,好了,猜测就道这,活还是得干,所以,写个脚本解决手工的问题吧。

#!/bin/sh

#

#Copyright (c) 2014 ZhengXujin xujinzheng@gmail.com

#

server="127.0.0.1:5000"

index_repo_name="username/ubuntu"

private_repo_name="ubuntu"

echo "\n"

echo " ## ."

echo " ## ## ## =="

echo " ## ## ## ## ==="

echo " /""""""""""""""""\___/ ==="

echo " ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~"

echo " \______ o __/"

echo " \ \ __/"

echo " \____\______/"

echo "\n"

idx=0

is_continue=1

docker images|grep -q "$server/$private_repo_name"

if [[ $? -ne 0 ]]; then

docker images|grep $index_repo_name|awk -F" " '{printf("docker tag %s %s/%s:%s\n",$3,"'$server'","'$private_repo_name'",$2)}'|bash

fi

while [ $is_continue -eq 1 ]

do

docker push $server/$private_repo_name

is_continue=$?

let idx=$idx+1

echo "$(tput setaf 1)continue push, $idx times pushed. $(tput sgr 0)"

done

如何将本地docker 镜像上传到我的私有仓库

docker越来越炙手可热,如果你的团队已经准备开始使用docker,那么私有仓库是必不可少的东西,首先是可以帮助你加快从服务器pull镜像的速度,其次也可以帮助你.你不想把镜像放到公共的 Docker Registry 上...启动服务器之前,我们先上传 Ubuntu cloud ima.

docker-java如何将本地上传的镜像包重新打包并push至指定的镜像仓库

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

dockerClient客户端

Docker Daemon守护进程

Docker Image镜像

DockerContainer容器[2]

起源

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。

Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。

一款开源软件能否在商业上成功,很大程度上依赖三件事 - 成功的 user case(用例), 活跃的社区和一个好故事。 dotCloud 自家的 PaaS 产品建立在docker之上,长期维护且有大量的用户,社区也十分活跃,接下来我们看看docker的故事。

环境管理复杂 - 从各种OS到各种中间件到各种app, 一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对。

云计算时代的到来 - AWS的成功, 引导开发者将应用转移到 cloud 上, 解决了硬件管理的问题,然而中间件相关的问题依然存在 (所以openstack HEAT和 AWS cloudformation 都着力解决这个问题)。开发者思路变化提供了可能性。

虚拟化手段的变化 - cloud 时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。然而无论是KVM还是Xen在 docker 看来,都在浪费资源,因为用户需要的是高效运行环境而非OS, GuestOS既浪费资源又难于管理, 更加轻量级的LXC更加灵活和快速

LXC的移动性 - LXC在 linux 2.6 的 kernel 里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于KVM之类image和snapshot的概念)。docker 就在这个问题上做出实质性的革新。这是docker最独特的地方。

VM技术和容器技术对比

面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。[3]

Docker面向对象

容器

对象

镜像

Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。

Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。[4]

特性

在docker的网站上提到了docker的典型场景:

Automating the packaging and deployment of applications(使应用的打包与部署自动化)

Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)

Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)

Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)

由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。

PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础

因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来

因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源。

如何进行Docker镜像打包和节点推送

当想让一个容器做两件事情,或者使一个Docker镜像包含来自两个不同镜像的依赖库时,就需要知道每个镜像的Dockerfile。本文介绍了如何通过docker history命令来对Docker镜像进行反向工程,得到它们的Dockerfile,并组织到一个Dockerfile里然后build,从而实现想做的事情。

常言道,“不要重复发明轮子!”

在使用Docker时,构建自己的镜像之前,最好在Docker Hub寻找一些可以直接使用的镜像做练习。把软件架构分布到一系列容器中,每一个容器只做一件事情,这样的效果非常好。构建分布式应用的最好的基石是使用来自Docker Hub的官方镜像,因为可以信任它们的质量。

在某些情况下,可能想让一个容器做两件不同的事情。而在另外一些情况下,可能想让一个Docker镜像包含来自两个不同镜像的依赖库。如果有每个镜像的Dockerfile,这是非常简单的。将它们组织到一个Dockerfile里然后build就行。

然而,大多数时间都在使用Docker Hub上准备好的镜像,不会有它们的源Dockerfile。我花时间找一个可以合并(或flatten)两个不同Docker镜像的工具,当然没有它们的Dockerfile。也就是说在找一个能做下面这件事的东西:

Docker推送镜像到私有仓库,https必须要使用443端口吗?

私有仓库部署在公司内网,由于公司网络*,无法开放443端口,所以https使用的5000端口,但是在push镜像的时候,就报443连接不上了

  • 本文相关:
  • docker 查询或获取私有仓库(registry)中的镜像的方法
  • docker私有仓库管理和删除本地仓库中的镜像
  • docker上传镜像至私有仓库的方法示例
  • 使用docker registry镜像创建私有仓库的方法
  • 浅谈关于docker容器互联的初步实践
  • 详解docker守护进程的配置及日志
  • 将博客迁移至docker纪实
  • docker命令行入门大全(这18条,你不得不知)
  • docker machine是什么?
  • docker daemon远程连接设置详解
  • docker + nodejs + kafka + redis + mysql搭建简单秒杀环境
  • 解决docker pull被复位出现的问题
  • docker实现mariadb分库分表及读写分离功能
  • linux上安装docker(非常简单的安装方法)
  • 如何从docker将image镜像到私有的registry
  • 如何将本地docker 镜像上传到我的私有仓库
  • docker-java如何将本地上传的镜像包重新打包并push至指定的镜像仓库
  • 如何进行Docker镜像打包和节点推送
  • Docker推送镜像到私有仓库,https必须要使用443端口吗?
  • docker镜像如何实现共享
  • DockerHub里的镜像太多了,怎么选择
  • 如何使用Dockerfile构建镜像
  • 如何提交docker镜像到DockerHub
  • 如何将镜像推送到Docker Hub
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved