Docker--image分析

docker image是什么,存储在什么位置。


本文回答两个问题:

1. docker image是什么。

2. docker image存储在哪里,以什么形式存储。

1.       docker image是什么

image 里面是一层层文件系统,叫做 Union FS(联合文件系统)。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。虚拟文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。

构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。结构类似这样: 

从基本的看起,一个典型的 Linux 文件系统由 bootfs  rootfs 两部分组成,bootfs(boot file system) 主要包含bootloader  kernelbootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉。rootfs (root file system) 包含的就是典型 Linux 系统中的/dev/proc/bin/etc 等标准目录和文件。下图就是 docker image 中最基础的两层结构,不同的 linux 发行版(如 ubuntu  CentOS )  rootfs 这一层会有所区别,体现发行版本的差异性。

传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,然后在系统自检之后将 rootfs  read-only 改为 read-write,然后我们就可以在 rootfs 上进行读写操作了。但 Docker  bootfs 自检完毕之后并不会把 rootfs  read-only 改为 read-write,而是利用 union mountUnionFS 的一种挂载机制)将 image 中的其他的 layer 加载到之前的 read-only  rootfs层之上,每一层 layer 都是 rootfs 的结构,并且是read-only 的。所以,我们是无法修改一个已有镜像里面的 layer 的!只有当我们创建一个容器,也就是将 Docker 镜像进行实例化,系统会分配一层空的 read-write  rootfs ,用于保存我们做的修改。一层 layer 所保存的修改是增量式的,就像 git 一样。 

综上,image其实就是一个文件系统,它与宿主机的内核一起为程序提供一个虚拟的linux环境。在启动docker container时,依据imagedocker会为container构建出一个虚拟的linux环境。


2.       docker image存储在哪里,以什么形式存储。

当运行sudo docker pull ubuntu命令,从Docker HUB上下载一个ubuntu image后,这个image存储在宿主机的什么位置,以什么形式存储的呢。下面我们一步步来揭开这个答案。

Docker目前支持五种镜像层次的存储driveraufsdevice mapperbtrfsvfsoverlay。下面以aufs做介绍,这个也是我们系统上用的。

下载一个ubuntu image,修改tagxuzw,删除其他所有镜像。

在安装docker时,默认的安装位置是/var/lib/docker。让我们看看这个目录下面都有什么。

repositories-aufs:记录了镜像名称以及对应的Idjson文件,

graph:保存的是下载镜像的元数据,包括jsonlayersize,其中json文件记录了相应的image id、依赖关系、创建时间和配置信息等。layersize为对应层的大小。进入graph文件会发现下面包含着多个文件夹,其中有一个是以我们下载的镜像命名的文件夹ca4……,进入这个文件夹,可以看到jsonlayersize文件。

json文件内容部分截图如下,layersize显示为0。怎么会为0呢,不用着急,这一层为0,不表示镜像大小就是0Graph存储镜像时,是分层存储的,graph目录下多出的文件夹其实都对应一个layer。这些layer都与我们的镜像名命名的layer有关联,关系就记录在json文件中。 

从这个json文件中,可以看到起父镜像或者上一层镜像就是a46……,graph目录下也存储着这一层的信息。再往下看,可以看到层次关系是:ca4--> a46--> ea3- -> 233

graph这个目录里并没有找到我们想找到的镜像内容存放地。graph目录下只是一些镜像相关的信息数据。由上一节我们已经知道,image应该包含一个类似linux的文件系统才对。

containers:这个下面记录的是容器相关的信息,每运行一个容器,就在这个目录下面生成一个容器Id对应的子目录,如下图。

init:保存的是docker init相关的信息。

tmp:是一个空目录,具体起什么作用还不清楚。

volumes:与docker的数据券相关,在此不进行扩展。

       现在就只剩下aufs这个目录没有看了,进入aufs这个目录。

mntaufs的挂载目录,diff是实际数据来源,也就是我们image实际存储的地方,包括只读层和可读写层,所有这些层最终都一起挂载到mmt所在的目录。layers下为每层依赖有关的描述文件。

diffmntlayers下面有6个文件或子目录,但是从graph目录下看我们的image应该是4层,为什么会多出来2个呢。仔细观察多出来的来个文件或者子目录,会发现其名称和容器Id一致,且有一个包含init。这是为什么呢?

其实,在容器启动之前,mntlayers都是空目录,diff下面也只有graph目录下我们看到的镜像层对应的4个目录。

Docker利用image启动一个容器时,会在aufs下新建容器id对应的文件和子目录,同时在镜像的可读层执行新建一个可读写的layer。至于id-init文件或者子目录记录的都是与容器内环境相关的信息,与镜像无关。

既然我们现在已经知道了镜像实际是存储在diff目录下的,那么我们就看看diff目录下各个子目录中的内容。依照镜像的层次关系ca4--> a46--> ea3- -> 233查看。

最终我们看到linux一样的文件系统。已表示image确实是存储在diff目录下的。综上,docker image最终是存储在在/var/lib/docker/aufs/diff中的,同时在graph中有有关进行的记录。在容器启动时,diff下的可读层image和新增的可读写层“容器Id”都将挂载到mmt目录下以容器id命名的子目录下。

 

转载自: http://www.aboutyun.com/blog-31226-2850.html

### 回答1: Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用一个YAML文件来配置应用程序的服务,并且能够同时管理这些服务的创建、启动和停止等操作。Skyworking是一种基于Docker的分布式系统监控工具。 要使用Docker Compose部署Skyworking,首先需要创建一个docker-compose.yml文件,并编写服务的配置。这个文件可以包含多个服务,每个服务对应一个容器。在配置Skyworking服务时,需要指定镜像来源、端口映射、环境变量等信息。 接下来,在命令行中使用docker-compose命令来启动项目。使用`docker-compose up -d`命令可以在后台启动所有定义的服务,并自动创建和启动相应的容器。 当所有容器创建并运行起来后,即可访问部署的Skyworking应用。可以通过浏览器访问指定的IP地址和端口,来查看Skyworking提供的监控信息。 如果需要对部署的Skyworking进行更新或停止,可以使用`docker-compose up -d`和`docker-compose down`命令分别进行操作。 总结来说,使用Docker Compose部署Skyworking需要编写一个docker-compose.yml文件来定义服务,并使用docker-compose命令来启动容器。能够方便地管理和扩展分布式系统监控工具Skyworking。 ### 回答2: Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。SkyWalking是一个开源的分布式系统追踪解决方案,可以提供对分布式系统的性能和状态的监控。下面将详细介绍如何使用Docker Compose来部署SkyWalking。 首先,我们需要创建一个docker-compose.yml文件。在该文件中,我们定义了容器的配置和依赖关系。以下是一个简单的docker-compose.yml文件示例: ``` version: '3' services: skywalking: image: apache/skywalking-oap-server:8.6.0-es6 ports: - 12800:12800 environment: - SW_STORAGE=elasticsearch - SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 depends_on: - elasticsearch elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.8.18 environment: - discovery.type=single-node ``` 在这个例子中,我们定义了两个服务:skywalking和elasticsearch。skywalking服务使用了apache/skywalking-oap-server:8.6.0-es6镜像,并将主机的12800端口映射到容器的12800端口。在该服务的环境变量中,我们指定了要使用elasticsearch作为存储,并设置了elasticsearch的连接信息。elasticsearch服务使用了docker.elastic.co/elasticsearch/elasticsearch:6.8.18镜像,并设置了discovery.type为single-node,表示只有一个节点运行。 保存docker-compose.yml文件后,可以使用以下命令来启动服务: ``` docker-compose up -d ``` 该命令将会在后台启动并运行服务。使用`-d`参数可以将容器运行在后台。 在运行过程中,可以使用以下命令来查看服务的状态: ``` docker-compose ps ``` 这将显示所有正在运行的容器及其状态。 要停止服务,可以使用以下命令: ``` docker-compose down ``` 以上就是使用Docker Compose来部署SkyWalking的简单介绍。根据实际需求,还可以在docker-compose.yml中添加其他服务的定义和配置,以构建更复杂的应用程序。 ### 回答3: Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。而 SkyWalking 是一款开源的分布式系统的排查和性能分析工具。通过使用 Docker Compose 部署 SkyWalking,我们可以快速搭建起一个用于监控和分析分布式系统的环境。 首先,我们需要创建一个名为 docker-compose.yml 的文件,并在其中定义我们的服务。在这个文件中,我们需要包含以下几个部分的配置: 1. Version: 指定 Docker Compose 文件的版本号,例如 "version: '3'"。 2. Services: 定义我们的服务,包括 SkyWalking 的服务以及其他的依赖服务。在这里,我们可以指定每个服务的镜像、端口映射、环境变量等等。 3. Networks: 定义我们的网络,以便不同的服务可以相互通信。可以使用默认网络或者自定义网络。 4. Volumes: 定义我们的数据卷,用于持久化存储容器中的数据。 在定义了这些配置之后,我们可以使用命令 "docker-compose up" 来启动我们的应用程序。Docker Compose 会根据我们的配置自动创建和管理容器,使得整个部署过程变得非常简单和方便。 通过使用 Docker Compose 部署 SkyWalking,我们可以快速搭建起一个用于监控和分析分布式系统的环境,并且能够轻松地扩展和管理我们的服务。这样,我们就可以更好地监控和分析我们的分布式系统,从而提升系统的可靠性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值