0
点赞
收藏
分享

微信扫一扫

Docker笔记第七节(镜像原理、分层)

律楷粑粑 2022-03-19 阅读 101
java后端

参考视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili笔记资料交流都在我们的平台:www.kuangstudy.com秦疆老师Java全栈系列课程之Docker讲解从Docker历史,概念,到命令的详解从使用到深入原理和网络,大量的实战,带你彻底掌握Docker!给你带来最全面的Docker讲解,学Docker,这一套课就够了!狂神说Java系列,努力打造通俗易懂的教程QQ交流群 : 664386224[这里是图片001]https://www.bilibili.com/video/BV1og4y1q7M4?p=18


1、什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和和基于运行环境开发的软件,包含运行某个软件所需的所有的内容,包括代码、运行时、库、环境变量和配置文件。


2、Docker镜像加载原理

UnionFS(联合文件系统):Union文件系统是一种分层,轻量级并且高性能的系统文件,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

**特性:**以此同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。

应用打包成docker镜像。就可以


docker镜像实际由一层一层的文件系统组成的,这种层次的文件系统为UnionFS

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, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

对于一个精简的OS , rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的rootfs会有差别,因此不同的发行版可以公用bootfs。。


3、分层的理解

在镜像下载的时候,可以看到日志的输出格式是一层一层的。

这样好处是在于可以进行资源共享,多个镜像都可以从一个相同的Base镜像构建而来,那么宿主机只需要再次攀升保留一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有的容器服务了,而且每一层都可以被共享。

比如通过命令查看镜像分层。

[root@VM-0-6-centos ~]# docker image inspect nginx:latest
[
    {
        "Id": "sha256:c919045c4c2b0b0007c606e763ed2c830c7b1d038ce878a3c0d6f5b81e6ab80b",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:1c13bc6de5dfca749c377974146ac05256791ca2fe1979fc8e8278bf0121d285"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2022-03-01T14:00:05.875390518Z",
        "Container": "62aea4acb75db8685ce9869daf8e2548b1fd56315a562ca80cef5502966ba9ca",
        "ContainerConfig": {
            "Hostname": "62aea4acb75d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.6",
                "NJS_VERSION=0.7.2",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD ["nginx" "-g" "daemon off;"]"
            ],
            "Image": "sha256:90bc50855dba56bcf29fb414e328f2bbe93d21ad4629139a2b0d37be1f139c9d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.6",
                "NJS_VERSION=0.7.2",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:90bc50855dba56bcf29fb414e328f2bbe93d21ad4629139a2b0d37be1f139c9d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 141505630,
        "VirtualSize": 141505630,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/6f8bff7ee9acb5fb5a443f11c7784be4c20fd5c075ac7fbe8fb0f65b211bc371/diff:/var/lib/docker/overlay2/fdd486f035991787650b4541e6898e011e238a4b05601c6d7a6220aa4ffc0d4a/diff:/var/lib/docker/overlay2/9a4caa70a4879f0136d3704b0320a9f90fa7293473bd389b46ea02cbe68838c0/diff:/var/lib/docker/overlay2/2314ec9c843908303150e6345bde10780399803da77dc522e66bb8cfe5054a4b/diff:/var/lib/docker/overlay2/d5232a1a498ff374276f0c24796766ede1fc605671f64187f47a003d1f734e5b/diff",
                "MergedDir": "/var/lib/docker/overlay2/a8f7a32b746805019fbd401cbf313b4411a8c811afd669dc2519c0a0792882bf/merged",
                "UpperDir": "/var/lib/docker/overlay2/a8f7a32b746805019fbd401cbf313b4411a8c811afd669dc2519c0a0792882bf/diff",
                "WorkDir": "/var/lib/docker/overlay2/a8f7a32b746805019fbd401cbf313b4411a8c811afd669dc2519c0a0792882bf/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:1401df2b50d5de5a743b7bac3238ef3b7ce905ae39f54707b0ebb8eda3ab10bc",
                "sha256:57a9a0cdd450687265b5d49d47e8dc707f178772faa43a7b01c2299cd39113b7",
                "sha256:3baebd9b50ad6c27671bb9748f3f44922650c46f04977a7857c0366390920afb",
                "sha256:d3ae25fc9f7a917bcd2c3158eff7dc5fc848157e724efdb9af9ffe3771cda464",
                "sha256:53db376e88c7ebd83d9b30e0d20ee818787c21d97c2bd365b02cf23487592007",
                "sha256:e4b39f9495876939f14376f32d7c7ba83526636a8a8b52c008ab32ade9ba6e06"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

特点:

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是通常说的 容器层,容器之下都叫镜像层。

举报

相关推荐

0 条评论