image

容器镜像

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

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