容器数据卷

容器数据卷

什么是容器数据卷

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 里

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会丢失删除的

posted @   jpy  阅读(35)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示