验证Docker镜像和容器之间的关系

验证笔记

image.png

因为对Docker镜像和容器之间的关系不太清楚,所以进行了验证。

下载 Docker 镜像

首先要确认是否有图像。

$ docker images | grep golang
# なし

没有。
因此,我将下载图像。

$ docker pull golang
Using default tag: latest
latest: Pulling from library/golang
d6ff36c9ec48: Pull complete
c958d65b3090: Pull complete
edaf0a6b092f: Pull complete
80931cf68816: Pull complete
813643441356: Pull complete
d2d74a4aa2e6: Pull complete
568efbaeb143: Pull complete
Digest: sha256:4c3279e05a0131c0565466ac538755f104d8d936efbc4c30ba7d717c73f3e2c2
Status: Downloaded newer image for golang:latest
docker.io/library/golang:latest

再次确认图片。

$ docker images | grep golang
golang                           latest              75605a415539        2 weeks ago         839MB

在这里,就有了一个名为“形象”的概念。

暂时确认一下,集装箱还没有做好。

$ docker ps -a | grep golang
# なし

Docker镜像的概述

$ docker image inspect golang
[
    {
        "Id": "sha256:75605a4155391abe376fc8124083ec52a2409ceb8a6b5ac6aae7eca133353ce3",
        "RepoTags": [
            "golang:latest"
        ],
        "RepoDigests": [
            "golang@sha256:4c3279e05a0131c0565466ac538755f104d8d936efbc4c30ba7d717c73f3e2c2"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-08-12T00:22:46.039326176Z",
        "Container": "b90c34099f107af34b5e4581d76118f411d58162c68eea08415ce9b18a640c42",
        "ContainerConfig": {
            "Hostname": "b90c34099f10",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOLANG_VERSION=1.15",
                "GOPATH=/go"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) WORKDIR /go"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:1b1d02bcac5b6e48f9b2312bc8bed4f3bb3f96b61fb2bf70fcfd1a1f19b98032",
            "Volumes": null,
            "WorkingDir": "/go",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "18.09.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOLANG_VERSION=1.15",
                "GOPATH=/go"
            ],
            "Cmd": [
                "bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:1b1d02bcac5b6e48f9b2312bc8bed4f3bb3f96b61fb2bf70fcfd1a1f19b98032",
            "Volumes": null,
            "WorkingDir": "/go",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 838873792,
        "VirtualSize": 838873792,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/d131d3a907fd243f1930b59643d8a8063185972576e5d79edbf308e91e15a353/diff:/var/lib/docker/overlay2/e7a3845fa041337b03c7d45fed7a42b4e6906f73aac17504c41fa33baf8494f3/diff:/var/lib/docker/overlay2/0522b267b619c032b9959fd9ac957c6c45affa3375ee790320ca7d9521e9a4f6/diff:/var/lib/docker/overlay2/91468ffbb5607e8fcbab36d1315e257edceced8d959271b3f527f588f1b41203/diff:/var/lib/docker/overlay2/bfbbc63ca1366753931d7ba67a9e2e793abf216a54cdfbbae9c70959b5688716/diff:/var/lib/docker/overlay2/bb3852e88617e42f5cec2f2620bf5116eba6b846ce24e016193a8fd6a9eef963/diff",
                "MergedDir": "/var/lib/docker/overlay2/6a27891c4193c1c910515bf07d3138d5e377f986144545dde9e26bc639f5b071/merged",
                "UpperDir": "/var/lib/docker/overlay2/6a27891c4193c1c910515bf07d3138d5e377f986144545dde9e26bc639f5b071/diff",
                "WorkDir": "/var/lib/docker/overlay2/6a27891c4193c1c910515bf07d3138d5e377f986144545dde9e26bc639f5b071/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:0ced13fcf9441aea6c4ee1defc1549772aa2df72017588a1e05bc11dd30b97b6",
                "sha256:b2765ac0333ae89829bb991a50d961bbb20069bac6eefce6fab8ef4d253ba24c",
                "sha256:7a9460d5321859e34344b2817f9e87b4c18bc9eb42dca91e0822d3511ea42a79",
                "sha256:e5df62d9b33ae0f2e75d7a92270f20fcac04986ac22dd0674c0420c171cc0d56",
                "sha256:7279468fdfadf1018dd7787eafb864fedcbeb4f2877d7a541295948467c42ac9",
                "sha256:e63d5e7bcdc59f31b30c1074357ff73a75dd10c03494888fd47e6dc48950b87a",
                "sha256:2936bd2191b23bb4a430d31e0b62ddf95eaf8e46452ac11b9f2bbcfc882499b5"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

启动 Docker 容器

使用Docker运行时,容器将启动。

在内部,run命令从镜像中构建和启动容器的两个步骤都会执行。
如果只是进行容器的构建,似乎可以使用docker create命令。

$ docker run golang

这样应该会创建并运行容器。
在内部,通过docker create来构建容器,容器会短暂地启动并执行所需任务,然后立即结束。

在Docker运行中要做的事情

这里需要做的事情就是像Dockerfile中所描述的那样。

请参考以下链接:
https://github.com/docker-library/golang/blob/master/1.15/alpine3.12/Dockerfile
其中的代码会执行并立即结束。

$ docker ps -a | grep golang
86f4bdeb8a98        golang                         "bash"                   5 seconds ago       Exited (0) 4 seconds ago                        festive_dhawan

就像节日丹万一样,容器会自动分配名称。

另外,在每次执行 `docker run golang` 时,容器会逐渐增加。

$ docker run golang
$ docker ps -a | grep golang
d53900629ae3        golang                         "bash"                   5 minutes ago       Exited (0) 5 minutes ago                        quizzical_aryabhata
86f4bdeb8a98        golang                         "bash"                   13 minutes ago      Exited (0) 13 minutes ago                       festive_dhawan

接下来被取名为 quizzical_aryabhata。
这样下去,每次运行docker run,容器都会增加。

在Docker运行之后,希望自动删除容器。

$ docker run --rm golang 

使用 –rm 标志使得容器在使用后立即被删除。

我想要指定由Docker run命令创建的容器的名称。

$ docker run --name golang_test golang
$ docker ps -a | grep golang
2b871a22d588        golang                         "bash"                   About a minute ago   Exited (0) About a minute ago                       golang_test

可以指定名为 golang_test 的名称。
由于容器名称不能重复设置,如果尝试再次创建具有相同名称的容器,会明确报错。

删除容器

$ docker rm golang_test
# または   docker rm 2b871a22d588

请提供姓名或标识号。

我希望在Docker中进行更精细的配置。

请使用Dockerfile或者docker-compose,而不是使用docker run。在这里不再详细解释。

当管理对象变得复杂时,我认为可以按照 Dockerfile-》docker-compose 的顺序进行迁移。或许最好一开始就直接创建 docker-compose。

请给我提供一种中文的格式。

参阅请批判性地试着去考虑这个问题。

    • Qiita – Dockerfileを書いてみる

 

    Qiita – Docker compose ことはじめハンズオン

查看 Docker 镜像和容器的大小

$ docker system df -v | grep golang
golang                           latest              75605a415539        2 weeks ago         838.9MB             0B                  838.9MB             2
d53900629ae3        golang                         "bash"                   0                   0B                  11 minutes ago      Exited (0) 11 minutes ago   quizzical_aryabhata
86f4bdeb8a98        golang                         "bash"                   0                   0B                  19 minutes ago      Exited (0) 19 minutes ago   festive_dhawan

第一行显示的是镜像的大小为838.9MB,
第二行和第三行显示的是容器的大小为0B。

在Go语言本身以及Docker提供的操作系统区域等方面都占用了镜像的空间,可以看出容器没有占用太多空间。
容器似乎是使用了镜像的数据。
因此,创建许多容器并不会显著增加容量。

Docker容器使用容量的位置在哪里?

$ docker run -it golang
root@a8c84548d1d5:/go#

添加 -it 选项后,可以在容器创建后进入控制台。

为了增加容量,我会尝试执行 apt update。

root@a8c84548d1d5:/go# apt update
Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:2 http://deb.debian.org/debian buster InRelease [122 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [224 kB]
Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7906 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [7868 B]
Fetched 8378 kB in 2s (4638 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.

确认容量。

$ docker system df -v | grep golang
golang                           latest              75605a415539        2 weeks ago         838.9MB             0B                  838.9MB             3
a8c84548d1d5        golang                         "bash"                   0                   17.5MB              3 minutes ago       Exited (0) 24 seconds ago   objective_curran
d53900629ae3        golang                         "bash"                   0                   0B                  43 minutes ago      Exited (0) 43 minutes ago   quizzical_aryabhata
86f4bdeb8a98        golang                         "bash"                   0                   0B                  51 minutes ago      Exited (0) 51 minutes ago   festive_dhawan

请注意第二行的 objective_curran 的容量。
与其他容器的大小为0B相比,它的容量较大。
我们可以看出在容器中进行了下载和更新操作,从而占用了容量。

只要删除图像时,原始数据没有消失,似乎可以重新下载。

概括一下

image.png
名称概要入っているデータ削除してもいいかイメージ共有利用のベースOSの情報や、テーマとなっているパッケージ削除しても再度ダウンロードすればOK。キャッシュ的意味合いコンテナ用途ごとに用意イメージから作成後の個別の変更要確認ではあるが、削除しても問題ないように設計した方がいい
    • コンテナはそもそもサーバー外部にデータを持つか、 volumes などを使い、必要データはホストOS側に持つ方が良い

 

    • コンテナをイメージ化することもできるみたい。自分で Docker hub にあげてもいいみたい。

Qiita – Dockerイメージの作り方

广告
将在 10 秒后关闭
bannerAds