2. 镜像ID是从哪来的

准备工作

这句话好像被说过无数次了, 以至于所有人都知道镜像的确是分层的, 在上面一节我们说了多层镜像是如何merge成一个统一的目录结构. 这一节我们再由顶向下看看实际操作中镜像是怎么玩的. 首先我们将Docker的文件系统 (从默认的overlay2) 切换成传统的 aufs 模式:

# 确认一下你的系统是否支持aufs挂载模式
$ grep aufs /proc/filesystems
nodev   aufs

# 指定Docker使用aufs模式启动
$ echo '{"storage-driver": "aufs"}' > /etc/docker/daemon.json

# 重启Docker
$ systemctl restart docker

# 检查Docker是不是按照aufs模式挂载
$ docker info | grep aufs
Storage Driver:  aufs
Root Dir:        /var/lib/docker/aufs

# 拉个镜像当示例, 我们选择最简单的busybox
$ docker pull busybox

下面开始整活👇

镜像ID是怎么决定的

提前说一下, 本节会涉及一大堆镜像层ID, 看起来会比较蛋疼

这回搞真的了, 我们看看docker是怎么玩的, 我们可以看到这个镜像分成两层, 其中顶层的ID被拿来当成镜像ID, 换句话说, 如果我们制造一个镜像, 我们就拿它顶层的ID当做镜像ID, 验证一下:

那么顶层的ID又是怎么计算出来的呢?

懂了, f6f 就是这个镜像的参数, 一个大json, 然后我们把这个json经过sha256计算就能拿到这一层的镜像ID, 因为每个镜像参数是唯一的, 因此sha256 → 镜像层ID一定是唯一的

Last updated

Was this helpful?