docker始终是作为应用&环境的打包体去看待,那么需要的数据如何优雅的取处理?(毕竟生命周期不同)
本文默认需要 docker 的 volumes 相关基础。(dockerfile, docker run -v)
数据卷
目录,文件可以绕过 AUFS 挂在到容器这不奇怪,但是容器也能被挂载到容器(传递挂在目录),这就有点儿厉害了。
只有你想不到,没有 docker 做不到。
命名的数据卷,匿名的数据卷,不管哪种方式,都提供了完整的解决方案。
- docker run 时显示通过 -v 映射目录的是显示挂载;
- 运行容器不指定,而依赖 dockerfile 中 VOLUME 指令指定的目录是匿名–不关心宿主机的目录信息或者为了隐藏本机信息而采用了数据卷容器共享挂载内容)
并且容器可以共享这些挂在目录(数据卷);对 数据卷 的更新,不会影响镜像。
同时挂载时也可以指定访问权限 :ro
或者 :rw
。(docker run -v时可以指定;而匿名的数据卷不可以)
数据卷容器
,其实只是传递参数配置;即使你后来把数据卷容器删除了,只要还有容器在使用挂载的目录,那么就仍然可以访问。
Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。(同样的,只要还在用数据卷,那么这个命令也不能删除数据卷)
也可以挂载单个数据文件。
补充: -v
和 --mount
作用是一样的,只不过现在更加建议使用 --mount
,更加清晰,例子如下:
1 | $ docker run -d --name web \ |
查看具体的数据卷:
1 | $ docker inspect container_name |
显示信息会有所不同,可能是 “VOLUME” 或者 “Mounts”:
1 | "Mounts": [ |
单独查看 voluem 也可以:
1 | ## 创建 volume |
并且单独创建的 volume 可以直接当做本机目录使用:
1 | $ docker run -d -P \ |
备份
容器数据卷的备份可以借助 -v 选项,而真正的数据卷可以依赖数据卷容器,大致命令如下:
1 | $ docker run --volumes-from [container name] -v $(pwd)/backup:/backup ubuntu \ |
这样容器内部所享有的数据卷容器的内容会自动保存到本机当前目录下,可以直接在本机上查看到。
大致流程如下如下:
简单说就是,你要备份哪个容器的数据,那就再开一个容器挂载它,同时挂载备份目录(本机目录),进入容器后进行备份工作。
注意: 有些系统&宿主机的某些目录是不准映射的(不能被容器挂载为数据卷),例如 mac 下:
还原
还原是类似的,同样这样花在,但是同时解压缩而已,参考命令:
1 | $ docker run --volumes-from [container name] -v $(pwd)/backup:/bakcup ubuntu \ |
这样在存储数据的数据卷目录就能拿到 tar 包里面的数据了。