当前位置:首页 > 随笔 > 正文内容

Docker容器数据管理详解

访客 随笔 2026年7月24日 1

概述

在Docker环境中管理容器数据主要通过两种机制实现:数据卷(Volumes)和数据卷容器(Volume Containers)。这两种方式都能解决容器数据持久化的问题,但在使用场景和操作方式上有所不同。

数据卷

数据卷是Docker提供的特殊目录机制,其作用类似于Linux系统中的挂载点。数据卷独立于容器生命周期之外,即使容器被删除,数据卷仍然保留。

数据卷的核心特性

  • 共享性:一个数据卷可同时供多个容器访问和使用
  • 即时生效:对数据卷内容的修改会立即反映到所有访问该卷的容器
  • 独立性:数据卷的更新不会影响容器镜像本身
  • 持久性:默认情况下,即使容器被删除,数据卷仍会保留在系统中

挂载本地目录到容器

使用docker run命令的-v参数可以将本地主机目录或文件挂载到容器内部。通过多次使用-v参数,可实现多个数据卷的挂载。

注意事项:

  • 本地路径必须使用绝对路径形式
  • 如果指定路径不存在,Docker会自动创建
  • 默认挂载权限为读写模式
  • 可通过:ro参数将挂载设置为只读
  • 建议挂载父目录而非单个文件,避免因容器内编辑导致主机文件inode变化

清理数据卷

数据卷不会随容器自动删除,需要显式操作。执行docker rm -v命令可在删除容器的同时移除关联的数据卷。

操作示例

[root@CentOS7 ~]# docker run -itd --name app-container -v /opt:/opt docker.io/ubuntu /bin/bash
a1b2c3d4e5f6789012345678abcdef0123456789abcdef01234567890abcd

[root@CentOS7 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a1b2c3d4e5f6        docker.io/ubuntu    "/bin/bash"         10 seconds ago      Up 8 seconds                            app-container

[root@CentOS7 ~]# docker inspect app-container
[
    {
        "Id": "a1b2c3d4e5f6789012345678abcdef0123456789abcdef01234567890abcd",
        "Created": "2024-03-15T10:25:30.123456789Z",
        "Path": "/bin/bash",
        "Mounts": [
            {
                "Source": "/opt",
                "Destination": "/opt",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]
    }
]

[root@CentOS7 ~]# docker attach app-container
root@a1b2c3d4e5f6:/# cd /opt
root@a1b2c3d4e5f6:/opt# echo "Sample application data" >> app.log
root@a1b2c3d4e5f6:/opt# ls -la app.log
-rw-r--r--. 1 root root 23 Mar 15 10:26 app.log
root@a1b2c3d4e5f6:/opt# cat app.log
Sample application data
root@a1b2c3d4e5f6:/opt# exit

[root@CentOS7 ~]# ls -la /opt/app.log
-rw-r--r--. 1 root root 23 Mar 15 10:26 /opt/app.log
[root@CentOS7 ~]# cat /opt/app.log
Sample application data

数据卷容器

数据卷容器是一种专门用于提供数据卷的容器类型,适用于需要在多个容器之间共享数据的场景。其工作原理是创建一个包含数据卷的基础容器,其他容器通过挂载该容器的数据卷来实现数据共享。

创建数据卷容器

[root@CentOS7 ~]# docker run -d --name dbstore -v /database docker.io/ubuntu
b2c3d4e5f6a7890123456789abcdef0123456789abcdef01234567890abc

[root@CentOS7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b2c3d4e5f6a7        docker.io/ubuntu    "/bin/bash"         3 seconds ago       Exited (0) 2 seconds ago                       dbstore

[root@CentOS7 ~]# docker inspect dbstore
[
    {
        "Id": "b2c3d4e5f6a7890123456789abcdef0123456789abcdef01234567890abc",
        "Created": "2024-03-15T11:40:22.567890123Z",
        "Path": "/bin/bash",
        "Mounts": [
            {
                "Name": "abc123def45678901234567890abcdef0123456789abcdef01234567890abcd",
                "Source": "/var/lib/docker/volumes/abc123def45678901234567890abcdef0123456789abcdef01234567890abcd/_data",
                "Destination": "/database",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
    }
]

挂载数据卷容器的数据卷

使用--volumes-from参数可以从指定容器挂载所有数据卷。此参数支持同时从多个容器挂载不同数据卷,也支持多级级联挂载。

[root@CentOS7 ~]# docker run -itd --volumes-from dbstore --name service-1 docker.io/ubuntu /bin/bash
c3d4e5f6a7b890123456789abcdef0123456789abcdef01234567890abcd

[root@CentOS7 ~]# docker run -itd --volumes-from dbstore --name service-2 docker.io/ubuntu /bin/bash
d4e5f6a7b8c90123456789abcdef0123456789abcdef01234567890abcde

[root@CentOS7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
d4e5f6a7b8c9        docker.io/ubuntu    "/bin/bash"         15 seconds ago       Up 13 seconds                                   service-2
c3d4e5f6a7b8        docker.io/ubuntu    "/bin/bash"         About a minute ago   Up About a minute                               service-1
b2c3d4e5f6a7        docker.io/ubuntu    "/bin/bash"         18 minutes ago       Exited (0) 18 minutes ago                       dbstore

验证容器间数据共享

在service-1容器中创建文件后,service-2容器立即可以访问相同的数据,证明了数据卷容器机制实现了容器间的实时数据共享。

[root@CentOS7 ~]# docker attach service-1
root@c3d4e5f6a7b8:/# cd /database/
root@c3d4e5f6a7b8:/database# echo "Shared persistent data" >> records.log
root@c3d4e5f6a7b8:/database# ls -la records.log
-rw-r--r--. 1 root root 24 Mar 15 11:45 records.log
root@c3d4e5f6a7b8:/database# cat records.log
Shared persistent data
root@c3d4e5f6a7b8:/database# md5sum records.log
abc123def45678901234567890abcdef0  records.log

[root@CentOS7 ~]# docker attach service-2
root@d4e5f6a7b8c9:/# cd /database/
root@d4e5f6a7b8c9:/database# ls -la records.log
-rw-r--r--. 1 root root 24 Mar 15 11:45 records.log
root@d4e5f6a7b8c9:/database# cat records.log
Shared persistent data
root@d4e5f6a7b8c9:/database# md5sum records.log
abc123def45678901234567890abcdef0  records.log

总结

数据卷适合单一容器或需要直接访问主机文件的场景,而数据卷容器更适合多容器间的数据共享需求。在实际应用中,应根据具体场景选择合适的数据管理方式。

标签: Docker

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。