Docker镜像
docker镜像是构建docker容器的基础,与常用的VM虚拟机做对比,如果使用VM启动一个操作系统,Dcoker镜像可以理解为此操作系统的ISO文件,即虚拟机运行的模板。
1.简介
- 描述:镜像=VM模板=类
- 组成:镜像=镜像层+镜像层(OS+文件+依赖包)
- 使用:Docker hub拉取—>本地Docker主机—>启动容器
2.镜像拉取
- 本地仓库:/var/lib/docker/<>
- 远程查找:docker search NAME
- 拉取镜像:docker image pull :(lastest不保证可以拉取最新镜像)
- 拉取全部:docker image pull -a
- 列出镜像:docker image ls
- 注意:将用户加入DOCKER UNIX组中
3.镜像命名和标签
- 两个不同标签可以指向相同镜像
- 悬虚镜像(dangling):在仓库中:存在,原因为构建新镜像,使用了已存在的表情
- 输出悬虚:docker image ls --filter dangling=true
- 删除悬虚:docker image prune
4.镜像过滤
-
–filter
command usage dangling 返回悬虚或非悬虚镜像 before 需要镜像名称/ID,返回之前被创建的全部镜像 since 返回指定镜像之后创建的全部镜像 label 根据标注的名称/值对镜像进行过滤 reference 过滤公式 -
–format
Go模板:”{{.size .rep .tag}}“
5.镜像分层
-
镜像由松耦合的只读镜像层构成
- 查看方法:(1)pull的时候的层次输出 (2)docker image inspect :
-
原理简述:
- 所有镜像都基于一个基础镜像层(比如一个系统)
- 进行修改或增加内容时,在当前镜像层之上建立新的镜像层
- 镜像始终保持是当前所有镜像层的组合
-
实现方式:通过快照方式
-
共享镜像层:镜像拉取时自动识别本地已经存在的镜像层进行共享,因此某一镜像层与镜像不是严格从属关系
-
创建镜像时镜像层的变化问题
所有的Docker都基于基础镜像层,当进行修改或添加新内容时,就会在当前的镜像层之上创建新的镜像层。在添加额外镜像层的同时,镜像始终保持当前所有镜像层的集合。如下图所示,第三层更新文件5时,会对第二层的文件5进行覆盖,整体看了此镜像仍是具有5个文件。
6.镜像散列值
- 为什么用散列值(SHA):当更新某个已存在的镜像,为新镜像重新打标签,旧镜像成为悬虚镜像被覆盖,表现为<none:none>如果生产环境中已经部署了大量镜像,那么仅凭标签已经无法区分,需要使用散列值来区分新老镜像
- 查看方式:docker image ls -digests —> SHA签名值
- 精确拉取:docker image pull @sha256
- 镜像散列值(摘要)
- 背景:镜像(唯一标识为加密ID)=一个或多个镜像层(每个镜像层拥有自身加密ID)+实际存储数据+元数据(加密ID是SHA256串)
- 实质:镜像本身和镜像层都有内容hash值校验,保证了不可被篡改
- 其他作用:镜像上传至仓库需要压缩,对于压缩后散列值改变无法校验的情况,系统中也有一个压缩后的散列值变量,解决了这个问题
7.多架构
- 实现一个镜像支持多种架构
- 策略:Manifest列表和Manifest文件
- 根据架构选择镜像是Docker自己完成
8. 镜像删除
- 删除某个:docker image rm
- 删除全部:docker image rm ${docker image ls -q} -f
9.镜像的创建
镜像创建的三种方法 |
---|
1. 从无到有,写Dockfile结合程序内容上下文进行创建 |
2. 用docker commit 通过运行/停止的容器创建,好处是可以在容器中运行时的改变代码,保存更改生成镜像 |
3.使用已存在的镜像进行创建,一种做法是在Dockerfile中FROM 已存在的镜像做基础层 |
10.相关命令
command | usage |
---|---|
docker image pull name:tag | 拉取镜像 |
docker image ls | 列出镜像 |
docker image inspect | 查看详细信息 |
docker image rm | 删除镜像,有容器依赖不可删除 |
docker image prune | 删除悬虚镜像 |