- 作者:老汪软件技巧
- 发表时间:2024-12-31 07:04
- 浏览量:
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile
Docker镜像(本小节属于)
Docker仓库
Docker原理
Docker网络&存储&日志
Docker-Compose
Docker番外篇
我们前面下载的官方镜像,也通过Dockerfile编写自己的镜像,那这个镜像到底是一个什么的文件,在Linux里面到底是怎么存在的呢?下面我们将通过拆解镜像文件来确认这些问题。
这里我们找了一新机器,安装完成Docker以后,下载了一个centos7的镜像,首先我们先看看这个镜像的是怎么构建的。
从这个构建过程我们可以看到就是通过ADD增加了一个文件,然后有一个标签和CMD,标签和CMD都是大小都是0,也就是没有真实数据,在运行容器的时候才会生效。
然后我们在讲的时候,介绍过docker对应的目录里面有2个目录是跟镜像相关
# 这个是只有一个镜像的情况
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,无论是下载到哪个服务器,这个值都不会改变。
在镜像和容器存储目录下是这样的
# 这个也是只有一个容器的的目录结构
[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 save打包的文件),解压出来以后看到的目录大概是这样的
blobs:通常存储就是镜像的文件数据,其他文件就是这个镜像的元数据,简单来理解就是blobs的内容就是放置到overlay2目录,其他数据会放置到image目录。
其实上面的东西有点抽象,这篇文章写了好久也没有找到比较好的方式来描述这个问题。
简单的总结下:
1.在构建Dockerfile的时候,每一个命令,其实就是一层,所以我们通过&&把多个命令组装在一起,可以节约层数。
2.有些层数是大小是0,会在运行容器的时候才生效,所以从overlay2里面就看不到对应的目录。
3.一个基础镜像是200M,然后我基于这个镜像做了新的增加,增加的内容是1M,那么这个镜像的大小就是201M,加前面一个200M镜像应该是400M,但是实际还是只有200M的样子。
4.我们无论在上传还是下载的镜像的时候,都会把这个镜像信息进行比对,还是接着刚才的2个镜像如果要上传到仓库,第一次就会真实上传200M,上传第二个镜像的时候,他就只会上传那1M文件;如果是下载也是同理。这样就可以实现,上传,下载,本地存储都可以复用相同的层。
5.曾经踩过的坑:就是镜像某个层被删除&损坏,无法正常运行容器,后面是通过重新下载镜像还是重新load解压镜像才解决的(具体是哪个已经忘记)。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!