卷技术即目录的挂载,就是将容器内的目录,挂载到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时:
- 主机
/home/ceshi/tomcat是新建的空目录;- Docker 挂载的规则是:主机目录会覆盖容器内对应的目录 (空主机目录 → 容器
/usr/local/tomcat也变成空);- 进入容器后直接
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!
假设我们将容器删除,发现,挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!