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!

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

相关推荐
mengchanmian1 小时前
docker 国内云服务器开源镜像
运维·docker·容器
云攀登者-望正茂1 小时前
macOS上Docker使用systemd cgroup驱动失败原因
macos·docker
工业甲酰苯胺1 小时前
Docker 容器化 OpenClaw
人工智能·docker·openclaw
糟糕喔2 小时前
k8s运维-configmap和secret(4)
运维·容器·kubernetes
数据知道2 小时前
MongoDB自动化运维脚本:详细讲述日常维护任务批量化处理的实用技巧
运维·mongodb·自动化
无敌海苔咪2 小时前
【解决方案】CentOS 7 网络显示线缆已拔出
linux·运维·centos
何中应2 小时前
ubuntu如何安装nvm
linux·运维·ubuntu·node.js
cuijiecheng20182 小时前
Linux下CPP-DateTime-library库的使用
linux·运维·服务器
ai产品老杨2 小时前
跨越指令集鸿沟:基于K8s编排与Docker多架构镜像的GB28181/RTSP异构AI视频底座构建
docker·架构·kubernetes