欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker (八)容器数据卷使用

程序员文章站 2022-04-18 16:46:35
...

什么是容器数据卷!

docker的理念回顾
将应用和环境打包成一个镜像
如果数据都在容器中,那么我们容器删除,数据就会丢失!
容器删了,等同于MySQL删库跑路!

需求:数据可以持久
MySQL数据可以存储再本地

容器之间可以有一个数据共享的技术! Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录,挂载在Linux上!
Docker (八)容器数据卷使用
总结:为什么要用卷? 容器的持久化和同步操作! 容器间可是可以数据共享的 !

使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录
测试:
[aaa@qq.com home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来之后可以通过 docker inspect 容器id 查看挂载情况

Docker (八)容器数据卷使用

测试文件同步

Docker (八)容器数据卷使用

再测试
1.停止容器
2.宿主机上修改文件
3.启动容器
4.宿主机上修改的文件会同步到容器上
Docker (八)容器数据卷使用
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

**

实战:安装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.

假设我们将容器删除
Docker (八)容器数据卷使用发现, 我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名和匿名挂载

> #匿名挂载:
> 	-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