跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Docker存储基础
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Docker存储基础}} '''Docker存储基础'''是理解容器数据持久化的核心概念。本文将详细介绍Docker的存储机制、数据卷(Volumes)、绑定挂载(Bind Mounts)以及临时文件系统(tmpfs)的使用方法。 == 概述 == Docker容器默认使用'''联合文件系统'''(Union File System)实现分层存储,但容器停止后,其可写层(RW层)的数据会丢失。为实现数据持久化,Docker提供了三种主要存储方式: {| class="wikitable" |+ Docker存储类型对比 ! 类型 !! 存储位置 !! 生命周期 !! 性能 !! 典型用例 |- | '''数据卷(Volume)''' | Docker管理目录(/var/lib/docker/volumes) | 独立于容器 | 高 | 数据库文件、共享数据 |- | '''绑定挂载(Bind Mount)''' | 主机任意路径 | 依赖主机文件系统 | 中 | 开发环境代码同步 |- | '''tmpfs''' | 内存 | 容器运行时 | 极高 | 敏感临时数据 |} == 数据卷(Volumes) == === 基本操作 === 数据卷是由Docker完全管理的持久化存储机制: <syntaxhighlight lang="bash"> # 创建数据卷 docker volume create my_volume # 查看数据卷列表 docker volume ls # 使用数据卷启动容器(nginx容器使用my_volume挂载到/usr/share/nginx/html) docker run -d --name web -v my_volume:/usr/share/nginx/html nginx # 删除数据卷 docker volume rm my_volume </syntaxhighlight> === 技术细节 === * 数据卷存储在主机<code>/var/lib/docker/volumes/</code>目录下 * 支持卷驱动(如local, nfs等) * 可通过<code>docker volume inspect</code>查看详细信息 == 绑定挂载(Bind Mounts) == 直接将主机目录挂载到容器中: <syntaxhighlight lang="bash"> # 将主机/home/user/app挂载到容器/app docker run -v /home/user/app:/app my_image # 只读挂载(容器不能修改主机文件) docker run -v /host/path:/container/path:ro alpine </syntaxhighlight> '''注意''':Windows路径需使用<code>C:\path:/container/path</code>格式 == tmpfs挂载 == 将内存作为临时存储: <syntaxhighlight lang="bash"> # 创建100MB大小的内存挂载 docker run --tmpfs /app:size=100m,mode=1777 alpine </syntaxhighlight> == 存储驱动 == Docker支持多种存储驱动,影响镜像和容器的底层存储方式: <mermaid> pie title 常用存储驱动分布 "overlay2" : 65 "aufs" : 15 "devicemapper" : 10 "btrfs" : 5 "zfs" : 5 </mermaid> 查看当前存储驱动: <syntaxhighlight lang="bash"> docker info | grep "Storage Driver" </syntaxhighlight> == 实际案例 == === 案例1:数据库持久化 === <syntaxhighlight lang="bash"> # MySQL数据持久化 docker run -d \ --name mysql_db \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ mysql:latest </syntaxhighlight> === 案例2:开发环境代码同步 === <syntaxhighlight lang="bash"> # 开发时实时同步代码 docker run -d \ --name dev_server \ -v $(pwd)/src:/app/src \ -p 3000:3000 \ node:latest npm run dev </syntaxhighlight> == 高级主题 == === 数据卷容器模式 === 创建专用容器管理数据卷: <syntaxhighlight lang="bash"> # 创建数据卷容器 docker create -v /data --name data_container busybox # 其他容器共享该数据卷 docker run --volumes-from data_container alpine </syntaxhighlight> === 存储性能优化 === 对于IO密集型应用,可考虑: * 使用<code>--mount</code>替代<code>-v</code>(语法更明确) * 调整存储驱动参数 * 对SSD设备启用<code>discard</code>选项 == 常见问题 == {{Q&A |问题1 = 容器删除后数据卷会自动删除吗? |答案1 = 默认不会,需使用<code>docker run --rm</code>或手动删除。匿名卷(未命名)可能被自动清理。 |问题2 = 如何备份数据卷? |答案2 = 可创建临时容器挂载数据卷进行备份:<br><code>docker run --rm -v db_data:/volume -v $(pwd):/backup alpine tar cvf /backup/backup.tar /volume</code> }} == 数学表示 == Docker存储空间使用可通过以下公式计算: <math> \text{总空间} = \sum_{i=1}^{n} (\text{镜像层大小}_i) + \text{容器可写层大小} + \sum_{j=1}^{m} (\text{数据卷大小}_j) </math> == 总结 == 理解Docker存储基础是构建可靠容器化应用的关键。通过合理选择存储类型(数据卷、绑定挂载或tmpfs),可以平衡数据持久性、性能和安全需求。建议生产环境优先使用数据卷,开发环境可灵活使用绑定挂载实现快速迭代。 [[Category:集成部署]] [[Category:Docker]] [[Category:Docker基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Q&A
(
编辑
)