目录

前言

一、理解容器镜像

1、什么是容器镜像?

2、容器镜像结构

3、容器镜像技术实现

二、镜像仓库

1、Repository

2、Registry

三、镜像的拉取和删除

1、查找镜像

2、拉取镜像

3、查看本地镜像

4、删除镜像

5、镜像打标签

总结

前言

今天继续学习Docker基础,了解一下容器镜像的相关知识。


一、理解容器镜像

1、什么是容器镜像?

容器镜像是容器的模板,容器是容器镜像的运行实例,容器运行时根据容器镜像创建容器。镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

2、容器镜像结构

容器镜像挂载在容器根目录下,是为容器中的应用提供隔离后执行环境的文件系统。容器镜像采用分层结构,Docker 镜像中引入了层(layer)的概念,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。分层结构是 docker 镜像如此轻量的重要原因。所有容器共享宿主机Kernel,并且不能修改宿主机Kernel,容器运行过程中使用容器镜像里的文件,使用宿主机Kernel。

Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,当需要修改容器镜像内的某个文件时,只对处于最上方的读写层进行变动,不覆写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本所隐藏。当使用 docker commit 提交这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。分层达到了在不同的容器同镜像之间共享镜像层的效果。

###下拉镜像时可以看到分层的效果。
root@docker:~# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest###也可以用命令查看分层。
root@docker:~# docker inspect httpd:latest
......
......"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/32eec3302e12d5cf016f87db8ae430823c03166fdb5646832cbbda891cc4395a/diff:/var/lib/docker/overlay2/98654e5355c759bb014a0ec907584c7f0254b7dfcedfa9a3f37db9eba1c25150/diff:/var/lib/docker/overlay2/7fdba6a853351e0e248e4d1546bb76586ad6d7e63a87f69f48a16779ba0f283c/diff:/var/lib/docker/overlay2/fe34ef435a65d2aafd93384869059c6a845802299e3797fb49772b52bd219d5d/diff","MergedDir": "/var/lib/docker/overlay2/8bce294f31275194c09ee5167e4860761b9410a5e7976f0dabd251479b67f16e/merged","UpperDir": "/var/lib/docker/overlay2/8bce294f31275194c09ee5167e4860761b9410a5e7976f0dabd251479b67f16e/diff","WorkDir": "/var/lib/docker/overlay2/8bce294f31275194c09ee5167e4860761b9410a5e7976f0dabd251479b67f16e/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f","sha256:1da636a1aa95e3ebce3b792e7321123a1ed5c593b8ef9f473fdf2b9969f4a6c7","sha256:15e4bf5d0804460f17050c3c511cd1733a583865fca18f6993e4b0f222aeab95","sha256:9cff3206f9a63cfbf021b4a99b80366b2e3d941813e9940fc8b5287a1af5c2f6","sha256:deefaa620a71254c6089757cd6fa7704da656d728ae722a10b562b350f70c674"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]

3、容器镜像技术实现

  • rootfs

rootfs 是 Docker 容器在启动时内部进程可见的文件系统,即 Docker 容器的根目录。rootfs 通常包含一个操作系统运行所需的文件系统,例如可能包含典型的类 Unix 操作系统中的目录系统,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 及运行 Docker 容器所需的配置文件、工具等。在传统的 Linux 操作系统内核启动时,首先挂载一个只读的 rootfs,当系统检测其完整性之后,再将其切换为读写模式。而在 Docker 架构中,当 docker daemon 为 Docker 容器挂载 rootfs 时,沿用了 Linux 内核启动时的做法,即将 rootfs 设为只读模式。在挂载完毕之后,利用联合挂载(union mount)技术在已有的只读 rootfs 上再挂载一个读写层。这样,可读写的层处于 Docker 容器文件系统的最顶层,其下可能联合挂载了多个只读的层,只有在 Docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的旧版本文件。

  • 联合文件系统(UnionFS)

联合文件系统(Union File System)内置于 Linux 内核中,它允许将一个文件系统的内容与另一个文件系统的内容合并,同时保持“物理”内容的分离。其结果是一个统一的文件系统,即使数据实际上是以分支形式组织。每一个镜像层都是Linux操作系统文件与目录的一部分,在使用镜像时,docker 会将所有的镜像层联合挂载到一个统一的挂载点上,表现为一个完整的 Linux 操作系统供容器使用。

  • 写时复制(copy-on-write)

docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。

  • 内存寻址

内容寻址存储(content-addressable storage)的机制,根据文件内容来索引镜像和镜像层。docker对镜像层的内容计算校验和,生成一个内容哈希值,并以此哈希值代替之前的UUID作为镜像层的唯一标志。该机制主要提高了镜像的安全性,并在pull, push, load和save操作后检测数据的完整性。另外,基于内容哈希来索引镜像层,在一定程度上减少了ID的冲突并且增强了镜像层的共享。对于来自不同构建的镜像层,只要拥有相同的内容哈希,也能被不同的镜像共享。

二、镜像仓库

1、Repository

Repository 是存放容器镜像的仓库,通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像,如果不给出标签,将以 latest 作为默认标签。

镜像仓库分为公有镜像仓库和私有镜像仓库。公有镜像仓库一般是 Docker官方或其他第三方组织提供的,允许所有人注册和使用的镜像仓库。除了公开镜像仓库,也可以构建自己的私有镜像仓库。

2、Registry

注册服务器是存放仓库的实际服务器,而仓库则可以被理解为一个具体的项目或者目录;注册服务器可以包含很多个仓库,每个仓库又可以包含多个镜像。例如docker.io/centos,docker.io 是注册服务器,centos 是仓库名。最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。注册服务器的地址(镜像源)可以在 /etc/docker/daemon.json 文件中查看与修改。

三、镜像的拉取和删除

1、查找镜像

查找镜像一般有两种方式,一种是在官方网站Docker Hub搜索。

另一种是使用 docker search 命令查找。

NAME:仓库名称。
  DESCRIPTION:镜像的描述。
  STARS:用户评价,反应一个镜像的受欢迎程度。
  OFFICIAL:是否是官方镜像。
  AUTOMATED:自动构建,表示该镜像由Docker Hub 自动构建流程创建。

###使用命令查找apache镜像
root@docker:~# docker search httpd
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                The Apache HTTP Server Project                  4244      [OK]
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   44
centos/httpd                                                                         35                   [OK]
solsson/httpd-openidc                mod_auth_openidc on official httpd image, ve…   2                    [OK]
clearlinux/httpd                     httpd HyperText Transfer Protocol (HTTP) ser…   2
hypoport/httpd-cgi                   httpd-cgi                                       2                    [OK]
dockerpinata/httpd                                                                   1
centos/httpd-24-centos8                                                              1
inanimate/httpd-ssl                  A play container with httpd, ssl enabled, an…   1                    [OK]
publici/httpd                        httpd:latest                                    1                    [OK]
manageiq/httpd                       Container with httpd, built on CentOS for Ma…   1                    [OK]
dariko/httpd-rproxy-ldap             Apache httpd reverse proxy with LDAP authent…   1                    [OK]
nnasaki/httpd-ssi                    SSI enabled Apache 2.4 on Alpine Linux          1
lead4good/httpd-fpm                  httpd server which connects via fcgi proxy h…   1                    [OK]
manasip/httpd                                                                        0
patrickha/httpd-err                                                                  0
httpdocker/kubia                                                                     0
httpdss/archerysec                   ArcherySec repository                           0                    [OK]
manageiq/httpd_configmap_generator   Httpd Configmap Generator                       0                    [OK]
amd64/httpd                          The Apache HTTP Server Project                  0
e2eteam/httpd                                                                        0
paketobuildpacks/httpd                                                               0
19022021/httpd-connection_test       This httpd image will test the connectivity …   0
avenga/httpd-static                                                                  0
ppc64le/httpd                        The Apache HTTP Server Project                  0

2、拉取镜像

查找到镜像后,可以通过 docker pull 命令拉取镜像,不添加tag标签默认会拉取latest版本镜像。也可以拉取指定版本镜像。

###不添加tag,默认拉取最新tomcat镜像。
root@docker:~# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
0f611256ec3a: Pull complete
4f25def12f23: Pull complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest###拉取其他tag的镜像。
root@docker:~# docker pull tomcat:9.0.69-jdk8-corretto-al2
9.0.69-jdk8-corretto-al2: Pulling from library/tomcat
68028ec3b506: Pull complete
d34cf93602c3: Pull complete
16b2aa0ac699: Pull complete
e729997a3739: Pull complete
2fca849541bf: Pull complete
Digest: sha256:ae6f8be19884a45ac1c153389b838e4bdb62ff963835d770a325a0ab885881a7
Status: Downloaded newer image for tomcat:9.0.69-jdk8-corretto-al2
docker.io/library/tomcat:9.0.69-jdk8-corretto-al2

3、查看本地镜像

拉取镜像之后,可以通过 docker images 命令查看镜像详细信息。

REPOSITORY:镜像名称。
 TAG:镜像标签。
 IMAGE ID:镜像ID。
 CREATED:镜像的创建日期。
 SIZE:镜像大小。

###查看本地镜像信息。
root@docker:~# docker images
REPOSITORY   TAG                        IMAGE ID       CREATED         SIZE
tomcat       9.0.69-jdk8-corretto-al2   a86c6637bbb1   5 days ago      379MB
tomcat       latest                     fb5657adc892   11 months ago   680MB
httpd        latest                     dabbfbe0c57b   11 months ago   144MB
ubuntu       latest                     ba6acccedd29   13 months ago   72.8MB

4、删除镜像

不用的镜像可以使用 docker rmi 命令从本地删除。通过镜像创建的容器未被销毁时,该镜像是无法被删除的,要先停止并删除容器后,才能删除此镜像。

###查看镜像信息。
root@docker:~# docker images
REPOSITORY   TAG                        IMAGE ID       CREATED         SIZE
tomcat       9.0.69-jdk8-corretto-al2   a86c6637bbb1   5 days ago      379MB
tomcat       latest                     fb5657adc892   11 months ago   680MB
httpd        latest                     dabbfbe0c57b   11 months ago   144MB
ubuntu       latest                     ba6acccedd29   13 months ago   72.8MB###通过镜像名和标签删除指定镜像。
root@docker:~# docker rmi tomcat:latest
Untagged: tomcat:latest
Untagged: tomcat@sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Deleted: sha256:fb5657adc892ed15910445588404c798b57f741e9921ff3c1f1abe01dbb56906
Deleted: sha256:2b4d03a9ce5e200223e5c398d4739d23dd19ad0d6e692cfc65ba3a8fae838444
Deleted: sha256:35c5ea12be1face90896b3a52afc28433885c4448a6c5cfe07561f82365cd18e
Deleted: sha256:6830091c111746b7534960d17f6c156be45d8dcfe0defb06bd427ef38bf49aae
Deleted: sha256:ea82d4efcdfa1c039d722a5a9613c18d3c3a84fbba8efae5e7f13cb3b4ec379f
Deleted: sha256:79a6c362c6b1a580d2d8d33f6d860d45c530f34ff7c0441d36b61aceefdfd656
Deleted: sha256:1788a74c5c86e769f61cd615269eba11c3d7648eac4a85a1ffd2840427820a2f
Deleted: sha256:cbce712ed17923285239f9d9c0528984aef065b7413d68a0290e2c8eecc98f4a
Deleted: sha256:aa56d037ee5925ebf11127c3e1f617874c4ce8bae6b6af7d132b7f7a4a606e6f
Deleted: sha256:97e5f44efb543d466c5847602654a8cb22c9466b61d04988d47ec44b197ea874
Deleted: sha256:11936051f93baf5a4fb090a8fa0999309b8173556f7826598e235e8a82127bce###通过镜像ID删除指定镜像。
root@docker:~# docker rmi a86c6637bbb1
Untagged: tomcat:9.0.69-jdk8-corretto-al2
Untagged: tomcat@sha256:ae6f8be19884a45ac1c153389b838e4bdb62ff963835d770a325a0ab885881a7
Deleted: sha256:a86c6637bbb1f628f634817a81d3ab144b68b3d332d07dfe6808b632e0ed5cad
Deleted: sha256:16ba1b0c1192e6d3c2c33ca8e811b79f8de8f38b105aed38c96a683f9d1e0335
Deleted: sha256:1ea58baf4db47259aad8d2b20e23e71d07107d33028df43e8619615332f761d6
Deleted: sha256:0e75ec84175128c62737148209d393b3ee9abb0a14c8b8b4f87c04d0758ca219
Deleted: sha256:1773f5eaa4568fcbdb1bed746aad9238c3e71ac358512b4e0d9cd6ba95bd2dcd
Deleted: sha256:4635ea08a5587840b3141185b30f1c667584b11e9ec96c47152563f52d7882e4

5、镜像打标签

docker tag 命令用于给镜像打标签,自定义修改容器并提交新的镜像之后,可以定义标签,以便做版本管理。

###使用docker tag命令定义新标签。
root@docker:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        latest    dabbfbe0c57b   11 months ago   144MB
ubuntu       latest    ba6acccedd29   13 months ago   72.8MB
root@docker:~# docker tag httpd:latest httpd:v1
root@docker:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        latest    dabbfbe0c57b   11 months ago   144MB
httpd        v1        dabbfbe0c57b   11 months ago   144MB
ubuntu       latest    ba6acccedd29   13 months ago   72.8MB

总结

以上今天学习了解的内容,主要是容器镜像相关知识,后面了解如何构建自己的镜像。

容器学习Day09-理解容器镜像相关推荐

  1. 容器学习 之 限制容器资源(十一)

    内存限额 使用方法: -m 或 --memory:设置内存的使用限额,例如 100M, 2G. –memory-swap:设置 内存+swap 的使用限额. docker run -m 200M -- ...

  2. 容器学习 之 自定义容器网络(十三)

    Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan.overlay 和 macvlan 用于创建跨主机的网络,我们后面有章节单独讨论. 我们 ...

  3. Mini 容器学习笔记4——组件的生命周期(应用篇)

    Mini容器支持6中生命周期类型: 1. Singleton :单利类型(缺省组件都是单利类型的生命周期,由容器进行托管的) [Test]public void SingletonLifestyleT ...

  4. Mini 容器学习笔记6——组件的获取(应用)

    1. 通过组件Id获取组件实例: [Test]public void GetByIdTest(){ServiceRegistry.Register<Person>("person ...

  5. Docker学习二:Docker镜像与容器

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  6. 《深入剖析Kubernetes》-张磊——白话容器基础(三):深入理解容器镜像

    <深入剖析Kubernetes>-张磊 白话容器基础(三):深入理解容器镜像 写在前面: 张磊的极客时间课程<深入剖析Kubernetes>,是我见过讲docker和k8s最好 ...

  7. 容器学习 之 镜像命令(九)

    images 显示镜像列表 root@ubuntu:/home/yj# docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-image late ...

  8. 重新学习c++--理解引用、智能指针、虚函数、模板、容器

    最近几年用c和python比较多,上次用c++写程序已经是几年前的事情了.温故而知新,是时候重新学习下c++了. C++可以分成四大块去理解: C c++仍以C为基础,区块blocks.语句state ...

  9. 容器学习Day11-docker commit构建容器镜像

    目录 前言 一.docker commit 构建镜像 1.基于OS基础镜像构建 2.基于厂商提供的基础镜像构建 二.docker commit 构建镜像的缺点 总结 前言 前面了解了镜像仓库的搭建,那 ...

最新文章

  1. 100+篇技术文章推荐总有一篇你想看的
  2. 短视频SDK架构设计,短视频APP开发目标首选
  3. 学python语言用什么软件-对于自学python的初学者来说,应该使用什么编辑工具?...
  4. wxWidgets:wxDynamicLibrary类用法
  5. mac10.12 安装mysql_在mac os10.12上安装mysql5.7.18
  6. Codeforces Round #704 (Div. 2) E. Almost Fault-Tolerant Database 思维
  7. WCF简单教程(5) 用IIS做Host
  8. java 线程安全list_JAVA并发编程实战-线程安全性
  9. ROS( C++ )订阅 robot 的 path 话题
  10. weui.picker 乱码处理
  11. 协同过滤算法(天池竞赛试题)
  12. Android build.gradle文件详解(转述自《Android第一行代码》第二版)
  13. gensim实现TF-IDF和LDA模型、sklearn实现聚类
  14. 系统保留分区删除_什么是系统保留分区,您可以删除它吗?
  15. 如何利用安全问题重置Win10系统开机锁屏密码?
  16. 基于微信小程序的西餐外卖系统的设计与实现NodeJS-计算机毕业设计
  17. 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法
  18. IWS国际儿童及青少年水彩画大赛开始了
  19. 为什么我们要替换Docker?
  20. 高德地图——浏览器定位+点击获取经纬度+去除高德百度地图左下角logo

热门文章

  1. MATLAB:零状态响应(lsim(连续);filter(离散))、冲激响应(impulse或impz)和阶跃响应(step)、卷积(conv)
  2. NATAPP安装和配置(附加NATAPP后台运行)
  3. 制作一个用户头像选择器仿 WeGame
  4. IfThen/IIF/Case
  5. 远程工作:从300到300万,一个远程外包团队的发展历程和经验【转载】
  6. 全面公测|Grafana服务:一张图表胜过千行指标日志
  7. 最牛逼 Java 日志框架 — Log4j2,性能无敌,横扫对手.....
  8. 计算机网络课外实验一级 20175319江野
  9. 【雕爷学编程】Arduino动手做(102)---TM1638按键数码管
  10. 数据为王,聚数学院引领大数据新时代