容器数据卷是什么?
类似于Redis里面的rdb和aof文件
容器数据卷有啥用?
容器数据持久化、宿主机和容器的数据共享
容器数据卷怎么用?
在命令行:docker run -it -v 宿主机文件路径:容器内路径 ImageId
在Dockerfile中:VOLUME ["容器数据卷路径"]
假如有这么个需求:希望在宿主机的/Users/zhaochengcai/Documents/demo/dockerdemo/sharedir目录和容器的/sharedir目录之间建立相互绑定的关系,目的是希望在宿主机的该目录下创建文件或者对文件的修改操作能直接影响到容器内的/sharedir目录中的文件;其实就是在宿主机和容器之间建立这么一种同步功能。该需求的应用点在于:比如我想更改已经在运行的容器的配置文件,我可以通过更改宿主机与之对应的目录中的配置文件即可。
操作步骤如下:
查看宿主机中有的镜像,
docker images
image.png
查看在运行的容器,
docker ps
image.png
发现,暂时没有容器在运行;ok,我们启动mycentos7:v4这个镜像,并将宿主机的/Users/zhaochengcai/Documents/demo/dockerdemo/sharedir这个目录 映射到容器根目录的/sharedir中,如果容器根目录不存在/sharedir这个目录程序会主动创建它,
docker run -it -v /Users/zhaochengcai/Documents/demo/dockerdemo/sharedir:/sharedir c587732d16df
image.png
我们发现进入容器后,默认定位到了/home目录下,这是因为我在之前构建image的时候通过WORKDIR指令设置进入容器的落脚点就在/home路径下;然后我们切换到容器根目录,并查看有哪些文件夹,
image.png
进入到容器的/sharedir目录,创建beauty.txt,并编辑其内容,
image.png
image.png
再打开一个terminal,到/Users/zhaochengcai/Documents/demo/dockerdemo/sharedir这个目录去查看并编辑beauty.txt文件,
image.png
image.png
然后,我们再在容器中去验证,beauty.txt文件是否被修改,
image.png
上面这种在宿主机和容器之间建立共享目录的方式是通过terminal的方式,也就是说在容器启动之后,通过 -v命令来实现。据说还有另外一种方式,在编写Dockerfile的时候,通过VOLUME方式,虽然这种方式不能直接指定宿主机目录和容器目录之间的这种映射关系,但docker给了我们一个默认bind目录,可以通过docker inspect containerId来查看;但我在实际操作过程中发现,docker给我们bind的默认目录是找不到的,
image.png
image.png
因此,这里我觉得,在Dockerfile中通过VOLUME ["data1","data2"]参数只是指定数据卷的挂载点;或许当前docker版本只允许-v的方式来实现宿主机和容器之间的数据共享吧。
网友评论