image

容器镜像

docker image driver: aufs, btrfs, devicemapper, overlay.

buildx

使用qume:

// 安装bitfmt
docker run --privileged --rm tonistiigi/binfmt --install all

// 查看支持的平台
ls -l /proc/sys/fs/binfmt_misc/qemu-*

查看版本

docker buildx version

管理builder instance

docker buildx create
--append 添加node到builder实例。
--leave 从builder实例删除node
--driver Driver to use("docker", "docker-container", "kubernetes")
--name
--use
--node
--platform 
--bootstrap 启动实例(以容器的形式启动)

// 以本地是amd64为例,创建一个实例.
docker buildx create --use --bootstrap --platform linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/arm/v7,linux/arm/v6 --name canux-builder

// 如果没有qumu,可以把不同平台的远程机器加到builder实例.
docker buildx create \
--name local_remote_builder \
--append --node <my-arm-server> \
--platform linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 \
ssh://user@<my-arm-server> 

docker buildx rm

docker buildx stop

docker buildx inspect

docker buildx use

// 查看当前可用的builders
docker buildx ls

构建多平台镜像

docker buildx build --platform <p1,p2> ...

// 一次编译多个平台的镜像直接push到registry。
docker buildx build --platform linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/arm/v7,linux/arm/v6 --push -t name/target:tag .

// 编辑成不同的image 
docker buildx build -o type=docker --platform linux/amd64 -t name:1.0.0 .
docker buildx build -o type=docker --platform linux/arm64 -t name:1.0.0-linux-arm64 .

Overlay

最下层是一个 lower 层,也就是镜像层,它是一个只读层;

右上层是一个 upper 层,upper 是容器的读写层,upper 层采用了写实复制的机制,也就是说只有对某些文件需要进行修改的时候才会从 lower 层把这个文件拷贝上来,之后所有的修改操作都会对 upper 层的副本进行修改;

upper 并列的有一个 workdir,它的作用是充当一个中间层的作用。也就是说,当对 upper 层里面的副本进行修改时,会先放到 workdir,然后再从 workdir 移到 upper 里面去,这个是 overlay 的工作机制;

最上面的是 mergedir,是一个统一视图层。从 mergedir 里面可以看到 upper 和 lower 中所有数据的整合,然后我们 docker exec 到容器里面,看到一个文件系统其实就是 mergedir 统一视图层。

# 挂载到overlay
mount -t overlay -o lowerdir=/path/lower,upperdir=/path/upper,workdir=/path/work overlay /path/di

scratch

scratch是空白镜像,一般用于基础镜像构建.比如制作alpine/ubuntu/debian/busybox镜像.

ubuntu/debian

Hash Sum mismatch:

RUN set -ex \
&& apt-get clean \
&& apt-get update -o Acquire::CompressionTypes::Order::=gz \
&& apt-get update \
&& apt-get install -y --allow-unauthenticated --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*

centos/fedora

buildpack-deps

在ubuntu/debian基础上安装一些工具,比ubuntu/debian镜像更大.

https://github.com/docker-library/buildpack-deps

busybox

https://github.com/docker-library/busybox

alpine(推荐)

很多语言的都是基于alpine: python-version:alpine-version, golang-version:alpine-version.

一个基于musl和busybox的linux发行版.

https://www.alpinelinux.org/

alpine比distroless尺寸大,包含包管理和shell,方便调试.

alpine使用musl代替glibc会导致有的程序无法运行, 解决:

# mkdir /lib64
# ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

注意wget 部分参数不可用.

distroless

google提供的只包含运行时的精简镜像.

缺点是没有包管理和shell,不方便调试.

https://github.com/GoogleContainerTools/distroless

slim

减小image大小,适用于web程序.

<https://github.com/docker-slim/docker-slim