Docker数据卷

卷技术即目录的挂载,就是将容器内的目录,挂载到Linux上面!

容器数据卷

用于容器的持久化和同步操作,容器和系统之间数据共享,容器之间的数据也可以共享(即数据卷容器)

  • 容器之间的数据共享,父容器删除不会影响到其他容器的数据
  • 容器数据共享到主机本地,容器删除不会影响到本地的数据

实现办法1:

通过镜像启动容器时,使用 docker run 命令添加 -v参数关联目录操作,3种方式如下。

指定路径挂载:-v 本地目录:容器内目录

匿名挂载:-v 容器内目录 容器数据卷的默认路径挂载

复制代码
docker run -d -P --name nginx01 -v /ect/nginx nginx

具名挂载:-v 卷名:容器内目录 容器数据卷的默认路径挂载(常用于生产环境)
注意:

  • 具名挂载和匿名挂载默认主机路径 /var/lib/docker/volumes/
  • 匿名挂载和具名挂载会产生"卷",通过docker volume可查看卷名
  • 通过 -v 挂载容器数据卷时,路径后可添加ro(只读)或rw(可读写)改变挂载目录的读写权限,ro表示该路径仅可以通过宿主机操作,容器内部无权限操作,例如 docker run -d -v /home/ceshi:/etc/nginx:ro nginx
复制代码
[root@localhost gao]# mkdir -p /home/ceshi/tomcat
[root@localhost gao]# ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
[root@localhost gao]# cd /home
[root@localhost home]# ls
ceshi  gao

[root@localhost home]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
tomcat2.00               1.0       0ad8e3ecec7e   27 hours ago   422MB
nginx                    latest    99133eed2307   3 days ago     161MB
portainer/portainer-ce   latest    2ad8d683056c   2 weeks ago    183MB
tomcat                   latest    a76ed56adf24   3 weeks ago    416MB
kibana                   7.6.2     f70986bc5191   5 years ago    1.01GB
elasticsearch            7.6.2     f29a1ee41030   5 years ago    791MB
[root@localhost home]# docker run -it -p 8080:8080 tomcat2.00:1.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /opt/java/openjdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
14-Mar-2026 13:42:45.647 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/11.0.18
14-Mar-2026 13:42:45.651 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          J

[root@localhost gao]# docker exec -it 95a6305b45f2 /bin/bash
root@95a6305b45f2:/usr/local/tomcat# ls
bin           conf             filtered-KEYS  LICENSE  native-jni-lib  README.md      RUNNING.txt  upstream-KEYS  webapps.dist
BUILDING.txt  CONTRIBUTING.md  lib            logs     NOTICE          RELEASE-NOTES  temp         webapps        work

[root@localhost home]# docker run -it -v /home/ceshi/tomcat:/usr/local/tomcat tomcat2.00:1.0 /bin/bash
root@28904bc70413:/usr/local/tomcat# exit
exit
[root@localhost home]# cd /home/ceshi/tomcat
[root@localhost tomcat]# ls
#执行完挂载命令并退出容器后,/home/ceshi/tomcat 目录为空是正常现象(核心原因是「空主机目录挂载会覆盖容器目录」)

执行 -v /home/ceshi/tomcat:/usr/local/tomcat 时:

  1. 主机 /home/ceshi/tomcat新建的空目录
  2. Docker 挂载的规则是:主机目录会覆盖容器内对应的目录 (空主机目录 → 容器 /usr/local/tomcat 也变成空);
  3. 进入容器后直接 exit,没有往容器目录里写数据,所以主机目录也为空。
复制代码
[root@localhost tomcat]# docker run -it -v /home/ceshi/tomcat:/usr/local/tomcat tomcat2.00:1.0 /bin/bash
root@8e87ebaaa009:/usr/local/tomcat# 

[root@localhost gao]# cd /home/ceshi/tomcat
[root@localhost tomcat]# docker ps
CONTAINER ID   IMAGE                           COMMAND        CREATED          STATUS          PORTS             MES
8e87ebaaa009   tomcat2.00:1.0                  "/bin/bash"    43 seconds ago   Up 43 seconds   8080/tcp          ughing_shirley
6e18007d191d   portainer/portainer-ce:latest   "/portainer"   2 days ago       Up 8 hours      8000/tcp, 9443/tcprtainer
[root@localhost tomcat]# docker inspect 8e87ebaaa009
[
    {
        "Id": "8e87ebaaa009646dc2f7d916567348385b95b3bc6c5078800592c20a6bf19f0d",
        "Created": "2026-03-14T14:26:40.333726836Z",
        "Path": "/bin/bash",
        "Args": [],
        "Mounts": [
            {                    #挂载 -v卷
                "Type": "bind",
                "Source": "/home/ceshi/tomcat",#主机内地址
                "Destination": "/usr/local/tomcat",#docker容器内地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

同步过程;双向绑定

复制代码
[root@localhost tomcat]# docker start 8e87ebaaa009
8e87ebaaa009
[root@localhost tomcat]# docker attach 8e87ebaaa009
root@8e87ebaaa009:/usr/local/tomcat# ls
test.py
root@8e87ebaaa009:/usr/local/tomcat# cat test.py
print("hello,world")

实现方法2:

DockerFile构建镜像时直接挂载。

数据卷容器

实现容器和容器之间的数据共享,注意是整体数据的共享(类似于整体备份,不是作用于某单个路径),被挂载的被称为父容器,父容器就是数据卷容器,父容器被删除后,共享的其他容器数据不受影响。

执行 docker run 命令时,添加参数 --volumes-from 容器名或id 实现容器之间的数据共享。

实战:安装MySQL

mysql的数据持久化问题

复制代码
#获取镜像
[root@localhost gao]# docker pull mysql:5.7
#运行容器,需要做数据挂载!
#安装启动mysq1,需要配置密码
#docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
[root@localhost gao]# docker run -d -p 3306: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
#启动成功以后可以在本地使用数据库工具连接
[root@localhost gao]# docker exec -it a960d59a653f /bin/bash #进入容器

在本地测试创建一个数据库,查看一下映射的路径是否ok!

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

相关推荐
大树886 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn867 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智8 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉9 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦9 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_9618752410 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant