Docker 镜像

什么是 Docker 镜像?

镜像的英语翻译一般可以翻译为 mirrorimage

“镜像” : 是一个名词,字面意思是一面镜子照应出的图像;字典解释为其各部分的排列与另一个作为模型的基本相似的东西的排列正相反;相对一根与之交错的轴或一个与之交错的平面为颠倒的东西。狭义上可以理解为基于一个模板复制出的具有相同属性的一个副本。

按照狭义的理解镜像:

  • 克隆的对象
  • 复制的副本
  • 模板的实例
  • 磨具生产的物品
  • 软件COPY的副本
  • 操作系统ISO镜像
  • 虚拟机的镜像

Docker 镜像核心概念类似,就像一个软件包的复制,只是有了特殊场景下的限定,使其概念和功能更加的具体。

Docker 镜像是将一层或多层存储层按照一定文件组织格式打包成一个只读的新文件,该文件能够作为容器运行时基础,提供容器运行依赖的相关文件.

镜像的原理

Docker 镜像具有以下特点:

  • 类似操作系统的ISO文件
  • 类似系统进程启动的软件包
  • Docker 镜像是只读的
  • Docker 使用了UTFS文件系统特性
  • Docker 镜像作为容器启动的模板

Docker 镜像分层

Docker 镜像分层图

Docker 镜像的来源获取:

Docker 镜像的组成

Docker 镜像是由多层的其他镜像和配置组成,采用分层结构的做大好处是“共享资源。

使用镜像开启并运行一个容器 镜像作为开启容器的模板。使用镜像创建并且运行一个容器,就是在镜像层的最上层添加一层容器层。所有的镜像层都是只读的容器层是可写的,容器开启之后,所有的修改该作都保存在可写的容器层。

容器以下所有镜像曾都是只读的,docker查找文件时是从上往下依次查找;容器层用来保存镜像变化的部分,并不会对镜像本身进行任何修改;一个镜像最多可以有127层

docker容器进行可写时,是在可写容器层进行可写动作,经底层镜像层的文件会先复制到可写层再执行删除、创建等动作

获取一个 Nginx 的 Docker 镜像

# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for docker.io/nginx:latest

查看镜像已经下载到本地

# docker images nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              7e4d58f0e5f3        2 weeks ago         133 MB

查看镜像的详细信息

# docker inspect nginx
[
    {
        "Id": "sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d",
        "RepoTags": [
            "docker.io/nginx:latest"
        ],
        "RepoDigests": [
            "docker.io/nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-09-10T12:33:10.502421624Z",
        "Container": "c72d14cf840a1720d6a3edc1d2217754786d41b89e7afa9f3ca8f1a47e0bb8a7",
        "ContainerConfig": {
            "Hostname": "c72d14cf840a",
            "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.19.2",
                "NJS_VERSION=0.4.3",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:fe23bd2ff69e7a6bd80fa4202a69b90c15b49850cef46324611096b4d1c960ff",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "18.09.7",
        "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.19.2",
                "NJS_VERSION=0.4.3",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:fe23bd2ff69e7a6bd80fa4202a69b90c15b49850cef46324611096b4d1c960ff",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 132640291,
        "VirtualSize": 132640291,
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/8d39dc45fccc7f7866cd8bfe4a876e55b33ba73cbdd4b97db8d6060e712fe088/diff:/var/lib/docker/overlay2/b487a5bba2fea746fca25583c7fa01bc3cfee1021ddb45ef7ffa7b04fbb74982/diff:/var/lib/docker/overlay2/7312598f4b7938376e8fcabab6ff6a0e3b72f46653a2ae7212e56e21e5f95951/diff:/var/lib/docker/overlay2/64762a779bd298ac73d492d662e272432f347362797ffc4cd39baa054f5e2caa/diff",
                "MergedDir": "/var/lib/docker/overlay2/7a0b19906b14cb1817dec636d6a75ef3c984db8995a45b4ad8e5523da65aa95b/merged",
                "UpperDir": "/var/lib/docker/overlay2/7a0b19906b14cb1817dec636d6a75ef3c984db8995a45b4ad8e5523da65aa95b/diff",
                "WorkDir": "/var/lib/docker/overlay2/7a0b19906b14cb1817dec636d6a75ef3c984db8995a45b4ad8e5523da65aa95b/work"
            }
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868",
                "sha256:f431d0917d4154d878551a6b8f716dead84d7ac71601616672a173d67e9edb6c",
                "sha256:60c688e8765e549c1debb75e10b37c9f56528a21c408e15191b36181ac342282",
                "sha256:eabfa4cd2d12ea36b06f20ac0104ceb66b026ea1950de9ec3a80d74d6d8cc54f",
                "sha256:908cf8238301a162a7fc4e2ddb482dacc52d4b96138fbdb18fe8fac30591e852"
            ]
        }
    }
]