文章最后更新时间: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
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。