一、Docker的安装与操作
Docker的安装、创建、等操作可以查看Docker 教程 | 菜鸟教程 (runoob.com),这里不再赘述。
常见问题1:**普通用户使用docker命令报错: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json”: dial unix /var/run/docker.sock: connect: permission denied?
原因:
docker进程使用Unix Socket而不是TCP端口,而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决方法:
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令。
#添加docker用户组(如果docker用户组已存在会提示)
sudo groupadd docker
#将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
#更新用户组
newgrp docker
#测试docker命令是否可以直接使用
docker ps
二、Buildx构建多平台镜像
1、Buildx 简介
Docker Buildx 是 Docker的CLI插件,来自于Moby BuildKit 。自从Docker 18.06 开始这个插件直接集成到了Docker build 中,直至成文之日,它仍处于Experimental状态,所以想使用它需要显式地开启它。
Buildx 是一个构建工具, 它可以帮助用户快速、高效地构建 Docker 镜像, 并支持多种平台的构建。使用 buildx, 用户可以在单个命令中构建多种架构的镜像, 例如 x86 和 ARM 架构, 而无需手动操作多个构建命令。此外, buildx 还支持 Dockerfile 的多阶段构建和缓存, 这可以大大提高镜像构建的效率和速度。
大致流程为: docker --> buildx -->builder(moby/buildkit:buildx-stable-1)–>image(arm64)
2、Buildx的安装
提示:如果已经安装了buildx,无需额外安装,可通过命令docker buildx version
确认其是否安装成功。
#在线安装docker-buildx
sudo apt-get install docker-buildx
#查看是否安装成功
docker buildx version
3、查看当前构建器支持的平台
#查看当前构建器的情况
docker buildx ls
# NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
#default * docker
# default default running v0.11.7+d3e6c1360f6e linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
#回显内容Platforms列中的linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386默认构建器支持的架构平台。
#如果默认构建器包含了所需的平台则跳过这一节,可以直接拉取对应架构平台的docker镜像。
#这里我们要创建arm64的docker,显然不支持,所以要重新创建一个构建器。
4、创建Buildx构建容器
#创建构建器,名为mybuilder,可以任意起名
docker buildx create --name mybuilder
#buildx使用新建的构建器
docker buildx use mybuilder
#初始化构建器(这个过程比较久)
docker buildx inspect --bootstrap
当初始化成功,会拉下来moby/buildkit:buildx-stable-1的镜像,并启动构建容器。通过 docker ps 查看如下:
root@hz:~# docker ps
root@hz:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba6651e07ab0 moby/buildkit:buildx-stable-1 "buildkitd" 5 weeks ago Up 50 minutes buildx_buildkit_mybuilder0
5、构建ARM64镜像
docker镜像命令参考Docker 教程 | 菜鸟教程 (runoob.com)
方法一
如果已经有arm64的docker image,可以直接导入image,启动docker。
导入容器
如果要导出其他设备的某个容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > ubuntu.tar
导入容器
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
(2) 获取镜像
Docker镜像的查询地址https://hub.docker.com/
#拉取arm架构镜像
docker pull --platform=arm64 ubantu:latest
6、启动docker验证架构
启动容器
$ docker run -it ubuntu /bin/bash
验证
#进入docker查看docker架构
uname -m
#aarch64
#退出docker,查看外部内核架构信息
exit
uname -m
#x86_64
到这里就完成了。
常见问题1:
**初始化构建器失败:**ERROR: Error response from daemon: No such image: moby/buildkit:buildx-stable-1
原因: Docker默认去https://registry-1.docker.io
拉镜像,因为不能联网,所有连接错误。
解决方法: 外网下载镜像,再导入内网。
# 外网节点拉取镜像
$ docker pull moby/buildkit:buildx-stable-1@sha256:273b61ca4f538c120c8555b4e7c59e903bd5bdfc72d93439e75f46fcf1f4e135
# 外网节点导出镜像
$ docker save -o moby_buildkit_buildx-stable-x-arm64.tar 9b3c7392ac9e
# 内网节点导入镜像
$ docker load -i moby_buildkit_buildx-stable-x-arm64.tar 9b3c7392ac9e
$ docker tag 9b3c7392ac9e moby/buildkit:buildx-stable-1
三、另一种方法:buildx和binfmt
Binfmt 使用了流行的容器技术——Docker,构建和分发模拟器。它可以构建并安装QEMU-user模拟器的本地版本,让你能够执行非本机架构的程序。该项目提供了便捷的命令行工具,用于安装、卸载和管理这些模拟器。此外,它还与 BuildKit 集成,为自动化构建过程中的多平台仿真提供支持。
Binfmt 对应的仓库名称是:tonistiigi/binfmt:latest
。
buildx的安装参考上面第二章。
1、在线安装binfmt
$ docker run --privileged --rm tonistiigi/binfmt --install all
# 验证模拟器是否安装成功
$ docker buildx ls
default docker
default default running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
# 查看某个,检查aarch64是否安装成功
$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64
flags: OCF
offset 0
magic 7f454c460201010000000000000000000200b7
2、离线安装
# 外网下载镜像,注意(如果你的内网环境机器是arm架构,就下载arm版本,如果你的内网环境机器是amd架构,就下载amd版本;这里我下载的是arm版本)
$ docker pull tonistiigi/binfmt:latest@sha256:01882a96113f38b1928a5797c52f7eaa7e39acf6cc15ec541c6e8428f3c2347d
# 导出镜像
$ docker save -o tonistiigi_binfmt_arm64.tar f1d8c13be37e
# 将导出的镜像上传至内网服务器
$ scp tonistiigi_binfmt_arm64.tar xxxx:/xxx
# 在内网机器执行如下命令,导入镜像
$ docker load -i tonistiigi_binfmt_arm64.tar
# 安装模拟器
$ docker run --privileged --rm tonistiigi/binfmt --install all
# 验证是否安装成功
$ docker buildx ls
default docker
default default running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
# 验证arm机器上的amd模拟器是否安装成功,则执行如下命令,输出结果包含enable即可
$ cat /proc/sys/fs/binfmt_misc/qemu-x86_64
enabled
# 如果你是amd机器,需要验证arm模拟器是否安装成功,则执行如下命令,输出结果包含enable即可
$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled