【docker 数据持久化】容器中的 file-system 目录挂载 bind-mounts 使用方法+代码示例
我们知道 docker 的 filesystem 非常有特色。它就像洋葱皮一样,一层裹着一层。
而且更重要的是,当你的 Image 通过 docker run 命令实例化出一个 Container 之后,你在此 Container 中做出的任何修改是不会被储存的,即 Container 被删除,你的数据就全都一起被删除了。
因此,docker 针对这种情况特地推出了几种数据持久化方法(见 https://docs.docker.com/storage/)。包括 Volume, Bind-mounts 等等。这里我们就借助 jupyter 的镜像来说说 Bind-mounts 。
Step1 在Host操作系统创建一个权限为777的目录
由于 docker 的分权还不够成熟,因此只能挂载完全放开权限的目录,否则会报Permission Denied 的错误:
# 根目录下创建一个专门用于docker挂载的目录
$ mkdir /docker-sources
# 这个是jupyter中常用的目录名
$ mkdir /docker-sources/jovyan
# 更改权限
$ chmod 777 /docker-sources
$ chmod 777 /docker-sources/jovyan
Step2 从dockerhub上拉镜像
通过 dockerhub 将镜像下载至本地。
$ docker pull jupyter/datascience-notebook:latest
Step3 将镜像中欲挂载的目录先cp到主机目录上
由于镜像中的相应目录底下可能有一些重要的文件,而将主机上的目录挂载到容器内,容器目录中的文件就会被全部覆盖掉。比较类似于你将u盘挂载到操作系统的一个非空目录上,则这个目录下的所有文件都会被暂时覆盖掉。
$ docker run -d -it --name jupyter jupyter/datascience-notebook:latest
<your-container-hash-id>
$ docker cp <your-container-hash-id>:/home/jovyan /docker-sources/jovyan
$ docker stop <your-container-hash-id> && docker rm <your-container-hash-id>
Step4 万事俱备!开始使用挂载命令进行挂载
使用官方文档中的 --mount 命令进行挂载,就可以在容器中实现数据的持久化了!
在这里需要注意的是,
$ docker run -d -it -p 10800:8888 --name jupyter \
--mount type=bind,source=/docker-sources/jovyan/,target=/home/jovyan/ \
<your-image-hash-id>:<tag>
Fin 结尾再提几句…
通过如下命令,你可以获得从浏览器端进入 jupyter 的 hash-code
$ docker logs <your-container-hash-id>
至此,你就可以使用你的浏览器去访问主机IP:10800端口,输入hash-code并进入jupyter中作业了。而且你写的所有文件都会被保存在你主机的 /docker-sources/jovyan 下,不会随着容器的覆灭而全部消失了。
你也可以使用这种方法来持久化各种基于容器的web服务、数据库服务等等。也是非常的方便;此外还有其他的挂载方式,都可以去阅读 docker 的官方文档来掌握。
关于存储部分的docker文档: https://docs.docker.com/storage/