验证Docker镜像和容器之间的关系
验证笔记
因为对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相比,它的容量较大。
我们可以看出在容器中进行了下载和更新操作,从而占用了容量。
只要删除图像时,原始数据没有消失,似乎可以重新下载。
概括一下
-
- コンテナはそもそもサーバー外部にデータを持つか、 volumes などを使い、必要データはホストOS側に持つ方が良い
-
- コンテナをイメージ化することもできるみたい。自分で Docker hub にあげてもいいみたい。
Qiita – Dockerイメージの作り方