【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/

感谢大家的阅读,祝您今天心情愉快!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值