点击上方蓝色“飞雪无情”关注我,设个星标,方便看文章
Docker不多说了,绝对的家喻户晓,已经成为我们日常开发部署必不可少的工具。
有时候,你想分析一个Docker 镜像,比如查看它的meta信息,这时候我们可以使用docker inspect。比如要查看Golang这个镜像的meta信息,可以输入如下命令:
➜ ~ docker inspect golang:1.14-alpine
[ {
.........
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a",
"sha256:0f7493e3a35bab1679e587b41b353b041dca1e7043be230670969703f28a1d83",
"sha256:1ba1431fe2ba3d4eb50dfcc11980e8f6146fa71f67bd3eb30d3b82e77fb3cdc9",
"sha256:c4a5a986cae51de6a3c49bbfe3c7b3b69cb3cc4fa6ec828434893a437b911dc6",
"sha256:49894143dc988491c0598c3663a21ad4c5308eb0a77da5fdc6ac264e6043d27d"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
如上示例所示,我截取了golang镜像的一部分meta信息,便于演示。
Dokcer自带的命令行工具除了可以查看镜像的meta信息外,还可以查看镜像的构建历史,通过构建历史也便于我们分析这个镜像。
➜ ~ docker history golang:1.14-alpine
IMAGE CREATED CREATED BY SIZE COMMENT
0223ac8ea40d 13 days ago /bin/sh -c #(nop) WORKDIR /go 0B
<missing> 13 days ago /bin/sh -c mkdir -p "$GOPATH/src" "$GOPATH/b… 0B
<missing> 13 days ago /bin/sh -c #(nop) ENV PATH=/go/bin:/usr/loc… 0B
<missing> 13 days ago /bin/sh -c #(nop) ENV GOPATH=/go 0B
<missing> 13 days ago /bin/sh -c set -eux; apk add --no-cache --v… 281MB
<missing> 13 days ago /bin/sh -c #(nop) ENV GOLANG_VERSION=1.14.9 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/go/bi… 0B
<missing> 3 months ago /bin/sh -c [ ! -e /etc/nsswitch.conf ] && ec… 17B
<missing> 3 months ago /bin/sh -c apk add --no-cache ca-certifica… 515kB
<missing> 3 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:c92c248239f8c7b9b… 5.57MB
以上就是golang:1.14-alpine 这个镜像的构建历史,从中可以看到创建时间、执行的命令等信息。
但是如果你想查看具体到镜像的某一层的信息呢?比如修改了哪些文件,删除了哪些;每一层对应的文件目录结构等等,这些使用dokcer自带的命令就无法做到了,这时候就需要我们今天的主角dive这个神器登场了。
dive是一个使用Golang编写的Docker镜像分析神器,源代码托管在github https://github.com/wagoodman/dive,可以免费使用。
要想安装dive非常简单,根据你的操作系统不同,可以有以下几种选择:
Ubuntu/Debian
wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb
sudo apt install ./dive_0.9.2_linux_amd64.deb
RHEL/Centos
curl -OL https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm
rpm -i dive_0.9.2_linux_amd64.rpm
Mac
brew install dive
Windows
从 https://github.com/wagoodman/dive/releases 下载最新版本安装即可。
如果你已经安装了dokcer,我建议你基于docker的方式安装和使用dive,因为这样不会污染你的电脑。这里我也以docker的方式演示dive的使用。
➜ ~ docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$(pwd)":"$(pwd)" \
-w "$(pwd)" \
-v "$HOME/.dive.yaml":"$HOME/.dive.yaml" \
wagoodman/dive:latest golang:1.14-alpine
以上是使用dive分析golang:1.14-alpine这个镜像,dive是基于docker运行的,它的镜像是wagoodman/dive:latest。
以上命令回车启动后,docker会先下载wagoodman/dive:latest镜像,然后再下载wgolang:1.14-alpine镜像,最后再使用dive分析wagoodman/dive:latest镜像。如下输出可以很详细的看到运行的过程。
latest: Pulling from wagoodman/dive
89d9c30c1d48: Pull complete
5ac8ae86f99b: Pull complete
f10575f61141: Pull complete
Digest: sha256:2d3be9e9362ecdcb04bf3afdd402a785b877e3bcca3d2fc6e10a83d99ce0955f
Status: Downloaded newer image for wagoodman/dive:latest
Image Source: docker://golang:1.14-alpine
Fetching image... (this can take a while for large images)
Handler not available locally. Trying to pull 'golang:1.14-alpine'...
1.14-alpine: Pulling from library/golang
df20fa9351a1: Already exists
ed8968b2872e: Pull complete
a92cc7c5fd73: Pull complete
5d0547b08c89: Pull complete
d5b6f0657434: Pull complete
Digest: sha256:050b2322a11b7e6fbde31a9c95b3b090297a47beedaf992da787ee84b3c35ad6
Status: Downloaded newer image for golang:1.14-alpine
docker.io/library/golang:1.14-alpine
Analyzing image...
Building cache...
分析完成后你会看到一个可交互的窗口界面,在这个界面中可以通过键盘操作,查看镜像每一层的信息。
在这个窗口中:
左上部分是镜像的每一层,你可以通过上下方向键选择不同的层。
左下部分是镜像每一层的详细信息,可以看到有Tags、ID、Command等信息。
右侧部分是当前层的目录结构,有改变的文件或者目录也会用不一样的颜色特别标记出来。
这里有一些好用的快捷键,我列出来,方便你操作整个窗口分析镜像。
Crtl+C 退出
Tab 切换左边的Layers和右边的Current Layer Contents
Crtl+L 显示某一层的文件变更
Crtl+A 显示所有的文件变更
Crtl+A 显示该层增加的文件(Tab键切换到Current Layer Contents生效)
Crtl+R 显示该层删除的文件(Tab键切换到Current Layer Contents生效)
Crtl+M 显示该层修改的文件(Tab键切换到Current Layer Contents生效)
Crtl+B 显示该层文件的详细属性信息(Tab键切换到Current Layer Contents生效)
更多关于dive的使用可以参考 https://github.com/wagoodman/dive 的文档。
更多文章推荐
Golang Gin 实战(十四)| 文件托管、代理百度网站、自实现API网关
Golang Gin 实战(十三)| 中间件详解看这一篇就够了
Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现
扫码关注
点赞、分享、在看三连就是最大的支持