专栏首页jeremy的技术点滴生成多平台docker镜像

生成多平台docker镜像

工作中需要在一台x86服务器从写好的golang程序源码生成linux/amd64linux/arm64 docker镜像,查阅了下资料,这里记录一下操作过程。

安装docker

查阅docker官方文档,需要使用buildx,而Docker 19.03版本已经捆绑了buildx,方便起见,这里就直接使用19.03版本的docker了,过程如下:

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 列一下可安装的docker版本
$ yum list docker-ce --showduplicates | sort -r

# 安装19.03.2版本的docker
$ sudo yum install docker-ce-19.03.2 docker-ce-cli-19.03.2 containerd.io

# 启动docker服务
$ systemctl start docker

安装qemu-user-static

为了让在x86上可以运行arm64的docker镜像,这里需要安装qemu-user-static,过程如下:

$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

创建构建多平台docker镜像的构建器

首先打开docker-cli的experimental开关:

$ mkdir ~/.docker
$ cat << EOF > ~/.docker/config.json
{
  "experimental": "enabled"
}
EOF

创建并启动构建器:

# 创建构建器
$ docker buildx create --name builder --node default --use
# 启动构建器
$ docker buildx inspect builder --bootstrap
# 观察下当前使用的构建器及构建器支持的cpu架构,可以看到支持很多cpu架构
$ docker buildx ls

编写脚本生成多平台docker镜像

假设有一个普通的golang程序源码,我们已经写好了Dockerfile生成其docker镜像,如下:

# Start from the latest golang base image
FROM golang:latest as go-builder

# Add Maintainer Info
LABEL maintainer="Jeremy Xu <jeremyxu2010@gmail.com>"

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy go mod and sum files
COPY go.mod go.sum ./

# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN go mod download

# Copy the source from the current directory to the Working Directory inside the container
COPY ./cmd ./cmd

# Build the Go app
RUN go build -o output/demo ./cmd

# Start from the latest alpine base image
FROM alpine:latest

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy execute file from go-builder
COPY --from=go-builder /app/output/demo /app/demo

# Set docker image command
CMD [ "/app/demo" ]

那么现在只需要使用两条命令,即可生成linux/amd64linux/arm64 docker镜像,如下:

# 生成linux/amd64 docker镜像
$ docker buildx build --rm -t go-mul-arch-build:latest-amd64 --platform=linux/amd64 --output=type=docker .
# 生成linux/arm64 docker镜像
$ docker buildx build --rm -t go-mul-arch-build:latest-arm64 --platform=linux/arm64 --output=type=docker .

最后检查下生成的docker镜像:

# 运行下linux/amd64的docker镜像,检查镜像的cpu架构
$ docker run --rm -ti go-mul-arch-build:latest-amd64 sh
/app # ./demo
Hello world!
oh dear
/app # uname -m
x86_64
/app # exit

# 运行下linux/arm64的docker镜像,检查镜像的cpu架构
$ docker run --rm -ti go-mul-arch-build:latest-arm64 sh
/app # ./demo
Hello world!
oh dear
/app # uname -m
aarch64
/app # exit

本操作指引中涉及的示例代码、脚本见github项目

Done.

参考

  1. https://docs.docker.com/install/linux/docker-ce/centos/
  2. https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images
  3. https://github.com/docker/buildx
  4. https://github.com/multiarch/qemu-user-static
  5. https://www.callicoder.com/docker-golang-image-container-example/
  6. https://github.com/docker/buildx/issues/138

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用10分钟生成多平台docker镜像?

    ? 工作中需要在一台x86服务器从写好的golang程序源码生成linux/amd64、linux/arm64 docker镜像,查阅了下资料,这里记录一下操...

    腾讯云TStack
  • 一次构建多平台docker镜像

    Linux 有很多平台,有没有办法只构建一次就能构建出所有的平台镜像?答案是有的,下面介绍的工具刚好能解决这个问题。

    YP小站
  • Docker 学习笔记--通过父镜像生成镜像

    一般情况下我们会通过已有镜像(父镜像)生成新的镜像,这个时候我们就需要使用到 FROM 命令。父镜像直接影响了生成新景象的大小和功能。我们可以把基础镜像或者普通...

    喵叔
  • TKEStack适配ARM架构之路

    腾讯TKEStack作为面向私有云业务场景的开源容器平台,应对的场景也会比较多样,比如国产服务器有一大阵营是基于arm架构的,那在国产化趋势下,客户的服务器架构...

    哈里
  • 多平台容器镜像构建就看这一篇

    孔矾建,腾讯高级工程师。多年云原生技术实践经验,聚焦容器镜像与存储领域,负责腾讯云容器镜像仓库产品开发,Harbor 社区 Maintainer,《Harbo...

    腾讯云原生
  • 容器镜像仓库之选:企业级容器registry Harbor实践(上)

    目录: 1.背景 2.开源Docker Registry的不足 3.新的选择--Harbor 4.Harbor的使用 背景 公司于去年启动了新一代数字化企业云平...

    yuanyi928
  • 马哥金牌分享 | Docker在云家政的应用

    本文是由运维专家、马哥教育特约讲师Fighter分享的《Docker在云家政的应用》的文字整理版。 大家晚上好,我是Fighter,今晚由我给大家分享《Dock...

    小小科
  • Docker系列之原理简单介绍

    Docker是一个开源的应用容器引擎;是一个轻量级容器技术; Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可...

    SmileNicky
  • 跨平台构建 Docker 镜像新姿势,x86、arm 一把梭

    在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上。特别是 Docker 席卷全球之...

    米开朗基杨

扫码关注云+社区

领取腾讯云代金券