共计 3702 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章主要介绍“Docker Image 怎么使用”,在日常操作中,相信很多人在 Docker Image 怎么使用问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker Image 怎么使用”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
Layer
镜像是由 layers 构成的。Image Layer 是一个通用的概念,可以指代下面:
以 JSON 形式描述的元数据
以 layer 描述的文件系统的改变
Image JSON
每一个 layer 都有一个 JSON 数据结构来描述这个 Image 的基本信息,例如镜像创建日期、作者、父镜像 ID 等。
Image Filesystem Changeset
每一个 layer 都会有对它相对于父 layer 增、删、改的文件的一个存档,使用诸如 AUFS 等联合挂载文件系统,可以将一系列的 image layer 以单一的文件系统的形式呈现出来。
Image Parent
大多数 layer 的元数据结构包含一个 parent 字段用来指定它的父镜像。一个 Image 包含一个单独的 JSON 元数据文件以及一系列的相对于父镜像的文件系统的改变。
Image JSON Description
{
id : a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9 ,
parent : c6e3cedcda2e3982a1a6760e178355e8e65f7b80e4e5248743fa3549d284e024 ,
checksum : tarsum.v1+sha256:e58fcf7418d2390dec8e8fb69d88c06ec07039d651fedc3aa72af9972e7d046b ,
created : 2014-10-13T21:19:18.674353812Z ,
author : Alyssa P. Hacker ltalyspdev@example.com gt ,
architecture : amd64 ,
os : linux ,
Size : 271828,
config : {
User : alice ,
Memory : 2048,
MemorySwap : 4096,
CpuShares : 8,
ExposedPorts : {
8080/tcp : {}
},
Env : [
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ,
FOO=docker_is_a_really ,
BAR=great_tool_you_know
],
Entrypoint : [
/bin/my-app-binary
],
Cmd : [
--foreground ,
--config ,
/etc/my-app.d/default.cfg
],
Volumes : { /var/job-result-data : {},
/var/log/my-app-logs : {},
},
WorkingDir : /home/alice ,
}
}
architecture string
该镜像的二进制文件所运行的主机的架构。
os string
该镜像所运行在的操作系统的类型。
ExposedPorts struct
运行该镜像的容器所暴露出来的端口集合。
例如:
{ 8080 : {},
53/udp : {},
2356/tcp : {}}
健可以为以下类型:
port/tcp
port/udp
port
其中。默认的协议是 tcp 协议。
Entrypoint array of strings
容器开始运行的时候,所要执行的一系列命令的集合。
创建 Image Filesystem Changeset
首先创建一个以 Image ID 命名的空目录,作为该镜像的根文件系统。以镜像 c3167915dc9d 为例:
c3167915dc9d/
接着创建相应的目录及文件:
c3167915dc9d/
etc/
my-app-config
bin/
my-app-binary
my-app-tools
c3167915dc9d 目录会被作为以下文件的打包存档的入口。
etc/my-app-config
bin/my-app-binary
bin/my-app-tools
一旦在镜像的文件系统上做出改变(增、删、改),会创建一个新的目录,以一个新的 ID 对这个目录命名,比如 f60c56784b83,并且使用父镜像的根文件系统进行快照对其初始化。这样,该目录和原来的目录 c3167915dc9d 具有完全相同的内容。如下所示:
f60c56784b83/
etc/
my-app-config
bin/
my-app-binary
my-app-tools
接下来的修改是要增加一个配置目录 /etc/my-app.d,该目录包含一个默认的配置文件。同样,对目录 my-app-tools 也会做出改变以处理配置布局的改变。然后,目录 f60c56784b83 如下所示:
f60c56784b83/
etc/
my-app.d/
default.cfg
bin/
my-app-binary
my-app-tools
上面反映了 /etc/my-app-config 的删除以及 /etc/my-app.d/default.cfg 的创建。/bin/my-app-tools 也会被新修改的所代替。在将该目录提交给 changeset 之前,由于它有父镜像,首先会将它与父镜像的目录树 f60c56784b83 进行比较,找出所有修改的文件。changeset 如下所示:
Added: /etc/my-app.d/default.cfg
Modified: /bin/my-app-tools
Deleted: /etc/my-app-config
一个只包含该 changeset 的打包存档被创建。文件名以 .wh. 作为前缀 的文件是 whiteout 文件,需要注意的是:不允许创建包含 whiteout 文件的镜像根文件系统。对 f60c56784b83 的打包存档如下所示:
/etc/my-app.d/default.cfg
/bin/my-app-tools
/etc/.wh.my-app-config
Combined Image JSON + Filesystem Changeset Format
包含 Image 完整信息的结构如下所示:
repository names/tags
all image layer JSON files
all tar archives of each layer filesystem changesets
以 library/busybox 为例:
.
├── 5785b62b697b99a5af6cd5d0aabc804d5748abbb6d3d07da5d1d3795f2dcc83e
│ ├── VERSION
│ ├── json
│ └── layer.tar
├── a7b8b41220991bfc754d7ad445ad27b7f272ab8b4a2c175b9512b97471d02a8a
│ ├── VERSION
│ ├── json
│ └── layer.tar
├── a936027c5ca8bf8f517923169a233e391cbb38469a75de8383b5228dc2d26ceb
│ ├── VERSION
│ ├── json
│ └── layer.tar
├── f60c56784b832dd990022afc120b8136ab3da9528094752ae13fe63a2d28dc8c
│ ├── VERSION
│ ├── json
│ └── layer.tar
└── repositories
对于一个完整 Image,其包含一个或多个以 Layer ID 命名的目录,每一个目录包含三个文件:
VERSION – The schema version of the json file
json – The JSON metadata for an image layer
layer.tar – The Tar archive of the filesystem changeset for an image layer.
repositories 是一个 JSON 文件,用来描述镜像的 name 和 tag。
Loading an Image Filesystem Changeset
1、根据 Image 的父 ID 找到根祖先,即没有父 ID 的的 Image。
2、对于每一个 image layer,从根目录开始,从上往下,提取出每一个 layer 的文件系统 changeset archive 作为后面容器的根文件系统。
提取出每一个存档的内容。
重新遍历目录树,删除所有以 .wh. 作为前缀的文件。
到此,关于“Docker Image 怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!