创建的容器都是没有指定 volume的,为什么docker volume ls命令会看到很多volume列表?
有那么一天,停止了世界所有的容器(在你电脑上),执行以下命令
docker volume ls
docker volume ls | wc -l
哎呦,我去,怎么这么多啥玩意,再执行以下命令看占了我多少磁盘空间
# 使用 docker inspect 命令(如果 volume 驱动支持大小 Size 报告):
docker volume inspect <volume_name> --format '{{ .Size }}'
# 查看所有 volumes 的详细信息(这玩意不太准,可以当做估算大小吧)
docker system df -v
# 更精确
sudo du -sh /var/lib/docker/volumes/*
# 如果你想要更精确的结果,可以直接查看 Docker volume 的存储位置的实际磁盘占用大小
# linux通常在 /var/lib/docker/volumes/ 目录下
# 在 macOS 上,Docker Desktop 使用的是一个特殊的虚拟机来运行 Docker 引擎,因此 Docker volumes 的实际存储位置比较特殊:
# ~/Library/Containers/com.docker.docker/Data/vms/0/data/docker/volumes/
# 还有一个 macOS 下的 orbstack
# OrbStack Docker volumes 的默认存储路径(跟 docker volume inspect 命令输出的不一致)
# 通过 brew 安装的 orbstack Docker volumes 的默认存储路径(通过下面命令找到了)
find / -type d -name "volumes" 2>/dev/null | grep -i orbstack
/System/Volumes/Data/Users/<your_username>/OrbStack/docker/volumes
~/OrbStack/docker/volumes
这是因为 Docker 有一个特性叫做"匿名卷"(Anonymous Volumes)。即使你没有显式指定 volume,Docker 也会在以下情况自动创建 volume:
1.Dockerfile 中的 VOLUME 指令
# 当 Dockerfile 包含这样的指令时,会自动创建匿名卷
VOLUME /data
2.Docker Compose/Swarm/Stack 中的隐式声明
services:
db:
image: mysql
# MySQL 镜像的 Dockerfile 中定义了 VOLUME,会自动创建
3.某些镜像的默认行为
比如:
- MySQL 会为数据目录创建 volume
- Redis 会为数据文件创建 volume
- MongoDB 会为数据库文件创建 volume
查看这些自动创建的 volume 的来源:
# 查看 volume 详细信息
docker volume inspect volume_name
# 查看容器的 volume 挂载信息
docker inspect container_name | grep -A 10 "Mounts"
那么真正需要的问题来,不知道也就算了,现在知道了,我们不希望莫名其妙多了好多莫名的 volume,应该清理?以及如何保持纯净或最佳实践?
清理建议:
1.使用 docker volume ls -f dangling=true 查看未被使用的 volume
2.使用 docker volume prune 清理未使用的 volume
3.如果要避免创建匿名卷,可以:
- 在 docker run 时使用 --rm 参数(容器删除时自动删除匿名卷)
- 显式定义具名卷(named volume)
- 使用 bind mount 替代 volume
docker volume 相关命令
docker volume 帮助命令
docker volume --help
列出所有 volumes
docker volume ls
查看指定的 volume 的详细信息
docker volume inspect <volume_name>
查看哪些容器正在使用特定的 volume
docker ps -a filter volume=<volume_name>
查看 volume 的具体内容
ls /var/lib/docker/volumes/<volume_name>/_data
查看 dangling (未被使用) 的 volumes
docker volume ls -f dangling=true
删除指定的 volume
docker volume rm <volume_name>
列出并删除指定条件的 volumes
docker volume ls -qf dangling=true | xargs -r docker volume rm
删除所有未使用的 volumes
docker volume prune
最佳实践是在生产环境中使用具名卷,这样更容易管理和维护:
# 创建具名卷
docker run -v my_volume:/data image_name
非生产环境,比如开发/测试环境,使用 tmpfs,性能更高,这样容器删除或重启会直接清空,无残留
# 创建使用 tmpfs 的容器
docker run --tmpfs /app/cache nginx
# 可以指定大小和权限
docker run --tmpfs /app/cache:rw,size=1g,noexec nginx
# or
# 限制 tmpfs 大小
docker run --tmpfs /tmp:size=100M nginx
# 设置权限
docker run --tmpfs /tmp:rw,noexec,nosuid,size=100M nginx
# 临时文件
docker run --tmpfs /tmp nginx
# 会话数据
docker run --tmpfs /app/sessions my-web-app
# 缓存数据
docker run --tmpfs /app/cache redis
tmpfs 不适用的场景
- 数据库等需要持久化的
- 用户上传文件等需要支持持久化的
- 配置文件
- 日志文件
- 等
更佳的混合使用策略
# docker-compose.yml 示例
services:
web:
image: nginx
volumes:
- ./data:/app/data # 持久化数据使用 volume
tmpfs:
- /tmp # 临时文件使用 tmpfs
- /app/cache # 缓存使用 tmpfs
总结:
- tmpfs 适合处理临时数据、缓存和敏感信息
- 需要持久化的数据还是应该使用 volume 或 bind mount
- 建议根据数据特性选择合适的存储方式,可以混合使用不同的存储策略
创建的容器都是没有指定 volume的,为什么docker volume ls命令会看到很多volume列表?的更多相关文章
- docker学习笔记18:Dockerfile 指令 VOLUME 介绍
在介绍VOLUME指令之前,我们来看下如下场景需求: 1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上.一旦容器删除后,这些数 ...
- docker容器的参数如何指定配额
docker容器的参数如何指定配额 1. 内存 现在让我看下内存限制. 第一件事需要注意的是,默认一个容器可以使用主机上的所有内存. 如果你想为容器中的所有进程限制内存,使用docker run命令的 ...
- 使用Docker创建数据容器
使用Docker创建数据容器 翻译自: Data-only container madness 1.什么是数据容器? 数据容器就是本身只创建一个volume供其他容器共享,创建完后即退出,不执行任何任 ...
- 创建Spring容器
对于使用Spring的web应用,无须手动创建Spring容器,而是通过配置文件,声明式的创建Spring容器.在Web应用中,创建Spring容器有如下两种方式:1.直接在web.xml文件中配置: ...
- 如何创建 Swarm 集群?- 每天5分钟玩转 Docker 容器技术(95)
本节我们将创建三节点的 swarm 集群. swarm-manager 是 manager node,swarm-worker1 和 swarm-worker2 是 worker node. 所有节点 ...
- kubernetes 创建nginx 容器
参考:http://blog.csdn.net/qq1010885678/article/details/48832067 一个简单的nginx服务器 先决条件:你需要拥有的是一个部署完毕并可以正常运 ...
- dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
dockerfile创建php容器(含有memcached.redis.gd.xdebug扩展) 代码如下: FROM php:7.2-fpm COPY redis-3.1.6.tgz /home/r ...
- Docker(八)-Docker创建Nginx容器
获取Nginx镜像 最简单的方法就是通过 docker pull nginx 命令来创建 Nginx容器. $ sudo docker pull nginx 或者: $ sudo docker pul ...
- 03_Docker入门(上)之容器创建、容器使用、容器删除
运维架构服务docker:docker入门 一.确保docker就绪 查看docker程序是否存在,功能是否正常 Docker可执行程序的info命令,该命令会返回所有容器和镜像的数量.Docker使 ...
- Oracle 删除用户和表空间////Oracle创建删除用户、角色、表空间、导入导出、...命令总结/////Oracle数据库创建表空间及为用户指定表空间
Oracle 使用时间长了, 新增了许多user 和tablespace. 需要清理一下 对于单个user和tablespace 来说, 可以使用如下命令来完成. 步骤一: 删除user drop ...
随机推荐
- uniapp编译成小程序无法设置背景色
参考地址: https://blog.csdn.net/weixin_42120767/article/details/107550236 在原生微信小程序中,我们可以设置page{backgroun ...
- Java中的Scanner、BufferedReader 和 StreamTokenizer
1. Scanner 的使用与分析 简介: Scanner 是 Java 中一个用于解析原始类型(如 int.double 等)和字符串的类.它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使 ...
- CPU算力如何计算
本文分享自天翼云开发者社区<CPU算力如何计算>,作者:l****n 什么是算力 随着国家大力发展数字基础设施,算力的提升和普惠变得越来越重要,它注定会在人们的视线中占据很重要的一席.那么 ...
- 解决使用yarn安装依赖出现“The engine "node" is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >=18.0.0". Got "17.9.0"”的问题
1.问题描述 某天在使用yarn安装依赖的时候,突然出现如下错误导致安装依赖终止: The engine "node" is incompatible with this modu ...
- shell脚本sed命令
Sed 是一个脚本型的编译器,全称StreamEDitor,即流编辑器是非交互式的编辑器 sed 原理简析sed 以行为处理单位,每次从标准输入/文本获取一行信息,存储到其" 模式空间 &q ...
- Luogu P1983 车站分级 题解 [ 绿 ] [ 拓扑排序 ] [ 图论建模 ] [ 虚点 ]
车站分级:很好的拓扑排序题,细节有点多. 图论建模 首先观察对于一条线路,我们可以从中直接得到什么信息: 假设这条线路的开头为 \(st\),结尾为 \(ed\),那么在 \([st,ed]\) 的车 ...
- SMMS图床Java接口上传
前言 个人项目开发中,网站建设中需要用到大量的图片以及用户上传的图片,如果服务器带宽小,磁盘容量小将所有的图片信息全部存储在服务器上不太现实,这里建议将图片数据存储在对象存OSS上或者将图片保存在图床 ...
- Flink运行时架构
一.运行时的组件和基本原理 1.作业管理器 (1)控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行. (2)JobManager会先接收到要执行的应用 ...
- 公众号已上线 Ask AI 功能
Get新技能,给公众号接入AI智能体,没花一分钱. 不禁感慨这时代的进步也太快了,曾经科幻小说中描绘的未来已成现实! 下面是笔者在腾讯元宝中创建的智能体"鲸鱼小助手": 如果今后要 ...
- Coordinate Spaces
Coordinate Spaces 本主题包含以下部分: 根空间 用户空间 像素空间 任何VisionPro图像支持一系列坐标空间,以提供一个数值框架来表达特定特征的位置.最有用的空间是根空间,它将点 ...