镜像是什么
镜像是一种轻量级、可执行的独立软件包,再来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需内容,包括代码、运行时库、环境变量和配置文件。
镜像加载原理
unionFS(联合文件系统)
是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改,作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem),union文件系统时docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
docker加载镜像原理
docker镜像是由一层一层的文件系统组成,这种层级的文件系统,那么层级之间如何实现文件隔离(宿主机与容器隔离)
为了实现文件分层,rootfs诞生了,在介绍bootfs之前首先要了解一下bootfs!
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动时会加载bootfs文件系统,Docker镜像文件的最底层就是bootfs,这一层与linux\unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已交由bootfs交给内核,同时会卸载bootfs。
rootfs(root file system)代表各种不同操作系统的发行版本,在bootfs之上,包含典型的Linux系统中的/dev,/proc,/etc等标准目录和文件。
理解分层
首先如下图可以看到,下载redis镜像包的时候,下载了多个分层
# 查看镜像元数据
root:~ $ docker image inspect redis:latest
[
{
"Id": "sha256:02c7f2054405dadaf295fac7281034e998646996e9768e65a78f90af62218be3",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:552acf4b9f1bdbb6eaee9d02ba533a8f996641c8dd453c7b4ef607525a76cd5a"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-03T13:26:48.395038582Z",
"Container": "3627b30c1a4cf3ef703e0516beee6428efe1b08a5314f5f106b84250635809cb",
"ContainerConfig": {
"Hostname": "3627b30c1a4c",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.5",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
"REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"redis-server\"]"
],
"Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.5",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
"REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
],
"Cmd": [
"redis-server"
],
"Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 105408201,
"VirtualSize": 105408201,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/52fc03c3b2ef6e64509de12f75f8e03f438e91e46a3b57848dadb901d2958e28/diff:/var/lib/docker/overlay2/e68b7712564163bd45a281a4cb70427eccc6809d5fe4b0fc7685df7000511527/diff:/var/lib/docker/overlay2/638d4e1035840a6fa95d50dc77c622d9ebbb91127a87b75e0f7e23dfe3f6574c/diff:/var/lib/docker/overlay2/ef858710684e26dfcbf497a47f82fc0bf01a6de07841119b6469c5beb768b73c/diff:/var/lib/docker/overlay2/7c548de738fe0a8c58f8962653ea083c9aa8c1e1b58c2b692245583ca4788326/diff",
"MergedDir": "/var/lib/docker/overlay2/d03abe3f1d7ba89cbf16b3e631d2f850215286d01d4243b7045d48c77df7a4db/merged",
"UpperDir": "/var/lib/docker/overlay2/d03abe3f1d7ba89cbf16b3e631d2f850215286d01d4243b7045d48c77df7a4db/diff",
"WorkDir": "/var/lib/docker/overlay2/d03abe3f1d7ba89cbf16b3e631d2f850215286d01d4243b7045d48c77df7a4db/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:d000633a56813933cb0ac5ee3246cf7a4c0205db6290018a169d7cb096581046",
"sha256:bdad86443e47c5665683ac41c1f24f28479d830d7e3cc47d0a337ee5166c7714",
"sha256:6a7992ac480029d82b7dbb757d16fe5d023aa283ed32b52267cd1fe9e6b73c49",
"sha256:be43d2475cf809c0f2ec31950e849d0f888f3121970fd99196a11a903f8c3820",
"sha256:be5818ef2907adfe19be14bf66647b5fb5a2029143f9297f8ce1ff1fd1d35753",
"sha256:c54e0c16ea22fa873c12f6a7f3fb4e021bb58d67c292156a6ce6e08637458b7c"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]