Docker 镜像分析利器 dive

点击上方蓝色“飞雪无情”关注我,设个星标,方便看文章

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...

分析完成后你会看到一个可交互的窗口界面,在这个界面中可以通过键盘操作,查看镜像每一层的信息。

在这个窗口中:

  1. 左上部分是镜像的每一层,你可以通过上下方向键选择不同的层。

  2. 左下部分是镜像每一层的详细信息,可以看到有Tags、ID、Command等信息。

  3. 右侧部分是当前层的目录结构,有改变的文件或者目录也会用不一样的颜色特别标记出来。

这里有一些好用的快捷键,我列出来,方便你操作整个窗口分析镜像。

  • 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 的文档。

更多文章推荐

Go语言 | go version命令的高级用法

Go语言 | 基于channel实现的并发安全的字节池

Go爬虫+WordPress每月躺赚上千元(合法合规实战)

Golang Gin 实战(十四)| 文件托管、代理百度网站、自实现API网关

Golang Gin 实战(十三)| 中间件详解看这一篇就够了

Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现

扫码关注

点赞、分享、在看三连就是最大的支持

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值