Docker 为容器提供了两种存放数据的资源:
docker的镜像分层结构,如下所示:
Docker镜像中引入层layer的概念,镜像的制作过程中的每一步擦欧总,都会生成一个新的镜像层
容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。这样的分层结构最大的特性是 Copy-on-Write:
Docker info
可查看当前系统使用的Storage driver
centos默认的driver用的是overlay2,底层的文件系统是xfs,各层数据存放在/var/lib/docker
对于某些容器如busybox只是个工具箱,不需要保存数据以后使用,使用完成后直接退出,容器删除时存放在容器层中的工作数据也一起被删除。
docker容器中持久化数据一般采用两种存储方式:
volume
bind mount
无论是volume还是bind mount,其本质上是宿主机文件系统中的目录或者文件
无论是volume还是bind mount,其上存放的数据生命周期对立于容器,即容器删除之后,volume或者bind mount上的数据,依旧存在
Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Volume 有以下特点:
因为 volume 实际上是 docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间。
volume使用注意事项:
bind mount 是将 host 上已存在的目录或文件 mount 到容器。
bind mount实际上是一个inode替换的过程。
bind mount机制主要作用,允许一个目录或者文件(不是整个设备)挂载到一个指定的目录上,而且在该挂载点上进行任何的操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来不受影响。
bind mount使用注意事项:
bind mount的用法是使用-v选项将host已经存在的目录或者文件mount到容器
如下所示:
-v 的格式为 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放静态文件的地方。由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据,这与 linux mount 命令的行为是一致的。
数据共享是volume的关键特性,主机与容器数据共享:
volume container是专门为其他容器提供volume的容器。
因为 volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份
volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝
如果使用更新版本的 Registry,这就涉及到数据迁移,方法是:
volume删除后数据是找不回来的,注意
docker 不会销毁 bind mount,删除数据的工作只能由 host 负责,再在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume。
创建一个卷,并挂载一个httpd容器docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd
-v 将其mount到httpd容器
-v格式为<host path>:<container path>。/usr/local/apache2/htdocs就是Apache Server存放静态文件的地方,
由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据。
检查volume信息
docker volume ls
查看容器的volume挂载信息,同时得到volume路径,Type=volume
docker inspect d5db6a048612
查看volume中的数据
cd /var/lib/docker/volumes/6189c90831d019229a2e8593453fe1c334faec1fcc56db80b9f99773d21c9c55/_data
查看容器中相应的数据,结果:容器中的数据=volume中数据
进入容器更新index.html文件内容
docker exec -it d5db6a048612 bash
cd htdocs && echo "update the index" > index.html
再次查看volume中的内容,已经同步跟新
由此实现容器和Host的数据共享。
强制删除容器,然后查看volume中的数据,可以看到依旧存在
docker rm -f d5db6a048612
将宿主机的/root/htdocs目录以只读的方式挂载给一个名为httpd1的httpd容器,映射端口8081
docker run --name httpd1 -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd
查看容器挂载信息。Type=bind
docker inspect httpd1
在宿主机host上跟新index.html文件数据,印证httpd1容器中的数据也一起跟新
由此 ,容器和Host的实现了数据共享
进入httpd1容器中更新index.html文件数据,提示Read-only
将宿主机/root/htdocs挂载给名为httpd2的http容器,映射端口8082,不设置ro
docker run --name httpd2 -d -p 8082:80 -v /root/htdocs/:/usr/local/apache2/htdocs httpd
进入httpd2容器中更新index.html
docker exec -it httpd2 bash
分别查看宿主机、http1,http2中的数据,三者数据一致
此时印证容器间的数据实现共享
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。