您现在的位置是:首页 >技术杂谈 >docker系列-四-————容器数据卷网站首页技术杂谈
docker系列-四-————容器数据卷
docker系列(四)————容器数据卷
1、容器数据卷介绍。
docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。
2、作用以及特点。
卷就是目录或者文件,存在一个或者多个容器之中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或者共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会再容器删除时删除其挂载的数据卷。
它还存在以下几种特点:
1、数据卷可在容器之间共享或者重用数据。
2、卷中的更改可以直接生效。
3、数据卷中的更改不会包含在镜像的更新中。
4、数据卷的生命周期一直持续到没有容器使用它为止。
再说简单点:方便我们将数据导出来,在删除原本的容器后将其中可用的数据与新的容器对接。
比如 容器a的数据目录挂载在宿主机home下,两处数据同步,a删除后,直接将b新建容器的数据目录再挂载在宿主机home下,同步数据,便能少去数据复刻步骤
3、使用数据卷。
(1):直接使用 -v 命令挂载
docker run -it -v 主机目录:容器目录 /bin/bash
创建一个centos容器,并且打开其终端界面,然后将容器centos系统的/home目录挂载到宿主机的/home/test01上
docker run -it -v /home/test01:/home centos /bin/bash
另外打开一个终端查看宿主机home路径下是否出现test01目录,这个test01目录,就是我们刚启动容器centos的home目录,并且,此时这两个目录是同步的状态,我们在home目录中写入任何新的文件,都会同步到宿主机/home/test01下,注意是双向同步的。
(2):测试同步
# 在宿主机或容器的终端创建一个测试文本
echo "tong bu" > home/test.txt
# 查看一下另一端的目录下是否有文本文件
当然,我们可以使用更简单的方法查看是否挂载成功
首先记住这个命令
docker inspect 容器ID
# 该命令会返回一个包含所选容器的所有相关数据的 JSON 对象,包括配置、网络设置、挂载点等。
我们找到Mounts,它代表着挂载,type是类型(绑定),source是源(/home/test01),也就是把什么挂载到哪里。destination(home)就是挂载的目标路径了。
这里bote只演示修改容器内文件同步到宿主机挂载文件。反过来也是一样的,这里就不再赘述了。之后如果要修改容器内挂载文件,只需在我们本地挂载点修改就好了,它会自动同步到docker。
##### 更改方法将在下一篇文章补充给大家。
4、具名挂载与匿名挂载。
首先记住这个
docker volume ls #查看所有卷的情况。
(1)匿名挂载
我们首先使用匿名挂载的命令启动一个容器。
docker run -d -P --name=nginx02 -v /etc/nginx nginx
然后使用docker volume ls 查看,那一长串就是挂载到宿主机的名字。
# less 在信息输出过多的时候使用
docker inspect (容器ID) | less
然后输入/Mounts, “ / ”后是你想查到的内容
大家仔细看一下,是不是/etc/nginx就是那一长串,挂载到了我/var/lib…路径下,复制一下路径去看一下即可。
(2)具名挂载
具名挂载就很简单了,与匿名挂载类似
同样,我们使用具名挂载的方式启动一个容器。
docker run -d -P --name=nginxt04 -v jumingguazai:/etc/nginx nginx
docker volume ls 查看卷
docker inspect ID | less 找到挂载点。
这时我们发现它的Name:jumingguazai,这个也就是我们设置的挂载名
这就是具名挂载。
(3)如何确定是具名挂载还是匿名挂载
-v 容器内路径 # 匿名挂在
-v 卷名:容器内路径 # 具名挂在
-v /宿主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内路径 :ro rw 可以改变读写权限
# 注意修改需要移除 docker rm 容器名
ro readonly #只读
rw readwrite #可写可读
例: docker run -d --name=nginx01 -v test01:/etc/nginx:ro nginx
docker run -d --name=nginx01 -v test01:/etc/nginx:rw nginx
最后
好的,大家下期 Dockerfile 再见。