• Docker知识总结 (二) Docker 底层原理


    docker run hello-world 流程

    在这里插入图片描述

    Docker 为什么比VM快

    1. Docker有这比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker上的程序直接使用的都是实际物理机上的硬件资源,因此在CPU、内存利用率上有明显的优势。
    2. Docker利用的是宿主机的内核,而不需要使用Guest OS 因此 ,当 新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核,而避免引寻 ,加载操作系统内核返回个比较费事费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回的新建的过程是分钟级别,而docker直接使用的是宿主机上的操作系统,则省略了返回这个的过程,因此新建一个docker容器只需要几秒钟。
      在这里插入图片描述
      在这里插入图片描述

    Docker 镜像详解

    什么是镜像?

    镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

    只有通过镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

    镜像与容器

    • 镜像:可以理解为软件安装包,可以方便的进行传播和安装。
    • 容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

    UnionFS(联合文件系统)

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

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

    Docker镜像加载原理

    docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

    bootfs(boot file system)主要包含bootloaderkernel, 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等等。

    在这里插入图片描述
    平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

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

    分层理解

    例如下载一个redis镜像:

    [root@VM-4-17-centos ~]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    a2abf6c4d29d: Already exists 
    c7a4e4382001: Pull complete 
    4044b9ba67c9: Pull complete 
    c8388a79482f: Pull complete 
    413c8bb60be2: Pull complete 
    1abfd3011519: Pull complete 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    为什么Docker镜像要采用这种分层结构呢?
    最大的一个好处就是 - 共享资源。比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

    查看镜像的详细信息:
    docker image inspect (Display detailed information on one or more images)

    [root@VM-4-17-centos ~]# docker image inspect redis:latest
    [
        {
            "Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
            "RepoTags": [
                "redis:latest"
            ],
            "RepoDigests": [
                "redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339"
            ],
          	,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 省略
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                    "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
                    "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
                    "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
                    "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
                    "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    commit 镜像

    命令:docker commit

    语法Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    Options:

      -a, --author string    Author (e.g., "John Hannibal Smith ")
      -c, --change list      Apply Dockerfile instruction to the created image
      -m, --message string   Commit message
      -p, --pause            Pause container during commit (default true)
    
    • 1
    • 2
    • 3
    • 4

    准备:

    1. 启动一个新pull的镜像
    [root@VM-4-17-centos ~]# docker run -it -p 8080:8080 tomcat
    
    • 1
    1. 修改容器
    [root@VM-4-17-centos ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
    d5d19afaf304   tomcat    "catalina.sh run"   5 minutes ago   Up 5 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   upbeat_curie
    [root@VM-4-17-centos ~]# docker exec -it 41dc5651feef /bin/bash
    root@41dc5651feef:/usr/local/tomcat# ls
    BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
    root@41dc5651feef:/usr/local/tomcat# cp -r ./webapps.dist/* ./webapps
    root@41dc5651feef:/usr/local/tomcat# ls ./webapps
    ROOT  docs  examples  host-manager  manager
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 执行docker commit
    [root@VM-4-17-centos ~]# docker commit -a="zhx" -m="add webapps" d5d19afaf304  tomcat02:1.0
    sha256:283f860125418f960ce274ec9abbfec95014e550c0f7d720f32511b34b434e21
    [root@VM-4-17-centos ~]# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
    tomcat02              1.0       283f86012541   7 seconds ago   684MB
    tomcat                latest    fb5657adc892   7 months ago    680MB
    hello-world           latest    feb5d9fea6a5   10 months ago   13.3kB
    centos                latest    5d0da3dc9764   10 months ago   231MB
    portainer/portainer   latest    580c0e4e98b0   16 months ago   79.1MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Dockerfile、images、containers、docker registry之间的关系

    在这里插入图片描述

  • 相关阅读:
    云原生Kubernetes:K8S集群list-watch机制与 pod调度约束
    Unity --- 选项与下拉框的使用
    SpringBoot - @ConditionalOnProperty注解使用详解
    音视频开发之重拾图片
    IB物理的费曼图怎么考?
    J2EE基础:通用分页01
    Azure Machine Learning - Azure AI 搜索中的集成数据分块和嵌入
    通用场景图像分割

    通天之网:卫星互联网与跨境电商的数字化未来
  • 原文地址:https://blog.csdn.net/weixin_45773632/article/details/126139603