使用docker数据卷持久化容器数据
时间:2022-07-22
本文章向大家介绍使用docker数据卷持久化容器数据,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。
默认容器的数据存储
在这里我们在容器中创建一些模拟的数据,然后模式容器停止或删除后数据是否丢失。
## 创建数据
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0316d74ef5d bulletinboard:1.0 "docker-entrypoint.s…" 55 minutes ago Up 16 minutes 0.0.0.0:8000->8080/tcp bb
[root@myserver ~]# docker exec -it bb bash
root@a0316d74ef5d:/usr/src/app# ls
Dockerfile app.js fonts node_modules package.json server.js
LICENSE backend index.html package-lock.json readme.md site.css
root@a0316d74ef5d:/usr/src/app# cd
root@a0316d74ef5d:~# ls
root@a0316d74ef5d:~# mkdir data
root@a0316d74ef5d:~# ls
data
root@a0316d74ef5d:~# cd data/
root@a0316d74ef5d:~/data# ls
root@a0316d74ef5d:~/data# echo 12323 > tst.txt
root@a0316d74ef5d:~/data# cat tst.txt
12323
root@a0316d74ef5d:~/data# pwd
/root/data
root@a0316d74ef5d:~/data#
## 停止并重新启动容器数据还是存在的
## 删除容器(加入对镜像做了修改)数据丢失
[root@myserver ~]# docker run -itd --name bb bulletinboard:1.0
98e14379e2109c9230d1d265ac586ce3bba433efb7d2ef544ef93cb58c859f0a
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98e14379e210 bulletinboard:1.0 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 8080/tcp bb
[root@myserver ~]# docker exec -it bb bash
root@98e14379e210:/usr/src/app# cd
root@98e14379e210:~# ls
root@98e14379e210:~#
Volume使用方法
我们来通过docker volume
命令管理volume。创建volume到将volume挂载到容器中。
## 创建一个volume
[root@myserver ~]# docker volume create --name myvolume
myvolume
[root@myserver ~]# docker volume ls
DRIVER VOLUME NAME
local myvolume
[root@myserver ~]# docker volume inspect myvolume
[
{
"CreatedAt": "2020-07-11T21:52:26-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
## 在挂载点创建数据
[root@myserver ~]# cd /var/lib/docker/volumes/myvolume/_data
[root@myserver _data]# ls
[root@myserver _data]# echo 11111 > a.txt
[root@myserver _data]# ls
a.txt
[root@myserver _data]# cd -
/root
## 将卷挂载给容器
[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.0
1ed40ff338280def96b4c395d33977219b3e3a47e10444cf23d16f4bb83e0e27
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ed40ff33828 bulletinboard:1.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 8080/tcp bb
[root@myserver ~]# docker exec -it bb bash
root@1ed40ff33828:/usr/src/app# cd
root@1ed40ff33828:~# ls
root@1ed40ff33828:~# cd /
root@1ed40ff33828:/# ls
bin data etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@1ed40ff33828:/# cd data/
root@1ed40ff33828:/data# ls
a.txt
root@1ed40ff33828:/data# cat a.txt
11111
root@1ed40ff33828:/data# echo 12323423 >> a.txt
root@1ed40ff33828:/data# cat a.txt
11111
12323423
root@1ed40ff33828:/data# cd
root@1ed40ff33828:~# mkdir /data/test
root@1ed40ff33828:~# echo 12312312 > /data/test/a.txt
root@1ed40ff33828:~# exit
exit
### 删除容器后重新启动容器发现数据还在。
[root@myserver ~]# docker rm --force bb
bb
[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.0
17f0178d062e8fe041aae55229e1f522237ca5753e01515a451c68d9c2aaf51b
[root@myserver ~]# docker exec -it bb bash
root@17f0178d062e:/usr/src/app# cd /data/
root@17f0178d062e:/data# ls
a.txt test
root@17f0178d062e:/data# ls test/
a.txt
容器挂载volume的另外一种方式
我们也可以在启动容器的时候通过-v参数指定volume,如果volume不存在则会自动创建。
[root@myserver ~]# docker run -itd --name cc -v /tmp/test:/data:rw bulletinboard:1.0
c0fd785c403040c0f3fa0840a738359da5f54aa28f4201cdada0e8de19f8f88a
[root@myserver ~]# docker volume ls
DRIVER VOLUME NAME
local myvolume
[root@myserver ~]# cd /tmp/test/
[root@myserver test]# ls
[root@myserver test]# echo 111 >a.txt
[root@myserver test]#
[root@myserver test]#
[root@myserver test]# ls
a.txt
[root@myserver test]#
[root@myserver test]#
[root@myserver test]# cd
[root@myserver ~]# docker exec -it cc bash
root@c0fd785c4030:/usr/src/app# cd /data/
root@c0fd785c4030:/data# ls
a.txt
root@c0fd785c4030:/data#
Docker 存储卷
volume 创建后默认挂载数据目录:/var/lib/docker/volumes/volumeID/_data
[root@myserver ~]# docker volume inspect myvolume
[
{
"CreatedAt": "2020-07-11T21:59:36-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
共享volume
--volumes-from 容器名称,共享容器的volume
方式一:挂载相同的volume
[root@myserver volumes]# docker run -itd --name server01 -v vtest:/data webserver:v1
007d2a504410e435c260d6271d970056fc629880a6654b6777bec206008c4006
docker run -itd --name server02 -v vtest:/data webserver:v1
##创建数据
[root@myserver volumes]# docker volume inspect vtest
[
{
"CreatedAt": "2020-07-13T07:59:36-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/vtest/_data",
"Name": "vtest",
"Options": null,
"Scope": "local"
}
]
[root@myserver volumes]# echo 123>/var/lib/docker/volumes/vtest/_data/a.txt
方式二:使用--volumes-from
docker run -itd --name server02 --volumes-from server01 webserver:v1
# 将server01容器所挂载的卷同步给server02
- 在ASP.NET MVC 中获取当前URL、controller、action
- [转自Scott]ASP.NET MVC框架(第四部分): 处理表单编辑和提交场景
- MVC前台Post/Get异步获得数据时参数的取值问题
- IQueryable与foreach的困惑?
- ModalPopupExtender用法示例
- MVC中局部视图的使用
- MVC发布后项目存在于根目录中的子目录中时的css与js、图片路径问题
- ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射
- View与Control间的数据交互
- C#中Dispose和Close的区别!
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
- 你真的会玩SQL吗?查询指定节点及其所有父节点的方法
- ASP.Net MVC框架配置与分析
- MVC利用MvcHtmlString在后台生成HTML
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 1.2 ribbon-客户端负载均衡
- 1. feign的使用及原理
- hadoop案例实现之WordCount (计算单词出现的频数)
- ribbon源码
- feign源码
- DAO层配置绑定weblogic应用服务器的JNDI导致单元测试失败
- 1.操作系统底层工作的基本原理
- ibatis 日常问题总结
- 2.1 并发编程之java内存模型JMM & synchronize & volatile详解
- 使用intellij idea 查看Java字节码
- 2.2 指令重排&happens-before 原则 & 内存屏障
- 设计模式之代理模式(由浅入深)
- jquery param 数据 数组参数序列化
- 3 CPU缓存一致性协议MESi
- 4. synchronized详解