Docker 12 数据卷
参考源
https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0
https://www.bilibili.com/video/BV1kv411q7Qc?spm_id_from=333.999.0.0
版本
本文章基于 Docker 20.10.11
由来
Docker 是将应用和环境打包成一个镜像。
这样,数据就不应该保存在容器中,否则容器删除,数据就会丢失,有着非常大的风险。
为此,容器和主机之间需要有一个数据共享技术,使得在 Docker 容器中产生的数据能够同步到本地。
这就是数据卷技术。其本质上是一个目录挂载,将容器内的目录挂载到主机上。
使用
命令方式
语法
docker run -v 主机目录:容器目录
查看主机
/home
目录。
[root@sail ~]# ls /home
admin f2 f3 sail test.java
以交互模式启动 centos 镜像。
[root@sail ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@ec95646b1a4c /]#
新开一个窗口查看容器详情。
Mounts 下的 Source 即为设置的主机目录、Destination 即为设置的容器目录,他们已经绑定在了一起。
在主机中查看
/home
。
[root@sail /]# cd /home
[root@sail home]# ls
admin ceshi f2 f3 sail test.java
主机上的 /home
下已经有了 ceshi
目录。说明容器一经启动,就会在主机生成对应的挂载目录。
在容器中的
/home
下新建一个文件。
[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
[root@ec95646b1a4c home]# touch test.java
[root@ec95646b1a4c home]# ls
test.java
查看主机的
ceshi
目录。
[root@sail home]# cd ceshi
[root@sail ceshi]# ls
test.java
此时主机中的 ceshi
目录下也有了这个文件。
关闭容器。
[root@ec95646b1a4c home]# exit
exit
修改主机中
/home/ceshi/test.java
文件的内容。
[root@sail ceshi]# vim test.java
# 此处编辑文件过程省略
[root@sail ceshi]# cat test.java
hello sail
重启容器。
[root@sail ~]# docker start ec95646b1a4c
ec95646b1a4c
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec95646b1a4c centos "/bin/bash" 19 minutes ago Up 5 seconds charming_cartwright
查看
/home
下的文件。
[root@sail ~]# docker exec -it ec95646b1a4c /bin/bash
[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
test.java
[root@ec95646b1a4c home]# cat test.java
hello sail
此时容器中的文件也更改了。
由此可见,数据卷技术实现的是双向同步。
权限设置
在使用命令方式设置卷时,还可以指定权限,以此保证数据安全。
参数
ro
(readonly):只读。rw
(readwrite):可读可写。
以数据卷只读权限启动镜像。
[root@sail mysql]# docker run -it -v /home/sail:/home:ro centos /bin/bash
新建文件测试。
[root@02ef70c94920 home]# touch test.java
touch: cannot touch 'test.java': Read-only file system
容器内部该目录是没有写入权限的。
以数据卷可读可写的权限启动镜像。
[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz jdk-8u301-linux-x64.rpm test.java
新建文件测试。
[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz jdk-8u301-linux-x64.rpm test.java
容器内部该目录写入是没有问题的。
前面我们没有指定权限也可以写入,由此可见,数据卷默认是具有读写权限的。
具名挂载
启动镜像时只定义主机卷名称,不指定挂载目录。
[root@sail mysql]# docker run -it -v my-centos:/home centos /bin/bash
[root@3cf74e9e6973 /]#
查看目前挂载的卷。
# 使用 Ctrl + P + Q 不退出容器的情况下回到主机目录。
[root@sail mysql]# docker volume ls
DRIVER VOLUME NAME
local my-centos
查看卷的详情。
[root@sail mysql]# docker volume inspect my-centos
[
{
"CreatedAt": "2021-12-20T16:55:35+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-centos/_data",
"Name": "my-centos",
"Options": null,
"Scope": "local"
}
]
卷挂载在 /var/lib/docker/volumes/卷名/_data
目录下。
在没有指定主机挂载目录的情况下,会默认挂载到该目录。
由于指定了卷名,所以这种方式称为具名挂载。
匿名挂载
启动镜像时只指定容器目录。
[root@sail mysql]# docker run -it -v /home centos /bin/bash
查看目前挂载的卷。
[root@sail mysql]# docker volume ls
DRIVER VOLUME NAME
local 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940
查看卷的详情。
[root@sail mysql]# docker volume inspect 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940
[
{
"CreatedAt": "2021-12-20T17:05:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940/_data",
"Name": "159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940",
"Options": null,
"Scope": "local"
}
]
卷也是挂载在 /var/lib/docker/volumes/xxx/_data
目录下。
在没有指定主机挂载目录的情况下,会默认挂载到该目录。
由于没有指定卷名,所以这种方式称为匿名挂载。
只有指定主机目录的情况下会挂载到指定目录,否则都会挂载到默认目录。
实战
mysql数据同步
数据库中的数据极为重要,必须同步到主机,否则将会有非常大的数据丢失风险。
这里以 mysql 镜像为例演示数据同步的过程。
启动 mysql 镜像。
[root@sail ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
ffbb094f4f9e: Pull complete
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
c7b24c3f27af: Pull complete
6fc26ff6705a: Pull complete
bec5cdb5e7f7: Pull complete
6c1cb25f7525: Pull complete
Digest: sha256:d1cc87a3bd5dc07defc837bc9084f748a130606ff41923f46dec1986e0dc828d
Status: Downloaded newer image for mysql:5.7
a016e564d977550e475474556cfd033fb1c731002381bc9f9544c63fccb7f60c
其中 -e
为环境配置。安装启动 mysql 需要配置密码。
使用
docker inspect
查看挂载情况。
已经生成了两个目录的挂载。
查看主机同步的目录。
[root@sail ~]# cd /home
[root@sail home]# ls
admin ceshi f2 f3 mysql sail test.java
[root@sail home]# cd mysql
[root@sail mysql]# ls
conf data
主机已经同步了容器挂载的目录。
使用数据库管理工具连接测试(这里使用 IDEA 自带的数据库工具)。
Docker 12 数据卷的更多相关文章
- docker之数据卷管理
转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...
- Docker容器数据卷-Volume详解
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...
- 『现学现忘』Docker基础 — 29、Docker容器数据卷的应用
目录 1.验证容器和宿主机之间数据共享 2.容器停止退出后,主机修改后数据是否同步 3.带只读权限的挂载数据卷 1.验证容器和宿主机之间数据共享 通过上面的操作,接下来我们演示一下通过数据卷的挂载,实 ...
- 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...
- Docker学习笔记 - Docker的数据卷
一.什么是数据卷? 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数据 ...
- docker基础---数据卷volumes
1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...
- Docker数据管理(数据卷&数据卷容器)
生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷(Data Volumes):容 ...
- docker定义数据卷及数据卷的备份恢复
前言:生产环境中使用docker时,往往需要对数据进行持久化(只有把容器导出为镜像,才能够保存写的数据,否则容器删除或者停止,所有数据都会没有),或者需要在多个容器之间进行数据共享,这必然涉及容器的数 ...
- docker.[7] 数据卷容器
docker.[7] 数据卷容器 挂在数据卷容器的方法: # docker run --volumes-from [Container Name]
随机推荐
- 前端向后端传递formData类型的二进制文件
// 获取到的文件file类型转换为formData类型 let formData = new FormData(); formData.append("file", file文件 ...
- 测试平台系列(95) 前置条件支持简单的python脚本
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们构思了一下怎么去支 ...
- mybatis if判断等于某个字符串
这种写法是错误的:在OGNL的表达式中,'true'会被解析成字符,因为java是强类型的 <if test="flag=='true' "> AND ho.id = ...
- 前端1HTML
内容概要 前端简介 HTTP简介 HTTP协议 HTML简介 head内常见标签 body内基本标签 body内特殊符号 body内常见标签 列表标签 表格标签 内容详情 前端简介 # 1.什么是前端 ...
- 开发工具-MySQL下载地址
更新记录 2022年6月10日 完善标题. 商业版下载 商业版下载地址 https://edelivery.oracle.com/ 使用Oracle账号登录即可下载. 官方下载 https://dev ...
- Python基础学习_03
程序的流程控制 1.程序的组织结构 (1)顺序结构 (2)选择结构 (3)循环结构 2.对象的布尔值 以下对象的布尔值为False False,数值0,None,空字符串,空列表,空元组,空字典,空集 ...
- 隐私计算FATE-离线预测
一.说明 Fate 的模型预测有 离线预测 和 在线预测 两种方式,两者的效果是一样的,主要是使用方式.适用场景.高可用.性能等方面有很大差别:本文分享使用 Fate 基于 纵向逻辑回归 算法训练出来 ...
- 面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读
SIGMOD 数据管理国际会议是数据库领域具有最高学术地位的国际性会议,位列数据库方向顶级会议之首.近日,腾讯云数据库团队的最新研究成果入选 SIGMOD 2022 Research Full Pap ...
- 现代化CSS
Less Sass less Sass 与Less相比SASS更适合大型,底层的开发 Compass CSS核心技巧 CSS应用 现代化CSS方法论 CSS分层与面向对象 为什么要对CSS分层 CSS ...
- 综合案例_文件搜索和FileFilter过滤器的原理和使用
文件搜索 需求 : 遍历D:\aaa文件夹,及 aaa 文件夹的子文件夹并且只要.java结尾的文件 分析: 1.目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录 2.遍历目录时,获取的子文件 ...