容器数据卷
容器数据卷
什么是容器数据卷
docker理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那容器删除,数据就会丢失!需求:数据可以持久化。
MySql,容器删了,数据就没了,删库跑路!需求:MySql数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将哦我们容器内的目录挂载到Linux上!
总结一句话: 容器的持久化和同步操作! 容器间也可以数据共享的!
使用数据卷
方式1:直接使用命令来挂载 -v
docker run 其他命令(后台或前台启动,端口配置等) -v 宿主机目录:容器内目录 容器
docker run -it -v /home/ceshi:/home centos /bin/bash
#挂载查看
docker inspect f187b6c96f23
...........
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",//挂载目录,宿主机目录
"Destination": "/home",//容器内目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
................
#测试文件同步
1.在容器内home添加文件后,宿主机home/ceshi下也有了该文件
2.在宿主机home/ceshi添加文件后,容器内home也有了该文件
以后,修改只需要在本地修改,容器内会自动同步
docker run -d -p 3310:3306 -v /home/mysql/
安装mysql
思考:mysql数据持久化问题
# 1.获取镜像
docker pull mysql:5.7
# 2.运行容器,需要做数据挂载,需要配置密码
-e 配置环境
-d 后台运行
-p 配置端口
-v 卷挂载
--name 容器名字
docker run -e MYSQL_ROOT_PASSWORD=123456 -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql01 mysql:5.7
# 3.使用navicat登陆连接到linux的3310,映射到容器内的3306
将容器删除,本地的mysql数据也不会丢失
具名和匿名挂载
# 匿名挂载
-v 容器内路径
[root@jinpengyong data]# docker run -d -P --name nginx-niming -v /etc/nginx nginx:【版本】
# 查看所有volume卷情况
[root@jinpengyong data]# docker volume ls
DRIVER VOLUME NAME
local 06c81a6b49d70ff1e9e5a6e87f5081001b1035d77e5ff0cc0ab71c5ecc8c529f
# 发现:这种就是匿名挂载,只在-v 后下了容器内路径,没有写容器外路径
#具名挂载
[root@jinpengyong data]# docker run -d -P --name nginx-juming -v juming-nginx:/etc/nginx nginx:latest
[root@jinpengyong data]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
#这就是具名挂载
#查看一下这个卷
[root@jinpengyong data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-11-17T13:52:43+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data",//默认挂载路径
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定容器外目录时,卷都在/var/lib/docker/volumes/xxxx
大多数情况,我们要通过具名挂载,方便的找到一个卷
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /容器外路径:容器内路径 # 指定路径挂载
拓展
# -v 容器内路径:ro rw 读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
# ro 只要看到ro就说明这个路径只能通过宿主机来改变,容器内部无法操作
初识Dockerfile
Dockerfile就是一段命令脚本,用来构建镜像。命令里可以直接配置挂载,所以也是一种挂载的方式
方式1:-v
方式2:dockerfile 命令方式配置了挂载,然后生成的镜像,自带了挂载。如果不配置挂在卷,就需要-v 手动挂载镜像
dockerfile脚本
# 创建一个dockerfile文件
# 文件中内容:指令 参数
# 这里的每个命令就是镜像的一层
#
FROM centos
VOLUME ["volume01","volume02"] #匿名挂载
CMD echo "---end----"
CMD /bin/bash
构建生产自己的镜像
# docker build
-f # 脚本文件名
-t # 给镜像起个名字
docker build -f dockfile1 -t jpy-centos .
启动自己的镜像
[root@jinpengyong docker-test-volume]# docker run -it 镜像id /bin/bash
[root@72e8de869fee /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Nov 17 07:52 dev
drwxr-xr-x 1 root root 4096 Nov 17 07:52 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 117 root root 0 Nov 17 07:52 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
drwxr-xr-x 11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Oct 21 06:46 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
drwxr-xr-x 2 root root 4096 Nov 17 07:52 volume01 # 这两个目录就是我们生成镜像时自动挂载的数据卷目录
drwxr-xr-x 2 root root 4096 Nov 17 07:52 volume02
这个卷在外部有一个同步目录,因为是匿名挂载,所以外部在/var/lib/docker/volumes/
下
docker inspect 容器id # 查看挂载情况
"Mounts": [
{
"Type": "volume",
"Name": "f792ccde2d007aa388104d0ed849a058ef0fe1a316fb4f1b7be405a61d9d5326",
"Source": "/var/lib/docker/volumes/f792ccde2d007aa388104d0ed849a058ef0fe1a316fb4f1b7be405a61d9d5326/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "8799072a0854142eb315030f0aca6cbb9cd4765f9d5cc7262a58bc22ecf025cf",
"Source": "/var/lib/docker/volumes/8799072a0854142eb315030f0aca6cbb9cd4765f9d5cc7262a58bc22ecf025cf/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
测试文件同步
在容器内部的挂载目录volume01下创建一个文件,查看容器外部,/var/lib/docker/volumes/xxxx/_data下也有一个该文件
数据卷容器
多个mysql同步数据
# 启动三个容器
# 01容器
[root@jinpengyong _data]# docker run -it --name jpy_centos-01 f26ecadef9af /bin/bash
# 02容器
[root@jinpengyong _data]# docker run -it --name jpy_centos-02 --volumes-from jpy_centos-01 f26ecadef9af /bin/bash
# 03容器
[root@jinpengyong _data]# docker run -it --name jpy_centos-03 --volumes-from jpy_centos-02 f26ecadef9af /bin/bash
不管在哪个容器的挂载目录(例中:volume01或volume02)下创建或修改文件,另外两个容器都会同步,是拷贝的概念。
再开一个,04 from 01,文件也会同步到02 03 里
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会丢失删除的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY