写时复制

上图D表示删除;C表示修改添加;A表示文件;layer2表示读写层;layer0-1表示只读层
缺点:效率低
存储卷的方式提高效率
在特权级的名称空间中在宿主机中找一个本地的文件系统中的一个目录,将这个目录直接与容器中文件系统上的某一目录或者某一访问路径建立绑定关系。
例如讲 容器内/data/web目录与宿主机上的/containers/data/web目录建立绑定关系、当容器内进程向/data/web目录写数据时是直接写到宿主机上的/containers/data/web下的,这样一来,宿主机可以给容器供给内容,容器可以使用宿主机的数据内容,跨文件系统实现数据共享,当容器被删除时数据也不至于被一并删掉,这样对于容器迁移来说是非常方便的
容器与宿主机建立绑定关系的目录相对于容器来讲就被称作volume
docker默认存储卷就是docker主机本地的
一个目录一个卷
解决方案
卷
如果容器中的文件要存储数据到根目录则被存储到了(联合文件挂载系统)layer之中,而一些容器运行的一些临时文件也会被存储到联合文件挂载系统的可写层之中,但是如果需要长期留存的数据则需保存在/data目录因为/data于宿主机的对应目录进行了绑定
Bind mount volume:绑定挂载卷
含义:宿主机上的绑定路径需要人工指定一个路径来进行绑定,在容器中也需要人工指定一个路径来进行绑定
Docker-managed volume:Docker管理挂载卷
含义:只需要在容器内指定容器内的挂载点是什么,而被绑定的宿主机上的哪个路径下的空目录无需人工干预,而由daemon自行创建或者使用一个已存在的目录于你得容器上的卷建立绑定关系,通常卷名称或者目录名称是ID号;
命令
为Docker run 命令使用 -v 选项即可使用Volume
Bind-mount Volume
# docker run -it -v HOST:VOLUMEDIY --name bbox2 busybox-v HOST:VOLUMEDIY 表示-v 宿主机上的路径:容器内的目录# docker inspect -f {{.Mounts}}bbox2表示查看bbox2容器的卷、卷标识符及挂载的主机目录 -f :指定返回值的模板文件
Docker-managed volume
# dcoker run -it -name bbox1 -v /data busybox
-v /data 表示指定容器内的路劲为/data
# docker inspect -f {{.Mounts}} bbox1
-f :指定返回值的模板文件
实验一 Docker-managed volume

[root@autotest ~]# docker inspect b2


小试牛刀:在宿主机上创建文件,看容器中/data路径下能看到吗?

小试牛刀:在容器内创建创建文件看宿主机上是否可以看见

实验二 Bind-mount Volume
注意:此处宿主机上的/data/volumes/b2文件并存在,但是只要命令指明路径容器启动时也会创建。

小试牛刀:在宿主机上创建文件,看容器中/data路径下能看到吗?

小试牛刀:在容器内创建创建文件看宿主机上是否可以看见

实验三 将两个容器绑定同一个目录

创建容器b3可以看到宿主机/data/volumes/b2下的文件
b2上
实验四 写启动容器命令时,不去写和宿主机绑定路径而是复制其他容器的绑定路径与其绑定同一个宿主机文件

# docker run --name nginx --network container:infracon --volumes-from b2 --it busybox
注释: --network container:infracon 表示将此容器网络加入到infracon网络名称容器中

