【问题标题】:What's the container of a base docker image?基础 docker 镜像的容器是什么?
【发布时间】:2015-04-29 16:49:00
【问题描述】:

我正在学习使用 docker。我知道每个 docker 镜像都是建立在没有父镜像的基础镜像之上的。

然后从基础镜像中,我们可以通过容器(可能是一个生命周期很短的容器)自定义一些东西来提交一个新镜像。

所以我理解流程是这样的:基础镜像->容器->新镜像1->容器->新镜像2

但是,我检查了基础图像的 json 数据。我仍然可以看到它有一个容器的信息:

[{
"Architecture": "amd64",
"Author": "",
"Comment": "",
"Config": {
    "AttachStderr": false,
    "AttachStdin": false,
    "AttachStdout": false,
    "Cmd": null,
    "CpuShares": 0,
    "Cpuset": "",
    "Domainname": "",
    "Entrypoint": null,
    "Env": null,
    "ExposedPorts": null,
    "Hostname": "3f37dbc61890",
    "Image": "",
    "Labels": null,
    "MacAddress": "",
    "Memory": 0,
    "MemorySwap": 0,
    "NetworkDisabled": false,
    "OnBuild": null,
    "OpenStdin": false,
    "PortSpecs": null,
    "StdinOnce": false,
    "Tty": false,
    "User": "",
    "Volumes": null,
    "WorkingDir": ""
},
"Container": "3f37dbc61890b0bb37cc8479db94602bcc2d6e177d76c0f3d7d53346c0dc580c",
"ContainerConfig": {
    "AttachStderr": false,
    "AttachStdin": false,
    "AttachStdout": false,
    "Cmd": [
        "/bin/sh",
        "-c",
        "#(nop) ADD file:777fad733fc954c0c161670c48c10ea1787a6e5d544daa20e55d593279df3fa3 in /"
    ],
    "CpuShares": 0,
    "Cpuset": "",
    "Domainname": "",
    "Entrypoint": null,
    "Env": null,
    "ExposedPorts": null,
    "Hostname": "3f37dbc61890",
    "Image": "",
    "Labels": null,
    "MacAddress": "",
    "Memory": 0,
    "MemorySwap": 0,
    "NetworkDisabled": false,
    "OnBuild": null,
    "OpenStdin": false,
    "PortSpecs": null,
    "StdinOnce": false,
    "Tty": false,
    "User": "",
    "Volumes": null,
    "WorkingDir": ""
},
"Created": "2015-04-21T22:18:45.67739694Z",
"DockerVersion": "1.6.0",
"Id": "706766fe101906a1a6628173c2677173a5f8c6c469075083f3cf3a8f5e5eb367",
"Os": "linux",
"Parent": "",
"Size": 188104128,
"VirtualSize": 188104128
}]

3f37dbc61890b0bb37cc8479db94602bcc2d6e177d76c0f3d7d53346c0dc580c 是 基础镜像的容器 ID。

什么是基础镜像的容器?我觉得它变成了主机名。 实际上主机名是什么?

【问题讨论】:

    标签: image docker containers


    【解决方案1】:

    我不确定你的术语。如果根据定义,基础图像是没有父图像的图像,则示例中的图像不是基础图像。

    但图像可能没有父级。例如scratch 没有父级:

    $ docker inspect -f '{{.Container}}' ubuntu
    a4c15f8c80978475a53f96721f935de5823bc8c29aff14eb00a15f9b9d96cddd
    $ docker inspect -f '{{.Container}}' scratch
    
    $
    

    您还可以使用import 创建没有父级的图像:

    $ echo hello world > foo && tar -cf- foo | docker import -
    3e8fc0cb69fae0bd3f9711031df6d3b7bf6a7e8c9745657d9261e7b803718c67
    $ docker inspect -f '{{.Container}}' 3e8fc0c
    
    $
    

    scratch 不同,此图像中可能包含文件。事实上,您可以使用这种技术来展平复杂的图像。

    $ docker create ubuntu # create container from image
    6b90bf145c193ef8e4ecb789372d2fd619769a20d96c8f3f586dcfbc501b0611
    $ docker export 6b90bf1 > ubuntu.tar # export container fs to tarball
    $ docker import - flat_ubuntu < ubuntu.tar
    4ef4ffb9514212acf6a19b2eeda8855b8c0445924311043ba5cba6574d40d772
    $ docker inspect -f '{{.Container}}' 4ef4ffb
    
    $
    

    请务必注意,虽然这个新镜像与原始镜像具有完全相同的文件,但它没有其他 docker 功能,如环境、卷、入口点等。

    我不一定将其称为“基本”图像。我将其称为“平面”图像。我会说基本映像是您在 Dockerfile FROM 指令中指定的映像。用我的术语来说,基本图像不必是平面的。

    【讨论】:

    • 感谢您的回答。我展示的图片是我直接拉出来的ubuntu的“基础层”。我知道我们可以扁平化图像以使图像没有导出/导入的父级或容器。但是我们怎样才能让一个图像没有父级但有容器信息呢?
    • @user1167910 可以直接注入 docker 元数据,但是最小化层有什么价值吗?
    • 我只是对此感到好奇。非常感谢。
    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2018-04-29
    • 2020-02-26
    • 2020-01-20
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多