Docker-核心篇(3)-Docker容器镜像

一、UnionFS

  1. UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统
  2. 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)
  3. Union 文件系统是 Docker 镜像的基础
  4. 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
  5. 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

二、镜像加载

  1. Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs
  2. 这一层与典型的Linux/Unix系统一样,包含boot加载器和内核
  3. 当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
  4. rootfs (root file system) ,在bootfs之上,包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件
  5. rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image.png

  1. 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了
  2. 由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

三、镜像分层

  1. 分层的镜像,pull为例,在下载的过程中可以看到docker的镜像好像是在一层一层的在下载
[root@localhost data]# docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
# 分层下载
16ec32c2132b: Pull complete 
6335cf672677: Pull complete 
cbc70ccc8ebe: Pull complete 
0d1a3c6bd417: Pull complete 
960f3b9b27d3: Pull complete 
aff995a136b4: Pull complete 
4249be7550a8: Pull complete 
4da411c5a406: Pull complete 
4b9c6ac629be: Pull complete 
4de7437f497e: Pull complete
  1. 删除的时候也是分层删除
[root@localhost data]# docker rmi mongo
Untagged: mongo:latest
Untagged: mongo@sha256:d78c7ace6822297a7e1c7076eb9a7560a81a6ef856ab8d9cde5d18438ca9e8bf
Deleted: sha256:aad77ae58e0c58ad95794d3fe2df3ba770be6633cd4321bbf423d4555813c07d
Deleted: sha256:41e182e5c67aa08e53d812b79668911d800b0e3ad0d0cb479f7a224a6e17e508
Deleted: sha256:1cff9be1a40466843a85137c5b8152deafeadcdd2ab18df406ef00a5443cb27c
Deleted: sha256:0d32c2d86c0c5c91d8e692fde64ad3a8e0c63ae1591006fcf7b129614d6cc4bf
Deleted: sha256:b8e46b2ea0eae31ebff37961ebd82f0d472a9e11fc8155345b23c71633918dea
Deleted: sha256:53688fa39c466b3df351c4eae26211861928d908798cdc3a4a75bfb883a1f4eb
Deleted: sha256:370c705504bcd2dceaba4b1f81f016b2a107a0f28ac957abe63da87ba122ecf5
Deleted: sha256:7335732c3552eb5a327184e4547a4e98acd664ebd5d2a1d3a5c2c9407fdf5762
Deleted: sha256:f569a6f2fe9c65ec15b9baa09ab312fd72ea5a08c691713850cd32d147fe7515
Deleted: sha256:1a5eaac255fb0d198d7a10042a454a3d13b0cee0c036f925a00e0c715c352199
Deleted: sha256:7555a8182c42c7737a384cfe03a3c7329f646a3bf389c4bcd75379fc85e6c144
  1. 采用分层结构的最大的一个好处就是共享资源,优点如下
    • 有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像
    • 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务
    • 而且镜像的每一层都可以被共享
  2. Docker镜像都是只读,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”,所有的操作都是基于容器完成而非镜像

四、镜像提交

  1. 当我们在运行一个容器时,可能需要修改一些东西,然后需要基于最新的镜像来创建一个新的镜像
  2. 可以使用docker commit提交容器副本使之成为一个新的镜像,新的镜像将会包含修改后的所有信息
    • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
docker commit -m "重新生成容器" -a "TianXinCoord" <已有容器id>  codecoord:1.0

五、虚悬镜像

  1. 仓库名、标签都是的镜像,俗称dangling image
  2. 利润编写一个Docker镜像,然后build时不指定任何tag
from ubuntu
CMD echo 'action is success'
  1. 运行镜像
    • docker build .:未指定任何tag
  2. 镜像查看
docker image ls -f dangling=true
  1. 虚悬镜像已经失去存在价值,可以删除
docker image prune
  1. 使用通过的 docker rmi 镜像id 方法一样可以删除,上述可以可以全部删除

猜你喜欢

转载自blog.csdn.net/sinat_34104446/article/details/125014490