容器学习Day09-理解容器镜像

系列文章目录

容器学习Day01-初识容器

容器学习Day02-VMware Workstation安装Ubuntu

容器学习Day03-Ubuntu常用命令(一)

容器学习Day04-Ubuntu常用命令(二)

容器学习Day05-Ubuntu常用命令(三)

容器学习Day06-Ubuntu常用命令(四)

容器学习Day07-Docker基础(一)

容器学习Day08-Docker基础(二)

容器学习Day09-理解容器镜像

容器学习Day10-搭建私有镜像仓库

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

容器学习Day12-使用Dockerfile构建容器镜像

容器学习Day13-Docker容器网络

容器学习Day14-Docker容器存储

容器学习Day15-Docker容器底层实现技术

容器学习Day16-Docker Compose容器编排


文章目录

前言

一、理解容器镜像

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

总结

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtobeKegio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值