在 linux 系统上,docker 将images, containers, volumes等相关的数据存储在/var/lib/docker
下。
volume它的主要作用是容器和宿主机之间可以通信,方便备份恢复。
通过 Volume,可以将容器中的数据持久化到宿主机,确保数据不会因容器的删除而丢失。此外,还有bind mount(可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。)和tmpfs mount(挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统)
概念 | 描述 | 区别 |
---|---|---|
数据卷(Volume) | 用于持久化容器数据的工具 | 数据卷可以跨容器共享,数据持久化到宿主机。 |
绑定挂载(Bind Mount) | 将宿主机的文件或目录挂载到容器中 | 绑定挂载依赖于宿主机的文件系统,路径必须存在。 |
临时文件系统(tmpfs) | 将数据存储在内存中 | 临时文件系统中的数据不会持久化,容器删除后数据丢失。 |
常用命令:
docker volume ls
查看有哪些数据卷
docker volume create 卷名
创建卷
docker volume inspect 卷名
查看卷的详细信息
docker volume rm 卷名
删除卷
docker启动容器时使用-v /--mount
指定要挂载的卷:如果该卷不存在,docker 自动创建
挂载类型对比; --mount 就需要提前创建
参数形式 | 示例 | 特点 |
---|---|---|
-v 短格式 | -v myvol:/app/data | 简洁,自动创建卷 |
–mount 长格式 | –mount type=volume,source=myvol,target=/app/data | 更精确的控制选项 |
推荐:生产环境优先使用 --mount,支持更多配置选项(如只读挂载) |
两种挂载语法:
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \ # source宿主机 target容器
nginx:latest
- 挂载只读卷:
docker run -d \ --name=nginx-1 \ --mount source=nginx-vol,target=/usr/share/nginx/html,readonly \ nginx:latest
- 挂载子目录:子目录卷需要提前在卷logs中创建好,不然会挂载失败
cd /var/lib/docker/volumes/logs/_data
mkdir app1
docker run -d \ --name=nginx-2 \ --mount source=logs,target=/var/log/app1,volume-subpath=app1 \ # 语法要求:三个逗号之间不能有空格 nginx:latest
- 在两台docker宿主机上创建支持nfs功能的卷 nfs-web-1
1、首先准备一台NFS服务器(详见NFS服务搭建过程)
搭建过程大致类似,只有一处需要注意 :
/docker/web/html 192.168.237.0/24(ro,sync,all_squash)
如果这里只给了它只读的权限,就要给这个/docker/web 777的权限
2、在两台docker上,一台Ubuntu,一台rocky 都安装客户端,这样才能识别挂载的文件
Ubuntu:apt install -y nfs-common
rocky:yum install nfs-utils -y
3、创建支持NFS功能的卷(两台docker上都操作一遍)
docker volume create \ --driver local \ --opt type=nfs \ --opt o=addr=192.168.237.179,nolock,soft,ro,sync \ --opt device=:/docker/web nfs-web-1
4、在两台宿主机上启动容器时使用该卷
docker run -d --name nginx-4 -p 5588:80 -v nfs-web-1:/usr/share/nginx/html nginx
5、访问验证
思考:
正常停止容器,容器里的数据会丢失吗?
如何将容器里的数据保存到宿主机?
如何在容器和宿主机之间传输数据? docker cp
修改了容器对应的配置文件如何让配置文件生效?