Docker (八)容器数据卷使用
程序员文章站
2022-04-18 16:46:35
...
什么是容器数据卷!
docker的理念回顾
将应用和环境打包成一个镜像
如果数据都在容器中,那么我们容器删除,数据就会丢失!
容器删了,等同于MySQL删库跑路!
需求:数据可以持久
MySQL数据可以存储再本地
容器之间可以有一个数据共享的技术! Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录,挂载在Linux上!
总结:为什么要用卷? 容器的持久化和同步操作! 容器间可是可以数据共享的 !
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
测试:
[aaa@qq.com home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来之后可以通过 docker inspect 容器id 查看挂载情况
测试文件同步
再测试
1.停止容器
2.宿主机上修改文件
3.启动容器
4.宿主机上修改的文件会同步到容器上
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
**
实战:安装MySQL
思考,MySQL的数据持久化的问题
#获取镜像
[aaa@qq.com home]# docker pull mysql:5.7
#运行容器,需要做数据挂载 安装mysql ,需要配置密码,这是要注意的!
#启动MySQL
[aaa@qq.com home]# 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
-d后台运行
-p端口映射
-v卷挂载
-e环境配置
--name 容器名字
#启动成功之后,使用我们本地sqlyog 来连接测试一下
#sqlyog 连接到服务器的3310 , 3310端口和容器内的3306端口映射,这个时候我们是可以连接上的!
#在本地测试创建一个数据库,查看一下我们映射的路径是否OK.
假设我们将容器删除
发现, 我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名和匿名挂载
> #匿名挂载:
> -v 容器内路径!
> docker run -d -P --name nginx01 -v /etc/nginx nginx
>
> #查看所有卷的名字
> [aaa@qq.com data]# docker volume list
> DRIVER VOLUME NAME
local 2ffcf5982416180d2004004a326d149fcfbbb07e5e271e6148a65f8ff0576c82
local 70071cdbb61b5c9b60b536f68d65c6b6379036ecad18f7ffa0b622e4be3c1f4d
#这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!
#具名挂载
[aaa@qq.com data]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx nginx
2c931432ece0880db81d3489aeaf7c68896b6f19edb1a63f0889cb4349d54f31
[aaa@qq.com data]# docker volume list
DRIVER VOLUME NAME
local 2ffcf5982416180d2004004a326d149fcfbbb07e5e271e6148a65f8ff0576c82
local 70071cdbb61b5c9b60b536f68d65c6b6379036ecad18f7ffa0b622e4be3c1f4d
local juming-nginx
#通过 -v 卷名:容器内路径 指定挂载目录
#查看一下具名挂载的卷
[aaa@qq.com data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-12-02T14:38:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker 容器内的卷, 没有指定目录的情况下,都是在 ‘/var/lib/docker/volumes/****/_data’
我们通过具名挂载可以方便的找到我们一个卷,大多数情况都是在使用 **具名挂载的**
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readwrite #客户可写
#一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
#ro 只能通过宿主机来操作,容器内部是无法操作的
[aaa@qq.com _data]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx:ro nginx
[aaa@qq.com _data]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx:rw nginx