docker容器卷

# 容器数据卷
## 什么是容器数据卷
**docker的理念回顾**
将应用和环境打包成一个镜像!        需求:数据可以持久化
MySQL,容器删了,删库跑路!-       需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术。Docker容器中产生的数据,同步到本地。
这就是卷技术。目录的挂载,将我们容器内的目录,挂载到Linux上面

![image.png](https://cdn.nlark.com/yuque/0/2022/png/29649025/1658500636965-8ea12c3c-1ef1-4184-9e43-2fbadd2aa27c.png#clientId=u1053b6c5-9a41-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=333&id=ucfb5710b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=416&originWidth=905&originalType=binary&ratio=1&rotation=0&showTitle=false&size=65066&status=done&style=none&taskId=ued9033f8-3fcd-4ba2-90ce-c78007600a5&title=&width=724)
**总结:容器的持久化和同步操作。容器间也是可以数据共享的**
## 使用数据卷
:::tips
方式一:直接使用命令来挂载  -v
:::
```powershell
[root@localhost ~]# docker run -it -v 主机目录:容器目录
[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来之后可以使用 docker inspect 容器ID  查看容器的详细新

image.png

测试效果

image.png

再来测试
1、停止容器
2、宿主机上修改文件
3、启动容器
4、容器内的数据依旧是同步的!
image.png

好处: 我们以后修改只需要在本地修改即可,容器内会自动同步

安装mysql

[root@localhost home]# docker search  mysql
[root@localhost home]# docker pull mysql:5.7
#运行容器进行挂载
#安装mysql需要进行密码配置,这是需要注意的点
#官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动Mysql [root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01  mysql:5.7
#-d 后台运行 -p端口映射 -v 挂载   -e环境配置    容器名字 启动
#启动成功之后,我们在本地使用sqlyog来接测试一下
# sq1yog-连接到服务器的3310 --- 3310 和容器内的 3306映射,这个时候我们就可以连接上了!
#在本地测试创建一个数据库,查看一下我们映射的路径是否ok

image.png

假设我们把容器删除
image.png
发现本地数据没有丢失,实现了容器数据持久化

匿名挂载和具名挂载

匿名挂载

-v容器内路径
docker run -d -P --name nginx01 -v / etc/nginx nginx

查看所有的卷的情况

[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 3f3af1f6e15bcf1c7141fff7e7968bf2200b7c23af1eb91b3e496b8007d25cd1
local 813c8a39807f8b136e118f27f4277625bfa269bdf6c2937d3aceaaf9f511223d
local b6929a0d2b57f1d040c2c59d39312e7f9e0fc4208247e1bd8453547cbf806d61

这里发现,这种就是匿名挂载,因为只写了容器内的路径,没有写容器外的路径

[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
eed558ff67e39babd3ed11e2427d9c54ab1f7cea76881ac8fe7248b9064a6a86
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 3f3af1f6e15bcf1c7141fff7e7968bf2200b7c23af1eb91b3e496b8007d25cd1
local 813c8a39807f8b136e118f27f4277625bfa269bdf6c2937d3aceaaf9f511223d
local b6929a0d2b57f1d040c2c59d39312e7f9e0fc4208247e1bd8453547cbf806d61
local juming-nginx
local portainer_data

通过-v卷名:容器内路径

查看一下这个卷

image.png
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/voTumes / xxxx/_dat
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

如何确定是具名挂载还是匿名挂载,还是指定路径挂载!

-v容器内路径 #匿名挂载
-v卷名:容器内路径#具名挂载
-v/宿主机路径::容器内路径#指定路径挂载

#通过-v容器内路径:rorw改变读写权限
roreadonly #只读
rwreadwrite #可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
[root@localhost _data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@localhost _data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

初识dockerFile

Dockerfile就是用来构建docker镜像的构建文件。 命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层

#创建一个docker文件,名字可以随意,建议dockerfile
#文件内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo ".....end...."
CMD /bin/bash
#这里的每个命令就是镜像的一层

image.png
:::tips
启动容器
:::
image.png
这个卷在外部一定有一个同步的目录
image.png
查看一下卷挂载的路径
image.png
测试一下刚才的文件是否同步出去了
image.png
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像
假设构建镜像时候没有挂载卷,要手动镜像挂载-v卷名:容器内路径

数据卷容器

image.png

启动三个容器

image.png
image.png
image.png
image.png

会发现使用了--volumes-from的容器之间的数据是同步的

在删除了centos01之后查看centos02和centos03,会发现同步的文件还存在

image.png

posted @ 2022-11-26 15:35  yutoujun  阅读(40)  评论(0编辑  收藏  举报