Docker容器数据卷

柳三千

文章最后更新时间:2025年06月12日

前言:

数据卷介绍

Docker 容器运行产生的数据若不备份,容器删除后数据会丢失。为保存数据,Docker 中使用数据卷

  • 卷是目录或文件,可存在于一个或多个容器中,由 Docker 挂载到容器,但不属于联合文件系统(Union FileSystem)。
  • 卷的设计目的是数据持久化,完全独立于容器生命周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。

数据卷的特点

  • 可在容器之间共享或重用数据。
  • 卷中的更改直接生效。
  • 数据卷中的更改不包含在镜像的更新中。
  • 数据卷的生命周期持续到没有容器使用它为止。

一、容器数据卷挂载

命令格式

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

操作示例

[root@localhost ~]# docker images 
REPOSITORY                  TAG       IMAGE ID       CREATED             SIZE
centos_vim                  7.8       e619078d3432   About an hour ago   546MB
nginx                       latest    51086ed63d8c   3 weeks ago         142MB
ubuntu                      latest    216c552ea5ba   3 weeks ago         77.8MB
centos                      latest    5d0da3dc9764   13 months ago       231MB
martonyang/centos7.8.2003   latest    0c0f2dcf7afd   14 months ago       268MB

[root@localhost docker]# docker run -it --name u1 --privileged=true -v /tmp/mydata:/tmp/mydocker ubuntu
root@878f7776bf84:/# ls /tmp/
mydocker

root@878f7776bf84:/# apt-get install vim

容器内部新建文件

root@878f7776bf84:/# vim /tmp/mydocker/dock_test
root@878f7776bf84:/# cat /tmp/mydocker/dock_test
docker test;

宿主机查看并删除

[root@localhost ~]# cat /tmp/mydata/dock_test 
docker test;
[root@localhost ~]# rm -rf /tmp/mydata/dock_test 
[root@localhost ~]#

容器查看

root@878f7776bf84:/# vim /tmp/mydocker/dock_test
root@878f7776bf84:/# cat /tmp/mydocker/dock_test
docker test;
root@878f7776bf84:/# cat /tmp/mydocker/dock_test
cat: /tmp/mydocker/dock_test: No such file or directory

容器状态查看

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS          PORTS     NAMES
878f7776bf84   ubuntu        "bash"                   11 minutes ago      Up 11 minutes           u1
5b8e991d91ad   51086ed63d8c   "/docker-entrypoint.…"   51 minutes ago      Up 51 minutes   80/tcp    gracious_joliot
a5b8d9c4e554   0c0f2dcf7afd   "bash"                   About an hour ago   Up 52 minutes           infallible_buck

[root@localhost ~]# docker inspect 878f7776bf84

二、设置挂载数据卷权限

容器只读权限(只能读不能写)

命令格式

docker run -id --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro --name=容器名 镜像名

容器创建文件失败

# 以容器内部只读权限去挂载
[root@localhost docker]# docker run -it --name u2 --privileged=true -v /tmp/mydata2:/tmp/mydocker2:ro ubuntu
root@44b72f3eb56d:/# ls /tmp/
mydocker2

root@44b72f3eb56d:/# touch /tmp/mydocker2/test
touch: cannot touch '/tmp/mydocker2/test': Read-only file system

宿主机创建文件

[root@localhost ~]# ll /tmp/
total 4
drwxr-xr-x 2 root  root   6 Oct 27 04:48 mydata
drwxr-xr-x 2 root  root   6 Oct 27 05:00 mydata2
[root@localhost ~]# touch /tmp/mydata2/test
[root@localhost ~]# ll /tmp/mydata2/
total 0
-rw-r--r-- 1 root root 0 Oct 27 05:02 test

容器内查看

root@44b72f3eb56d:/# ll /tmp/mydocker2/
total 0
drwxr-xr-x 2 root root 18 Oct 27 09:02 ./
drwxrwxrwt 1 root root 23 Oct 27 09:00 ../
-rw-r--r-- 1 root root  0 Oct 27 09:02 test

容器信息查看

[root@localhost ~]# docker inspect u2

总结

  • 默认情况下,容器卷可读可写。
  • 特殊场景下,可限制容器实例内部为只读,即容器内只能读取宿主机文件数据,宿主机写入内容可同步给容器。

三、数据卷的继承和共享

命令格式

docker run -it --name 容器名字 --privileged=true --volumes-from 父类 镜像名字

继承数据卷规则(以继承 u2 为例)

[root@localhost docker]# docker run -it --name u3 --privileged=true --volumes-from u2 ubuntu
root@4b7c2d5914b3:/#

容器信息查看

[root@localhost ~]# docker inspect u3

权限验证(容器内无法创建文件)

root@4b7c2d5914b3:/# ll /tmp/mydocker2/
total 0
drwxr-xr-x 2 root root 18 Oct 27 09:02 ./
drwxrwxrwt 1 root root 23 Oct 27 09:20 ../
-rw-r--r-- 1 root root  0 Oct 27 09:02 test
root@4b7c2d5914b3:/# touch /tmp/mydocker2/u3
touch: cannot touch '/tmp/mydocker2/u3': Read-only file system
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码