docker系列之(三)联合文件系统和写时复制

上一章,我们讲解了docker镜像的常用命令,现在讲解联合文件系统

https://www.fcors.com/%e6%8a%80%e6%9c%af%e4%b8%8e%e6%a1%86%e6%9e%b6/docker%E7%B3%BB%E5%88%97%E4%B9%8B%EF%BC%88%E4%BA%8C%EF%BC%89%E9%95%9C%E5%83%8F%E7%9A%84%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/

一、docker运行基本构成

1.1Dockerfile

Dockerfile用于描述镜像的生成规则。Dockerfile中的每一条命令,都在Docker镜像中以一个独立镜像层的形式存在。

1.2Image

Image由Dockerfile生成,呈现层级结构,每层镜像包含:镜像文件以及镜像json元数据信息。

1.3Container

Container是Image的动态运行结果,概括而言,就是在Docker镜像之上,运行进程。

1.4三者关系图:

docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图

二、Docker 镜像、容器的基石——联合文件系统(UnionFS)

2.1示例

FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]

2.2联合文件系统对应的层次结构如下图所示

docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图1
  • FROM ubuntu: 14.04 设置基础镜像,此时会使用基础镜像ubuntu:14.04的所* 有镜像层,为简单起见,图中将其作为一个整体展示。
  • ADD run.sh /: 将Dockerfile所在目录的文件run.sh加至镜像的根目录,此时新一层的镜像只有一项内容,即根目录下的run.sh.
  • VOLUME /data: 设定镜像的VOLUME,此VOLUME在容器内部的路径为/data。需要注意的是,此时并未在新一层的镜像中添加任何文件,但更新了镜像的json文件,以便通过此镜像启动容器时获取这方面的信息。
  • CMD [“./run.sh”]: 设置镜像的默认执行入口,此命令同样不会在新建镜像中添加任何文件,仅仅在上一层镜像json文件的基础上更新新建镜像的json文件。

图中的顶上两层,是Docker为Docker容器新建的内容,而这两层属于容器范畴。 这两层分别为Docker容器的初始层(Init Layer)与可读写层(Read-Write Layer)。

  • 初始层: 大多是初始化容器环境时,与容器相关的环境信息,如容器主机名,主机host信息以及域名服务文件等。
  • 读写层: Docker容器内的进程只对可读写层拥有写权限,其他层对进程而言都是只读的(Read-Only)。 另外,关于VOLUME以及容器的hosts、hostname、resolv.conf文件等都会挂载到这里

以上内容转载至:https://www.cnblogs.com/nyh-blog/articles/11988406.html

docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图2

2.2.1lowerdir:基础镜像层

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
08bf74648a4d   nginx     "/docker-entrypoint.…"   14 seconds ago   Up 12 seconds   80/tcp    web3
[root@docker ~]# 
[root@docker ~]# 
[root@docker ~]# docker inspect 08bf74648a4d
docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图3

基层镜像层里面/etc 保存了宿主机的hostname/host/resolv.conf文件

2.2.2MergedDir:统一视图层。即该目录与宿主机docker目录内容一致

docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图4

2.2.3UpperDir:容器层,例如在容器里创建的文件,会在该目录下

docker、技术与框架、新兴技术能力docker系列之(三)联合文件系统和写时复制插图5

同理:如果在宿主机目录touch一个文件,容器也会存在

结论:docker容器内增删改的顺序:先从容器层寻找文件,没有就从镜像层复制

下面我们讲解关于docker容器的常用命令

http://www.fcors.com/%e6%8a%80%e6%9c%af%e4%b8%8e%e6%a1%86%e6%9e%b6/docker%e7%b3%bb%e5%88%97%e4%b9%8b%ef%bc%88%e5%9b%9b%ef%bc%89%e5%ae%b9%e5%99%a8%e5%b8%b8%e7%94%a8%e9%80%89%e9%a1%b9/