第四篇:Docker 数据持久化——Volume 和 Bind Mount
【摘要】 如果你把数据库放进 Docker,可能马上会遇到一个问题:容器删掉以后,数据库怎么办?这就涉及 Docker 的数据持久化。容器不是用来保存重要数据的假设:MySQL↓Container↓数据库文件如果数据库文件全部存在容器自己的可写层里,那么删除容器之后,数据也可能跟着消失。因此,我们需要把数据放到容器之外。Bind Mount最直观的方法就是把宿主机目录挂进去。例如:docker run...
如果你把数据库放进 Docker,可能马上会遇到一个问题:
容器删掉以后,数据库怎么办?
这就涉及 Docker 的数据持久化。
容器不是用来保存重要数据的
假设:
MySQL
↓
Container
↓
数据库文件
如果数据库文件全部存在容器自己的可写层里,那么删除容器之后,数据也可能跟着消失。
因此,我们需要把数据放到容器之外。
Bind Mount
最直观的方法就是把宿主机目录挂进去。
例如:
docker run -d \
--name nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
nginx
意思就是:
宿主机:
/opt/nginx/html
↓
容器:
/usr/share/nginx/html
两边实际上使用的是同一份数据。
宿主机修改文件:
宿主机
↓
容器立即看到
容器修改文件:
容器
↓
宿主机也能看到
Bind Mount 适合什么?
例如:
- 开发环境
- 网站静态文件
- 配置文件
- 需要直接编辑的数据
Volume
Docker 还有一种更推荐用于持久化数据的方式:
Volume。
创建:
docker volume create app-data
查看:
docker volume ls
使用:
docker run -d \
--name app \
-v app-data:/data \
alpine
这里的 app-data 是 Docker 管理的 Volume。
两者区别
简单理解:
Bind Mount
宿主机指定路径
↓
容器
而:
Volume
Docker 管理的数据
↓
容器
开发环境经常使用 Bind Mount。
数据库等服务则经常使用 Volume。
Volume 是不是备份?
不是。
这是一个很容易产生误解的地方。
Volume 只是:
让数据不跟着容器生命周期一起消失。
如果服务器硬盘坏了,Volume 当然也可能没了。
真正的生产环境还需要:
Volume
+
数据库备份
+
远程备份
一个好的 Docker 思路
把应用设计成:
容器:
负责运行
Volume:
负责保存数据
镜像:
负责提供运行环境
这样更新应用时,就可以放心地替换容器。
下一篇,我们看看多个容器之间到底是怎么通信的。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)