Docker--镜像的分层结构

一.Docker镜像的简单概述
Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker容器的基础。Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境–rootfs。可以这么理解,Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态
二.镜像的分层结构
1.共享宿主机的内核
2.base镜像提供的是最小的linux发行版
其实就是linux的根/文件系统
3.同一docker主机支持运行多种linux发行版
4.采用分层结构的做大好处是“共享资源”
不同镜像应用的base images相同时,文件资源便可以实现共享,只需备份一份,节省空间
(1)查看宿主机内核版本

[root@server1 ~]# hostnamectl
   Static hostname: server1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: adbb5cea5daa4badbfdbfa7e54d8a796
           Boot ID: 51a87e4fea66403bb6fd5af6253a0309
    Virtualization: kvm
  Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)  ##宿主机版本
       CPE OS Name: cpe:/o:redhat:enterprise_linux:7.3:GA:server
            Kernel: Linux 3.10.0-514.el7.x86_64  ##内核版本
      Architecture: x86-64

(2)创建容器,以ubuntu和rhel7.为例

[root@server1 ~]# docker load -i ubuntu.tar  ##添加镜像
[root@server1 ~]# docker load -i rhel7.tar
[root@server1 ~]# docker images  ##查看拉取的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago      
[root@server1 ~]# docker run -it --name vm2 ubuntu  ##创建并运行容器 -it:以交互式方式打开
root@968b6527f284:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@968b6527f284:/# uname -r  ##查看创建的容器内核
3.10.0-514.el7.x86_64  ##与宿主机内核版本一致,开启秒进

[root@server1 ~]# docker run -it --name vm3 rhel7 bash
bash-4.2# ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr
bash-4.2# uname -r
3.10.0-514.el7.x86_64  ##内核版本与宿主机一致

5.Copy-on-Write为可写容器层
容器以下所有镜像曾都是只读的,docker查找文件时是从上往下依次查找;容器层用来保存镜像变化的部分,并不会对镜像本身进行任何修改;一个镜像最多可以有127层
docker容器进行可写时,是在可写容器层进行可写动作,经底层镜像层的文件会先复制到可写层再执行删除、创建等动作

[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server1 ~]# docker run -it --name vm1 ubuntu  ##创建容器并运行
root@eda3efc58dbe:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@eda3efc58dbe:/# touch file{1..10}  ##在此容器内创建文件
root@eda3efc58dbe:/# ls  ##创建成功
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
root@eda3efc58dbe:/# exit
exit
[root@server1 ~]# docker rm vm1  ##删除此容器,此时容器内创建的文件均没有保存
vm1

[root@server1 ~]# docker run -it --name vm1 ubuntu  ##创建一个容器
root@b89eda1165bc:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@b89eda1165bc:/# touch file{1..10}  ##容器内创建文件
root@b89eda1165bc:/# ls
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
root@b89eda1165bc:/# exit
exit
[root@server1 ~]# docker commit vm1 ubuntu:v  ##将此容器重新打包为一个镜像
sha256:c2f1ba9cb3fd7a568516c83e254996b5a71008742c5eef89df75f0e23fd74aa2
[root@server1 ~]# docker images  ##查看镜像(v镜像存在)
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              v                   c2f1ba9cb3fd        8 seconds ago       188MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server1 ~]# docker rm vm1  ##删除创建的容器
vm1
[root@server1 ~]# docker run -it --name vm1 ubuntu:v  ##运行此容器
root@8295ef1b62d4:/# ls  ##创建的文件依然存在
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
[root@server1 ~]# docker history ubuntu:v  ##查看v镜像的构造历史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c2f1ba9cb3fd        7 minutes ago       /bin/bash                                       29B                 
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB   
 [root@server1 ~]# docker history ubuntu  ##查看ubuntu镜像的构造历史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB      
 [root@server1 ~]# docker rm -f vm1  ##删除容器
vm1
[root@server1 ~]# docker rmi ubuntu:v  ##删除此镜像
Untagged: ubuntu:v
Deleted: sha256:c2f1ba9cb3fd7a568516c83e254996b5a71008742c5eef89df75f0e23fd74aa2
Deleted: sha256:24cba2123fce1b0980f0ce09682d88262555163f8c9663086765459ce9c0b033                  

07c86167cdc4为ubuntu:v与ubuntu公用,即ubuntu:v基于 ubuntu 构造,
镜像构造时都是一层一层往上构造的,底层均为公用镜像层


版权声明:本文为weixin_44822212原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。