首页 > 其他分享 >Docker 镜像

Docker 镜像

时间:2024-12-15 13:31:25浏览次数:3  
标签:容器 删除 分层 镜像 Docker docker digest

docker镜像简介

​ 镜像是一种轻量级、可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等。几乎所有应用,直接打包为 Docker 镜像后就可以运行。

​ 由于镜像的运行时是容器,容器的设计初衷就是快速和小巧,所以镜像通常都比较小,镜像中不包含内核,其共享宿主机的内核;镜像中只包含简单的 Shell,或没有 Shell

镜像定位

对于任何镜像,都可通过**<repository>:<tag>进行唯一定位。其中<tag>一般称为镜像的版本号。<tag>中有一个比较特殊的版本——latest。如果不指定,默认<tag>**即为 latest。不过,虽然其字面意思是最新版,一般其也的确存放的是最新版,但并不能保证其真的就是最新版。

镜像相关命令

如果不确定命令作用,可以使用help命令进行查看

 我们平常用的命令可以在docker --help中找到

docker pull

通过 docker pull 命令可以将指定的镜像从 docker hub 拉取到本地。如果没有指定镜像则会抛出一个 Error。

例如:如下图是适用docker pull命令拉去php的镜像

 

 注意:如果不带版本号则默认下载lastest版本

DIGEST进行获取

digest,是镜像内容的一个 Hash 值,即所谓的 Content Hash(内容散列)。只要镜像内容发生了变更,其内容散列值就一定会发生改变。注意,digest 是包含前面的 sha256 的,表示该 digest 的产生所采用的 Hash 算法是 SHA256。使用该拉取方式的具体场景或用途,后面会详解。

docker pull zookeeper:@sha256:c7a6a6ea6a1413ca3c13e987a4f9a1d6d2ba62b1837c3b356875842c64458b73

 

 

docker images

通过 docker images 命令可查看本地所有镜像资源信息。这些镜像会按照镜像被创建的时间由近及远排序。

 REPOSITORY:镜像仓库名称

TAG:镜像版本号

IMAGE ID:镜像的唯一标识

CREATE:镜像的创建时间

SIZE:镜像大小

查看完整镜像 ID

默认的 docker images 显示的镜像 id 是经过截取后的显示结果,仅显示了前 12 位。使用 --no-trunc 参数后显示的是完成的镜像 id

 查看镜像 digest

 格式化显示

docker images --format {{.Repository}}:{{.Tag}}:{{.Size}}

docker search

通过 docker search 命令可以从 docker hub 上查看指定名称的镜像。

docker search tomcat

 过滤检索结果

docker search tomcat --filter-official=true

 以上检索方式与从 docker hub 官网 https://hub.docker.com 查看是一样的,但没有官网查看的直观

docker rmi

rmi,remove images。该命令用于删除指定的本地镜像。镜像通过**<repository>:<tag>**指定。如果省略要删除镜像的 tag,默认删除的是 lastest 版本

docker rmi hello-world

删除多个镜像

docker rmi 命令可一次性删除多个镜像,多个要删除的镜像间使用空格分隔。

docker rmi hello-world zookeeper:3.7 ......

通过 ImageID 删除镜像

docker rmi 也可通过 ImageID 指定要删除的镜像

docker rmi feb5d9fea6a5

 强制删除镜像

默认情况下,对于已经运行了容器的镜像是不能删除的,必须要先停止并删除了相关容器然后才能删除其对应的镜像。不过,也可以通过添加-f 选项进行强制删除

docker rmi -f hello-world

删除所有镜像

使用组合命令删除所有镜像。当然,如果不携带-f 选项,则不会删除已打开容器的镜像

docker rmi -f $(docker images -q)

导出/导入镜像

docker save 命令用于将一个或多个镜像导出为 tar 文件。例如,下面的命令是将 busybox与 hello-world 镜像导出到当前/root 目录的 my.tar 文件中。

# 使用root用户进入到根目录
cd ~
docker save -o export.tar busybox:latest hello-world:latest
# 这种方式导出也可以
docker save busybox:latest hello-world:latest > export.tar

导入镜像 load

镜像分层

 什么是分层

Docker 镜像由一些松耦合的只读镜像层组成,Docker Daemon 负责堆叠这些镜像层,并将它们关联为一个统一的整体,即对外表现出的是一个独立的对象。

通过 docker pull 命令拉取指定的镜像时,每个 Pull complete 结尾的行就代表下载完毕了一个镜像层。例如,下面的 redis:latest 镜像就包含 6个镜像层,其中第一个镜像层已经存在,其余5个正常下载。

 为什么分层

​ 采用这种分层结构的优势很多,例如,每个分层都是只读的,所有对分层的修改都是以新分层的形式出现,并不会破坏原分层内容;再如,每个分层只记录变更内容,所以有利于节省存储空间等。

​ 不过,分层结构的最大的好处是,在不同镜像间实现资源共享,即不同镜像对相同下层镜像的复用。对于 docker pull 命令,其在拉取之前会先获取到其要拉取镜像的所有 ImageID,然后在本地查找是否存在这些分层。如果存在,则不再进行拉取,而是共享本地的该分层。大大节点的存储空间与网络带宽,提升了拉取效率。

镜像 FS 构成

一个 docker 镜像的文件系统 FS 由多层只读的镜像层组成,每层都完成了特定的功能。而这些只读镜像层根据其位置与功能的不同可分为两类:基础镜像层与扩展镜像层。

基础镜像层

所有镜像的最下层都具有一个可以看得到的基础镜像层 Base Image,基础镜像层的文件系统称为根文件系统 rootfs。

而 rootfs 则是建立在 Linux 系统中看不到的引导文件系统bootfs 之上。

扩展镜像层

在基础镜像层之上的镜像层称为扩展镜像层。顾名思义,其是对基础镜像层功能的扩展。在 Dockerfile 中,每条指令都是用于完成某项特定功能的,而每条指令都会生成一个扩展镜像层。

容器层

一旦镜像运行了起来就形成了容器,而容器就是一个运行中的 Linux 系统,其也是具有文件系统的。容器的这个文件系统是在 docker 镜像最外层之上增加了一个可读写的容器层,对文件的任何更改都只存在于容器层。因此任何对容器的操作都不会影响到镜像本身。

容器层如果需要修改某个文件,系统会从容器层开始向下一层层的查找该文件,直到找到为止。

任何对于文件的操作都会记录在容器层。例如,要修改某文件,容器层会首先把在镜像层找到的文件 copy 到容器层,然后再进行修改。删除文件也只会将存在于容器层中的文件副本删除。

可以看出,Docker 容器就是一个叠加后的文件系统,而这个容器层称为 Union File System,联合文件系统。

镜像摘要 digest

每个镜像都有一个长度为 64 位的 16 进制字符串作为其摘要 digest

通过 docker inspect 命令可以查看指定镜像的详细信息。其中就包含该镜像的摘要信息。

摘要有何用

摘要的主要作用是区分相同:的不同镜像。

例如镜像 xxx:2.8 在生产运行过程中发现存在一个 BUG。现对其进行了修复,并使用原标签将其 push 回了仓库,那么原镜像被覆盖。但生产环境中遗留了大量运行中的修复前镜像的容器。此时,通过镜像标签已经无法区分镜像是修复前的还是修复后的了,因为它们的标签是相同的。此时通过查看镜像的 digest 就可以区分出修改前后版本,因为内容发生了变化,digest 一定会变。

为了确保再次拉取到的是修复后的镜像,可通过 digest 进行镜像拉取。其用法是:docker pull <repository>@<digest>

下面的例子是,先查出 hello-world 镜像的 digest,然后将该镜像删除,然后再通过digest 对其进行拉取。

 不过,不方便的是,镜像的摘要需要由运维人员在本地进行手工维护。

 

标签:容器,删除,分层,镜像,Docker,docker,digest
From: https://www.cnblogs.com/yansunda/p/18606928

相关文章

  • Docker应用
    需要知道什么Docker概述Docker安装(配置阿里云镜像加速器,要不pull镜像下载的慢)portainer可视化界面关于镜像、容器、仓库的命令等数据卷Docker网络DockerFileDockerCompose回顾主要讲的是Docker概念+使用Docker部署一个......
  • maven docker-maven-plugin 发布docker 20241214
    1、docker开启远程访问 端口 2375  docker主机:192.168.177.128vi/usr/lib/systemd/system/docker.service#修改ExecStart这行ExecStart=/usr/bin/dockerd-Htcp://0.0.0.0:2375 #重新加载配置文件[root@localhost~]#systemctldaemon-reload#重启服务[......
  • win10 docker wsl 报错:管理员用策略规则 %2 限制了对 %1 的访问
    Window10使用Docker的时候,需要使用wsl,在本地启用了Hyper-V后,执行wsl报错:程序“wsl.exe”无法运行:管理员用策略规则%2限制了对%1的访问。所在位置行:1字符:1+wsl--status+~~~~~~~~~~~~。所在位置行:1字符:1+wsl--status+~~~~~~~~~~~~+Ca......
  • docker安装
    ubuntu安装docker更新软件包索引:apt-getupdate允许APT使用HTTPS:apt-getinstallapt-transport-httpsca-certificatescurlsoftware-properties-commonlsb-releaselibssl-dev添加Docker官方GPG密钥:curl-fsSLhttp://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg|su......
  • docker搭建nginx-php环境
    首先,创建一个Dockerfile文件,内容如下:FROMphp:7.4-fpmRUNsed-i's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g'/etc/apt/sources.listRUNsed-i's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/g'/etc/apt/sources.list#安装NginxRUNapt-ge......
  • docker安装最新版nacos详细教程
    一、下载最新版nacos,linux如果没有安装docker,百度自行查找linux安装docker教程dockerpullnacos/nacos-server下载完成后查看已下载的镜像dockerimages二、运行nacos容器dockerrun--namenacos-eMODE=standalone-p8848:8848-dnacos/nacos-server 九、浏览器访问n......
  • 浅入浅出docker run命令源码2-containerd篇
    1、前情回顾上次《浅入浅出dockerrun命令源码》代码看到调用了grpc去让containerd启动容器就没有继续看了.连一刻都没有为dockerd的无疾而终而哀悼,立刻来到战场的是containerd…这次,我们先解决下面的问题1、dockerd是怎么启动的containerd2、怎么调试containerd的源......
  • Docker中桌面程序研发
    由于经常工作的环境基本上是在Windows系统上,如果需要研发一些Linux桌面程序就必须安装虚拟机,然后在虚拟机中研发。由于平时工作使用docker较多,想想能不能使用docker进行桌面程序研发呢要想做到这个也不复杂,毕竟Linux有大名鼎鼎的XWindowSystem(也称X11或X)。XWindow......
  • docker常用命令的使用(超详细通俗易懂小白上手)
    1.Docker是一个开源的平台,用于开发、打包和运行应用程序。它通过容器技术将应用程序及其依赖打包在一起,确保在任何环境中都能一致地运行。Docker提供了轻量级、可移植和高效的方式来管理应用程序的生命周期,使得开发、测试和部署更加便捷和快速。2.镜像命令2.1docker拉取ng......
  • 81、docker compose 安装常用的软件
    1、dockercompose安装Redisversion:'3.8'services:redis:image:redis:latest#使用Redis最新版本的镜像container_name:redisports:-"6379:6379"#映射Redis默认端口volumes:-redis-data:/data#Redis数据持久......