dockerMac m1 系统使用docker发布镜像

Posted summy001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerMac m1 系统使用docker发布镜像相关的知识,希望对你有一定的参考价值。

项目场景:

mac m1系统 

Docker Engine  v20.10.20

k8s 管理

阿里云镜像仓库

springboot


问题描述

正常情况下,我们使用docker构建镜像,发布到镜像仓库,k8s拉取镜像正常启动

但是由于我的电脑是M1系统,就出现了一些小问题,首先进行构建命令: 

docker打包镜像命令:

docker build -t imgaename:v1.0 .

注意最后有个点,默认使用 “上下文目录(Context)下的名为Dockerfile 的文件作为 Dockerfile”

然后push到阿里云,一切正常,这个时候使用k8s拉取镜像进行启动出现报错

exec /usr/bin/java: exec format error


原因分析:

这是因为系统架构的问题,mac M1系统是使用的arm架构,而我们服务器使用的是linux/amd架构,所以我们在打包时需要声明架构

在之前的版本中构建多种系统架构支持的 Docker 镜像,要想使用统一的名字必须使用 ​​​​​​​$ docker manifest 命令。

而在 Docker 19.03+ 版本中可以使用 $ docker buildx build 命令使用 BuildKit 构建镜像。

该命令支持 --platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。

而我下载的是v20.10.20所以是自带buildx

提示:

1、docker镜像有多种架构版本,而当我们执行docker pull命令时会根据当前服务器的架构自动拉取对应架构版本所以我们可以直接生成多版本,pull时正常使用即可

2、linux下载的docker也是没有buildx的,需要安装buildx,这里我是mac下载的desktop所以是自带的


解决方案:

由于 Docker 默认的 builder 实例不支持同时指定多个 --platform,我们必须首先创建一个新的 builder 实例。

使用 docker buildx ls 查看

NAME/NODE       DRIVER/ENDPOINT  STATUS  BUILDKIT PLATFORMS
default                          error            
desktop-linux   docker                            
  desktop-linux desktop-linux    running 20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

 创建新的builder实例并使用

docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master

在使用 docker buildx ls 查看

NAME/NODE       DRIVER/ENDPOINT  STATUS  BUILDKIT PLATFORMS
mybuilder-cn *  docker-container                  
  mybuilder-cn0 desktop-linux    running 1a7c480  linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default                          error            
desktop-linux   docker                            
  desktop-linux desktop-linux    running 20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

当然步骤也可以分开,直接创建在使用,如下:

docker buildx create --name mybuilder --driver docker-container 
#使用mybuilder
docker buildx use mybuilder

docker构建镜像

docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/imagename . --load

这时查看镜像生成成功

当然了,我这里不需要那么多端,只需要linux/amd64即可,所以不用设置多平台构建,那么也可以不用创建builder实例,直接使用默认的

docker buildx build --platform linux/amd64 -t imagename:v1.0 . --load  

--load 表示生成镜像在本地加载

--push表示生成镜像并推送到仓库

将镜像推送到云端检查

//登陆docker,并输入密码
docker login --username=username registry.cn-hangzhou.aliyuncs.com
//将docker本地构建的镜像打上标记
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/repostry/imagename:[镜像版本号]
//进行推送
docker push registry.cn-hangzhou.aliyuncs.com/repostry/imagename:[镜像版本号]

到此查看k8s拉取最新项目,启动,ok

总结:

docker构建镜像也要区分当前服务平台与使用镜像的平台架构是否一致,如果一致则正常使用,如果不一致要考虑使用buildx构建不同平台版本问题

Windows Docker 安装

win7、win8 系统

win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/

docker toolbox 是一个工具集,它主要包含以下一些内容:

Docker CLI 客户端,用来运行docker引擎创建镜像和容器
Docker Machine. 可以让你在windows的命令行中运行docker引擎命令
Docker Compose. 用来运行docker-compose命令
Kitematic. 这是DockerGUI版本
Docker QuickStart shell. 这是一个已经配置好Docker的命令行环境
Oracle VM Virtualbox. 虚拟机

下载完成之后直接点击安装,安装成功后,桌边会出现三个图标,入下图所示:

技术图片

点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。

如果系统显示 User Account Control 窗口来运行 VirtualBox 修改你的电脑,选择 Yes。

技术图片

$ 符号那你可以输入以下命令来执行。

$ docker run hello-world
 Unable to find image ‘hello-world:latest‘ locally
 Pulling repository hello-world
 91c95931e552: Download complete
 a8219747be10: Download complete
 Status: Downloaded newer image for hello-world:latest
 Hello from Docker.
 This message shows that your installation appears to be working correctly.

 To generate this message, Docker took the following steps:
  1. The Docker Engine CLI client contacted the Docker Engine daemon.
  2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
     (Assuming it was not already locally available.)
  3. The Docker Engine daemon created a new container from that image which runs the
     executable that produces the output you are currently reading.
  4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
     to your terminal.

 To try something more ambitious, you can run an Ubuntu container with:
  $ docker run -it ubuntu bash

 For more examples and ideas, visit:
  https://docs.docker.com/userguide/

Win10 系统

现在 Docker 有专门的 Win10 专业版系统的安装包,需要开启Hyper-V。

开启 Hyper-V

技术图片

程序和功能

技术图片

启用或关闭Windows功能

技术图片

选中Hyper-V

技术图片

1、安装 Toolbox

最新版 Toolbox 下载地址: https://www.docker.com/get-docker

点击 Download Desktop and Take a Tutorial,并下载 Windows 的版本,如果你还没有登录,会要求注册登录:

技术图片

技术图片

技术图片

2、运行安装文件

双击下载的 Docker for Windows Installer 安装文件,一路 Next,点击 Finish 完成安装。

技术图片

技术图片

安装完成后,Docker 会自动启动。通知栏上会出现个小鲸鱼的图标技术图片,这表示 Docker 正在运行。

桌边也会出现三个图标,入下图所示:

我们可以在命令行执行 docker version 来查看版本号,docker run hello-world 来载入测试镜像测试。

如果没启动,你可以在 Windows 搜索 Docker 来启动:

技术图片

启动后,也可以在通知栏上看到小鲸鱼图标:

技术图片


镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

请在该配置文件中加入(没有该文件的话,请先建一个):


  "registry-mirrors": ["http://hub-mirror.c.163.com"]

以上是关于dockerMac m1 系统使用docker发布镜像的主要内容,如果未能解决你的问题,请参考以下文章

Docker MAC 地址生成

Docker以https访问Harbor私有仓库

苹果 M1 上使用 Podman 替换 Docker Desktop

苹果 M1 上使用 Podman 替换 Docker Desktop

MacOS M1上的Docker kafka问题停留在配置上

docker