• 作者:老汪软件技巧
  • 发表时间:2024-12-31 07:04
  • 浏览量:

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

docker镜像分发_docker分层_

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile

Docker镜像(本小节属于)

Docker仓库

Docker原理

Docker网络&存储&日志

Docker-Compose

Docker番外篇

我们前面下载的官方镜像,也通过Dockerfile编写自己的镜像,那这个镜像到底是一个什么的文件,在Linux里面到底是怎么存在的呢?下面我们将通过拆解镜像文件来确认这些问题。

这里我们找了一新机器,安装完成Docker以后,下载了一个centos7的镜像,首先我们先看看这个镜像的是怎么构建的。

_docker分层_docker镜像分发

从这个构建过程我们可以看到就是通过ADD增加了一个文件,然后有一个标签和CMD,标签和CMD都是大小都是0,也就是没有真实数据,在运行容器的时候才会生效。

然后我们在讲的时候,介绍过docker对应的目录里面有2个目录是跟镜像相关

docker分层__docker镜像分发

# 这个是只有一个镜像的情况
cat /var/lib/docker/image/overlay2/repositories.json
{
  "Repositories": {
    "192.168.31.43:5000/centos": {
      "192.168.31.43:5000/centos:7": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9",
      "192.168.31.43:5000/centos@sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9"
    }
  }
}

这个镜像id,无论是下载到哪个服务器,这个值都不会改变。

_docker分层_docker镜像分发

_docker镜像分发_docker分层

在镜像和容器存储目录下是这样的

# 这个也是只有一个容器的的目录结构
[root@localhost overlay2]# pwd
/var/lib/docker/overlay2
[root@localhost overlay2]# ll
total 0
drwx--x--- 3 root root     30 Dec  1 11:44 98307d998c9cea8d1880a1a97139fb09c3ca3c188e34dec219347c45242fb8b1
brw------- 1 root root 253, 0 Dec  1 11:44 backingFsBlockDev
drwx------ 2 root root     40 Dec  1 11:44 l

而这个983xxx的目录下其实就是centos7镜像的下的rootfs文件。

_docker镜像分发_docker分层

当我们继续增加了其他镜像的时候,这个数据目录也会进行增加。

docker镜像分发_docker分层_

增加了一个容器,对应的目录也增加。

docker镜像分发_docker分层_

如果把一个镜像文件(通过docker save打包的文件),解压出来以后看到的目录大概是这样的

docker分层__docker镜像分发

blobs:通常存储就是镜像的文件数据,其他文件就是这个镜像的元数据,简单来理解就是blobs的内容就是放置到overlay2目录,其他数据会放置到image目录。

其实上面的东西有点抽象,这篇文章写了好久也没有找到比较好的方式来描述这个问题。

简单的总结下:

1.在构建Dockerfile的时候,每一个命令,其实就是一层,所以我们通过&&把多个命令组装在一起,可以节约层数。

2.有些层数是大小是0,会在运行容器的时候才生效,所以从overlay2里面就看不到对应的目录。

3.一个基础镜像是200M,然后我基于这个镜像做了新的增加,增加的内容是1M,那么这个镜像的大小就是201M,加前面一个200M镜像应该是400M,但是实际还是只有200M的样子。

docker镜像分发__docker分层

4.我们无论在上传还是下载的镜像的时候,都会把这个镜像信息进行比对,还是接着刚才的2个镜像如果要上传到仓库,第一次就会真实上传200M,上传第二个镜像的时候,他就只会上传那1M文件;如果是下载也是同理。这样就可以实现,上传,下载,本地存储都可以复用相同的层。

5.曾经踩过的坑:就是镜像某个层被删除&损坏,无法正常运行容器,后面是通过重新下载镜像还是重新load解压镜像才解决的(具体是哪个已经忘记)。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!


上一条查看详情 +鸿蒙开发:文本合成语音
下一条 查看详情 +没有了