前言
只有光头才能变强.
文本已收录至我的 GitHub 仓库, 欢迎 Star: https://github.com/ZhongFuCheng3y/3y
回顾前面:
为什么需要 Docker?
Docker 入门为什么可以这么简单?
前面两篇已经讲解了为什么需要 Docker 这项技术, 以及解释了 Docker 的基本概念 / 术语, 使用 Docker 成功运行 Tomcat~
在上篇也同样留下一个问题: 我们知道 Tomcat 运行起来需要 Java 的支持, 那么我们在 DockerHub 拉取下来的 Tomcat 镜像是不是也有 Java 环境呢?
所以, 这篇主要来讲讲 Docker 镜像相关的知识点!
一, 简单了解 Dockerfile
Dockerfile 是用来构建 Docker 镜像的文件, 是由一系列命令和参数构成的脚本.
简单来说: Dockerfile 是镜像的源码.
上一篇我们 pull 了一份 Tomcat 的镜像, 我们也可以去看看它的 Dockerfile 长的什么样:
我们随便点进去一个看一下:
我们在 Dockerfile 的第一行就可以发现 FROM openjdk:8-jre, 所以可以确定的是: 在 DockerHub 拉取下来的 Tomcat 镜像一定有 Java 环境!
在这里我们先不说如何阅读 / 编写 Dockerfile 文件, 先了解到 Dockerfile 是镜像的源码即可
简单来说: 通过 Dockerfile 文件可以知道我们拉取下来的镜像究竟是怎么构建的.
二, 解除镜像的疑惑
我们知道 Docker Hub 有很多常用的镜像, 比如说 CentOS. 我们去 pull 一个下来看看 Docker 中的 CentOS 长啥样:
我们可以发现的是: Tomcat 的 SIZE 竟然比 CentOS 还要大! 但按我们常规的想法, CentOS 的镜像可能是 3 或 4GB(现在 200M),Tomcat 的镜像可能就 200M(现在 400M). 这是为什么呢??
如果我们在 pull 的时候观察得比较仔细的话, 可以发现 pull 会拉下很多层镜像:
完全 pull 下来的之后, 我们如果使用 docker images 只能查看到最终的镜像:
如果我们使用 docker images -a 命令的话, 可以把中间层镜像都查出来:
理想效果:(在镜像列表里边除了 tomcat 和 CentOS 应该还夹杂着名为 < none > 的镜像)
遗憾的是: 博主一直没测出效果来, 也就是我的镜像列表里没有 < none > 的镜像(怀疑是版本的问题, 我的版本是 Docker 版本是 18.09.1,CentOS 的版本是 CentOS Linux release 7.3.1611 . 如果知道具体原因的不妨在评论区下告诉我)
Emmm, 我们可以使用 history 命令来看看, 可以发现 Tomcat 包含很多个镜像层
还可以发现一点: Dockerfile 有多少条命令, 那就有多少个镜像层(不信你数数)
说了那么多, 就想让大家知道: 我们拉取下来的镜像实际上是由很多中间层镜像组成的.
再结合我们上一篇 Docker 入门为什么可以这么简单?, 在解决 Tomcat 启动时一直卡住问题时, 能够发现的是, 我们可以使用 cd, ls 等基础命令, 但无法使用 vi 命令(需要我自己去下载).
我们可以推断出, pull 下来的镜像由很多层镜像组成[这些镜像都是精简过的(甚至连 vi 命令都不支持)]
因为 Tomcat 镜像要的基础环境比 CentOS 镜像要多, 所以 Tomcat 镜像的 SIZE 比 CentOS 要大
三, Docker 镜像的特点
关于 Docker 镜像, 有以下特点:
由 Dockerfile 生成
呈现层级结构
每层镜像包含: 镜像文件以及镜像 JSON 元数据信息
- FROM scratch
- COPY hello /
- CMD ["/hello"]
- FROM scratch
- ADD CentOS-7-docker.tar.xz /
- LABEL org.label-schema.schema-version="1.0" \
- org.label-schema.name="CentOS Base Image" \
- org.label-schema.vendor="CentOS" \
- org.label-schema.license="GPLv2" \
- org.label-schema.build-date="20181205"
- CMD ["/bin/bash"]
来源: https://yq.aliyun.com/articles/689275