镜像的介绍
Docker 镜像含有启动容器所需要的文件系统及其内容,镜像采用分层构建机制,最底层为Bootfs,其之为rootfs
- bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源,
- rootfs:(如图也就是一些/dev /proc /bin)位于bootfs之上表现为docker容器的根文件系统,传统模式中,系统启动之时,内核挂载rootfs时会将其挂载为只读模式,完整性自检完成后,将其挂载为读写模式。docker中rootfs由内核挂载只读模式,而后通过联合挂载技术额外挂载一个可写层(写时复制)
其中位于上层的是父镜像层,最下面一层是基础镜像,最上层的是“可读写层(容器层)” 其余层都是“只读层(镜像层)”,删除容器后可写层一定会被删除(所以一般会把数据挂载宿主机上),所以容器的改动,都只会发生在容器层,其他层都是可读的
一些细节:
1、添加文件:新文件会添加在容器层中
2、读取文件:从上往下找,在镜像层找到后,会复制到容器层
3、修改文件:与读文件类似,在下层找到后复制到容器层才能修改
4、删除文件:同上
一些问题:
为什么要分层?
答:共享资源,删少服务器存储大量镜像时占用大量资源
修改了一个容器的一层,其他容器会不会有影响?
答:不会,因为写时复制机制
联合挂载技术
AUFS:高级多层统一文件系统用于为linux文件系统实现联合挂载,aufs是unionfs的重新实现(貌似是unionfs的代码写的太烂了),Docker 最初用aufs作为容器文件系统层,不过不同的linux系统会有不同的存储后端,如btrfs,devicemapper,overlayfs,devicemapper(性能很差)
ps:目前推荐overlay2也是默认的,之前是使用aufs
Docker Registry
Docker Registry 是存放镜像仓库的的地方,包括镜像的层次结构和元数据,在启动时docke daemon 会试图从本地获取,本地找不到就会从Registry(可配置)中下载该镜像
Docker Registry 分类
- Sponsor Registry:第三方 registry供客户和Docker社区使用
- Mirror Registry: 第三方 registry只让客户使用
- Vendor Registry: 由发布镜像的供应商提供
- Prvate Registry: 私有仓库
私有仓库的优势:快,不占带宽,私有性,方便定制
私有仓库快,不占带宽,方便定制
Docker Registry 分类的构成
Respository:
- 某个特定镜像的所有版本组成
- 一个Registry 可以存储多个Repository仓库名 = "用户名/仓库名"也分为用户名和仓库名,每个残酷又可以与多个tag,每个标签对应一个镜像
Index:
- 维护用户账户,镜像的校验以及公共命名空间信息
- 为Registry提供了一个完成用户认证等功能的检索接口
Docker Registry
- 仓库中的仓库通常由开发人员制作,然后推送到registry 中一些基础镜像是由工作人员制作的
默认从docker hub 拉取镜像
docker hub 一些特性:
- 镜像仓库:提供社区或者企业镜像,可以推送你的镜像,也可以拉取镜像
- 自动构建:改变仓库源码的时候自动构建镜像
- Webhooks:和自动构建配合使用
- 组织:组织权限管理
其他的镜像仓库:
quay.io
默认是dockerhub
制作镜像的途径
镜像的生成途径
- Dockerfile
- 基于容器制作
基于容器制作镜像
都知道容器在退出是不会保存,容器层上的数据的,但是我们可以通过commit 命令对容器层的改变创建一个新的镜像,因为在创建的过程中容器的数据可能会改变所以我们要使用 -p 参数来暂停容器
docker commit 命令修改默认运行的命令