什么是Docker?
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
什么是Buildx?
Docker是一种流行的部署工具,使我们能够打包和运行应用程序。由于采用率很高,需要根据不同的要求扩展功能。因此,为了实现这一目标,第三方使用了docker 插件。
例如,如果我们希望数据能够跨不同主机保存数据,我们可以使用卷
插件。另一个常用的插件是Docker buildx
。它通过使用 BuildKit 构建器扩展了镜像的构建能力。因此,通过该插件,我们可以为不同的平台和架构构建镜像。此外,它还支持具有自定义上下文的并行多阶段构建。
1.使用docker buildx的前提
首先,为了运行buildx ,我们需要安装 Docker。Docker buildx支持从Docker engine19.00 开始提供。
首先检查我们的 Docker 版本:
[root@centos ~]# docker --version
Docker version 24.0.5, build ced0996
[root@centos ~]#
2.升级Docker服务的主机内核
docker server端宿主机的内核为5.x ( centos7 , 默认内核版本3.10)
##升级操作
### 安装kernel源
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
### 查看可用内核
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
### 安装长期支持稳定版
yum --enablerepo=elrepo-kernel install -y kernel-lt
### 查看内核列表编号
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
### 修改默认内核
grub2-set-default 0
### 重启
reboot
3.准备qemu环境,宿主机执行
# -p 为持久生效
docker run --rm --privileged docker.bamboocloud.com/internet/multiarch/qemu-user-static --reset -p yes
# 如果上一步没报错
cat /proc/sys/fs/binfmt_misc/qemu-aarch64
# 输出应该如下 (3.x内核 -p参数会报错且flags一项为空)
enabled
interpreter /usr/bin/qemu-aarch64-static
flags: F
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
镜像:资源下载
4.使用buildx构建镜像
# 创建一个实例
docker buildx create --name buildx --driver-opt=image=docker.bamboocloud.com/library/moby/buildkit:buildx-stable-1 --use
# 查看支持的平台
docker buildx inspect --bootstrap # 如果成功的话,如下图所示,platforms会有多个架构,否则只有amd64和386
# 构建
## 构建的时候会在docker server端,在测试场景则是docker-dind里面运行一个容器(第一步指定的那个buildkit镜像),多平台构建实际是由该容器完成,所以镜像的下载也是由该容器完成。如果私有仓库域名是用的hosts指定,可能会遇到拉取失败
#docker buildx build --platform=linux/amd64,linux/arm64 -f Dockerfile .
docker buildx build --push --provenance=false -t s4.aliyun.com/nginx:1.24 --platform=linux/amd64,linux/arm64 .