Docker 文件系统以及启动容器的文件系统变化

本文主要介绍一下 Docker 基础的东西,先介绍一下我的实现环境:
1. windows 10 正式版
1. Docker Toolbox
1. Docker version 1.8.2
1. 官方镜像 ubuntu:latest
这里我们主要只说 aufs/containers/graph 这三个目录。
1. 先进入 Docker 文件系统目录

ll /var/lib/docker #其中目录是这样的 /var/lib/docker -> /mnt/sda1/var/lib/docker/

df -h # 查看挂载情况

Filesystem                Size      Used Available Use% Mounted on
tmpfs                   896.6M    115.3M    781.3M  13% /
tmpfs                   498.1M         0    498.1M   0% /dev/shm
/dev/sda1                18.2G    300.1M     16.9G   2% /mnt/sda1
cgroup                  498.1M         0    498.1M   0% /sys/fs/cgroup
none                    100.0G     42.1G     57.9G  42% /c/Users
/dev/sda1                18.2G    300.1M     16.9G   2% /mnt/sda1/var/lib/docker/aufs

ls -l /mnt/sda1/var/lib/docker/
drwxr-xr-x    5 root     root          4096 Sep 28 01:59 aufs/          # 系统挂载目录,系统使用的aufs
drwx------    2 root     root          4096 Oct  7 03:48 containers/    # 容器文件系统
drwx------    7 root     root         12288 Oct  7 03:48 graph/         # 本地镜像
-rw-r--r--    1 root     root         15360 Oct  7 03:48 linkgraph.db  
-rw-------    1 root     root           105 Oct  7 03:48 repositories-aufs # 存储与image有关的基本信息
drwx------    2 root     root          4096 Oct  7 02:52 tmp/
drwx------    2 root     root          4096 Sep 28 02:01 trust/
drwx------    2 root     root          4096 Sep 28 01:59 volumes/
查看一下我本地的镜像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              91e54dfb1179        6 weeks ago         188.4 MB
我本地有一个 ubuntu:latest 的 office image, Image 的短 ID 是 91e54dfb1179。这里说明说一下 Docker 的镜像是由镜像层文件内容 和 json文件组成。
1. 镜像层文件存储在 /var/lib/docker/aufs/diff 中
1. 本地镜像的 json 文件存放在 /var/lib/docker/graph 文件夹下。
 

如上图所示,其中镜像的 json 文件中存储着镜像的元数据,譬如父镜像 id

在 /var/lib/docker/aufs/layers 存放着镜像ID以及层级关系,如下图,我们知道最底层的 IMAGE ID 是 d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
layers

我们查看容器层级内容

$ cd /var/lib/docker/aufs/diff/d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
$ ls
 

我们就看到了如上图所示的 rootfs 文件目录,而这个镜像就作为最根部的 Images ,我们使用的最终镜像 ubuntu:latest 就是在这个镜像的基础上根据各层级的关系动态添加的。
 

如上图,/var/lib/docker/graph 下的镜像 ID 以及镜像 json,查看 json 文件内容如下图:
 

如上图所示包含了,所有父镜像id,和在父镜像id 上执行的命令以及生成镜像id 等等所有元数据。当我们启动容器的时候,就会一步一步逐步的从 rootfs 上累加过来。
2. 启动容器

docker run -i -t ubuntu bash
当我们运行上边的命令的时候,基础过程如下:
1. 它会先检查我们本地是否存在 ubuntu:latest 的镜像,如果存在就加载镜像,也就是我们之前提到的 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 。
2. 创建容器,程序的 CreateRootfs 会调用 Create 函数来在 mnt 和 diff 文件夹下创建 ID-init 文件夹,然后通过程序的 GET 函数将依赖的 layers 层根据层级关系依次加载到 ID-init 文件夹下。只有 ID-init是可写,其它都是可读。
3. 再次调用 Create 函数来创建 ID文件夹,并在containers 文件夹下创建 ID 文件夹和所有配置文件 ,然后启动容器,将依赖的容器的层依次挂载到 ID 文件夹下。
当我们在容器内进行操作的时候,在 /var/lib/docker/containers/ID/ID-json.log 中就会进行日志存储,如下图

 

上图,从日志中我们可以看出,我们对容器操作有两部:
cd root
touch 1.txt
然后我们创建的 1.txt 文件,记在 /var/lib/docker/diff/ID/root/ 下,如下图
 

这就能很简单的看出 docker 的层级关系和数据关系。

时间: 2024-11-01 02:42:59

Docker 文件系统以及启动容器的文件系统变化的相关文章

两种方式创建docker镜像的启动容器时区别介绍(总结篇)_docker

Docker是建立在Linux内核基础上的,在目前的主流Linux系统中,都已经原生支持了Docker且使用体验也最好,当然,在Windows平台和MacOS系统中也支持Docker,只是需要使用类似Boot2Docker等虚拟化工具来提供Linux支持. 下面重点给大家介绍基于两种创建docker镜像的启动容器时区别,感兴趣的朋友可以跟着小编一起学习! 1.凡是用docker commit生成的镜像启动的时候可以加载一个启动自己应用的脚本,例如: docker run -d -P tomcat

SAMI:来自三星的基于Docker和Mesos的容器解决方案(二)

本文讲的是SAMI:来自三星的基于Docker和Mesos的容器解决方案(二),[编者的话]在<SAMI:来自三星的基于Docker和Mesos的容器解决方案(一)>中我们提到,为像SAMI一样的现代IoT服务提供一个稳定安全灵活的IT环境是很有挑战性的.现在我们来探索一下,如何用Mesos和Docker过渡解决这些问题. 开始,我们决定建立一个自动化的流水线,这将使以下成为可能: 构建有容错.自愈功能的基础设施. 使用现代集群管理/分布式初始化系统,确保应用程序定义副本始终都在运行. 使用G

ubuntu11.04启动 及虚拟文件系统

虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的.它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口.虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux 核心以及系统中运行的其他进程看来,都是相同的.严格说来,VFS并不是一种实际的文件系统.它只存在于内存中,不存在于任何外存空间.VFS在系统启动时建立,在系统关闭时消亡. 形象

[Docker系列·13] 使用fig启动容器

fig的使用非常简单,只需要配置fig.yml并在同目录下执行fig up -d即可启动容器. 配置fig.yml: node: image: feuyeux/ubuntu-node ports: - "8080:8080" links: - redis:node-redis mem_limit: 2g hostname: fig-node redis: image: feuyeux/redis hostname: fig-redis 配置中的两个镜像的创建,请参考本系列前面的文章:

docker启动容器的时候携带&amp;amp;quot;--restart=always&amp;amp;quot;参数后如何删除容器

问题描述 docker启动容器的时候携带"--restart=always"参数后如何删除容器 我尝试过docker rm -f但删掉后又会出现一个新容器.有什么办法能够彻底停止呢. 解决方案 http://www.simapple.com/339.html

linux的几个内核镜像格式Image 和 u-boot启动内核和文件系统时的一些环境变量的设置

关于编译powerpc linux的几个Image参考原文 http://blog.sina.com.cn/s/blog_86a30b0c0100wfzt.html 转载▼   PowerPC架构 Linux和ARM,X86等平台有些差异,PowerPC平台HW参数不是通过命令行方式传递到Linux,而是通过传递Device tree文件的方式传递参数,所以PowerPC平台Linux需要编译dtb和uImage才能正常加载,另外PowerPC架构linux还提供simpleImage的方式加载

《容器技术系列》一3.2 Docker Daemon的启动流程

3.2 Docker Daemon的启动流程 Docker Daemon和Docker Client的启动均通过可执行文件docker完成,因此两者的启动流程非常相似.Docker可执行文件运行时,程序运行通过不同的命令行flag参数,区分两者,并最终运行两者各自相应的部分.启动Docker Daemon时,一般可以使用以下命令:docker --daemon=true.docker –d; docker -d=true等.随后由Docker的main()函数来解析以上命令的相应flag参数,并

《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——第1章 使用Docker对应用进行容器化 1.1了解容器化应用的优缺点

第1章 使用Docker对应用进行容器化 Docker为应用程序的打包和运行提供了一种优雅的方式.使用喜欢的Linux系统,几分钟之内就能将Docker安装好并作为服务运行起来.构建.运行.停止.启动.调查.修改或者用其他的方式操作容器非常容易,说实话,很棒. Docker的简单易用使其成为当今最流行的开源项目之一.但是作为数据中心容器化核心的Docker却引起了极大的震动,其潜力无异于重新发明了个人和公司(或大或小)创建.测试.部署和管理其最关键应用程序的方式. 使用容器化技术也可以让应用程序

linux中Docker把应用放到容器里详解

在现实生活中,容器就是用来装东西的东西.把你的应用放到容器里,容器里的环境你可以自由定制,你可以在里面安装配置应用需要的任何东西,然后你可以把这个装载着应用的容器拿到任何地方去运行,这些地方不需要知道容器里面到底有什么,它只需要知道怎么样去运行这个容器就行了.Docker 提供了一系列的工具,让我们把应用放到容器里变得更简单. 镜像与容器 镜像与容器,image and container.基于镜像可以去创建容器,镜像有点像是容器的模板,比如你用 centos 镜像创建一个容器,这个容器里的环境