Docker实战:数据管理

文章目录

  • [1. 实战概述](#1. 实战概述)
  • [2. 实战步骤](#2. 实战步骤)
    • [2.1 操作数据卷](#2.1 操作数据卷)
      • [2.1.1 创建本地数据卷](#2.1.1 创建本地数据卷)
      • [2.1.2 查看数据卷列表](#2.1.2 查看数据卷列表)
      • [2.1.3 查看数据卷详细信息](#2.1.3 查看数据卷详细信息)
      • [2.1.4 删除指定的数据卷](#2.1.4 删除指定的数据卷)
      • [2.1.5 判断数据卷是否存在](#2.1.5 判断数据卷是否存在)
    • [2.2 挂载普通数据卷(Volume)](#2.2 挂载普通数据卷(Volume))
      • [2.2.1 挂载普通数据卷](#2.2.1 挂载普通数据卷)
      • [2.2.2 查看运行的容器](#2.2.2 查看运行的容器)
      • [2.2.3 查看数据卷信息](#2.2.3 查看数据卷信息)
    • [2.3 绑定挂载宿主机目录(Bind)](#2.3 绑定挂载宿主机目录(Bind))
      • [2.3.1 绑定挂载宿主机目录](#2.3.1 绑定挂载宿主机目录)
      • [2.3.2 查看运行的容器](#2.3.2 查看运行的容器)
    • [2.4 挂载临时文件系统(tmpfs)](#2.4 挂载临时文件系统(tmpfs))
      • [2.4.1 挂载临时文件系统](#2.4.1 挂载临时文件系统)
      • [2.4.2 查看运行的容器](#2.4.2 查看运行的容器)
      • [2.4.3 查看临时数据卷信息](#2.4.3 查看临时数据卷信息)
    • [2.5 数据卷容器](#2.5 数据卷容器)
      • [2.5.1 新建数据卷容器](#2.5.1 新建数据卷容器)
      • [2.5.2 共享数据卷容器](#2.5.2 共享数据卷容器)
    • [5.3 数据迁移](#5.3 数据迁移)
      • [5.3.1 备份数据卷](#5.3.1 备份数据卷)
      • [5.3.2 还原数据卷](#5.3.2 还原数据卷)
  • [3. 实战总结](#3. 实战总结)

1. 实战概述

  • 本次实战系统演示了 Docker 数据管理的核心技术,包括创建与管理本地数据卷(Volume)、绑定挂载宿主机目录(Bind Mount)、使用内存临时文件系统(tmpfs),以及通过数据卷容器实现多容器间数据共享与迁移。通过备份与还原操作,验证了数据持久化、共享和迁移的完整流程。

2. 实战步骤

2.1 操作数据卷

2.1.1 创建本地数据卷

  • 执行命令:docker volume create -d local huawei_volume
  • 结果说明 :执行 docker volume create -d local huawei_volume 成功创建名为 huawei_volume 的本地数据卷,使用默认的 local 驱动。该卷可用于容器间持久化存储,确保数据在容器销毁后仍保留,验证了 Docker 数据卷的基本创建功能。

2.1.2 查看数据卷列表

  • 执行命令:docker volume ls
  • 结果说明 :执行 docker volume ls 成功列出系统中所有数据卷,包含四个本地驱动(local)的卷,其中 huawei_volume 为手动创建的命名卷。输出显示各卷的唯一标识符和名称,验证了数据卷的创建与管理功能正常,可用于后续容器持久化存储配置。

2.1.3 查看数据卷详细信息

  • 执行命令:docker volume inspect huawei_volume
  • 结果说明 :执行 docker volume inspect huawei_volume 成功获取该数据卷的详细信息,显示其驱动为 local,挂载点位于 /var/lib/docker/volumes/huawei_volume/_data,验证了数据卷在宿主机上的实际存储路径和配置属性,确保容器可安全持久化数据。

2.1.4 删除指定的数据卷

  • 执行命令:docker volume rm 31e066fd25ef0044ca437ea841fbd48c6d8f41fecdc44165dca542afef5f42e8
  • 结果说明 :执行 docker volume rm 成功删除指定数据卷(ID: 31e06...),系统无报错提示,表明该卷未被任何容器使用且已从本地存储中彻底移除。操作验证了 Docker 数据卷的清理功能,确保资源释放和磁盘空间回收有效。

2.1.5 判断数据卷是否存在

  • 执行命令:docker volume inspect huawei_volume >/dev/null 2>&1 && echo "huawei_volume卷存在~" || echo "huawei_volume卷不存在~"
  • 结果说明 :执行命令通过 docker volume inspect 检查 huawei_volume 是否存在,输出重定向至 /dev/null 避免显示内容,结合 &&|| 判断执行结果。结果显示"huawei_volume卷存在",说明该数据卷已成功创建并存在于系统中,验证了其可用性。
  • 执行命令:docker volume inspect 31e066fd25ef0044ca437ea841fbd48c6d8f41fecdc44165dca542afef5f42e8 >/dev/null 2>&1 && echo "31e066fd25ef0044ca437ea841fbd48c6d8f41fecdc44165dca542afef5f42e8卷存在~" || echo "31e066fd25ef0044ca437ea841fbd48c6d8f41fecdc44165dca542afef5f42e8卷不存在~"
  • 结果说明:执行 docker volume inspect 检查指定卷 ID 的数据卷,输出重定向至 /dev/null 以隐藏内容,结合 &&|| 判断命令执行结果。结果显示"31e066fd...卷不存在",说明该卷 ID 对应的数据卷未在系统中找到,验证了它已经被删除。

2.2 挂载普通数据卷(Volume)

2.2.1 挂载普通数据卷

  • 执行命令:docker run -d --name=nginx_huawei_docker_1 --mount source=nginx_huawei_volume,destination=/usr/share/nginx/html nginx:latest

  • 结果说明 :执行命令成功启动名为 nginx_huawei_docker_1 的 Nginx 容器,并将数据卷 nginx_huawei_volume 挂载至容器的 /usr/share/nginx/html 目录,实现网页内容持久化存储。容器运行正常,验证了 Docker 数据卷与容器的正确绑定及使用。

  • 执行命令:docker run -d --name=nginx_huawei_docker_2 -v nginx_huawei_volume,/usr/share/nginx/html nginx:latest

  • 结果说明 :执行命令成功启动名为 nginx_huawei_docker_2 的 Nginx 容器,并通过 -v 参数将数据卷 nginx_huawei_volume 挂载至容器的 /usr/share/nginx/html 目录,实现网页内容持久化。容器运行正常,验证了使用 -v 选项挂载数据卷的正确性与兼容性。

2.2.2 查看运行的容器

  • 执行命令:docker ps -a
  • 结果说明 :执行 docker ps -a 成功列出所有容器,显示两个 Nginx 容器 nginx_huawei_docker_1nginx_huawei_docker_2 均处于运行状态(Up),分别映射了 80/tcp 和 90/tcp 端口。验证了容器创建与启动成功,且数据卷挂载配置正常,系统资源调度无异常。

2.2.3 查看数据卷信息

  • 执行命令:ll /var/lib/docker/volumes
  • 结果说明 :执行 ll /var/lib/docker/volumes 成功列出 Docker 数据卷目录,显示 nginx_huawei_volume 等卷的挂载点和权限信息,确认其在宿主机上的实际存储路径为 /var/lib/docker/volumes/nginx_huawei_volume/_data,验证了数据卷持久化存储机制正常,文件系统结构完整。

2.3 绑定挂载宿主机目录(Bind)

2.3.1 绑定挂载宿主机目录

  • 执行命令:mkdir /usr/local/web

  • 执行命令:docker run -d --name=nginx_bind_docker_1 --mount type=bind,source=/usr/local/web,destination=/usr/share/nginx/html nginx:latest

  • 结果说明 :执行命令成功启动名为 nginx_bind_docker_1 的 Nginx 容器,并通过 --mount type=bind 将宿主机路径 /usr/local/web 绑定挂载至容器的 /usr/share/nginx/html,实现静态网页内容共享。容器运行正常,验证了绑定挂载(bind mount)功能的正确性与数据同步能力。

  • 执行命令:docker run -d --name=nginx_bind_docker_2 -v /usr/local/web:/usr/share/nginx/html nginx:latest

  • 结果说明 :执行命令成功启动名为 nginx_bind_docker_2 的 Nginx 容器,并通过 -v 参数将宿主机目录 /usr/local/web 挂载至容器的 /usr/share/nginx/html,实现网页内容共享。容器运行正常,验证了使用 -v 选项进行绑定挂载的正确性与兼容性。

2.3.2 查看运行的容器

  • 执行命令:docker ps -a --filter "name=bind"

  • 结果说明 :执行 docker ps -a --filter "name=bind" 成功筛选出名称包含 "bind" 的容器,显示 nginx_bind_docker_1nginx_bind_docker_2 均处于运行状态(Up),并映射 80/tcp 端口。验证了绑定挂载容器部署正常,且通过命名过滤可精准定位特定类型容器,便于后续管理与维护。

2.4 挂载临时文件系统(tmpfs)

2.4.1 挂载临时文件系统

  • 执行命令:docker run -d --name=nginx_tmp_docker --mount type=tmpfs,destination=/app nginx:latest

  • 结果说明 :执行命令成功启动名为 nginx_tmp_docker 的 Nginx 容器,并通过 --mount type=tmpfs,destination=/app 将内存中的临时文件系统挂载至容器的 /app 路径,实现数据仅存于内存、重启即清空的效果。容器运行正常,验证了 tmpfs 挂载方式的正确性与临时存储功能。

2.4.2 查看运行的容器

  • 执行命令:docker ps -a --filter "name=tmp"

  • 结果说明 :执行 docker ps -a --filter "name=tmp" 成功筛选出名称包含 "tmp" 的容器,显示 nginx_tmp_docker 正在运行(Up),映射 80/tcp 端口。验证了容器创建成功且命名过滤功能正常,表明临时存储类容器部署无误,系统可精准定位并管理此类实例。

2.4.3 查看临时数据卷信息

  • 执行命令:docker inspect nginx_tmp_docker --format '{``{ json .Mounts }}' | jq .

  • 结果说明 :执行 docker inspect nginx_tmp_docker --format '{``{ json .Mounts }}' | jq . 成功提取并格式化容器的挂载信息,显示其使用 tmpfs 类型挂载,目标路径为 /app,源为空(内存中),读写权限开启。验证了临时文件系统挂载配置正确,数据仅存于内存,重启即清空,适用于临时存储场景。

2.5 数据卷容器

2.5.1 新建数据卷容器

  • 执行命令:docker run -it -v /dbdata --name db_data alpine:3.19
  • 结果说明 :执行命令成功启动名为 db_data 的 Alpine 容器,并通过 -v /dbdata 将宿主机的 /dbdata 目录挂载至容器根目录,实现数据共享。容器以交互模式运行,终端进入 shell 环境,验证了绑定挂载配置正确,可用于数据库等持久化场景的数据存储与管理。
  • 执行命令:ll,查看挂载目录dbdata
  • 执行命令:cd dbdata
  • 执行命令:echo "I Love Docker World~" > love.txt
  • 执行命令:cat love.txt
  • 执行命令:exit

2.5.2 共享数据卷容器

  • 执行命令:docker run -it --volumes-from db_data --name test_db_data alpine:3.19
  • 结果说明 :执行命令成功启动名为 test_db_data 的 Alpine 容器,并通过 --volumes-from db_data 从源容器 db_data 继承其数据卷挂载配置。容器以交互模式运行,进入 shell 环境,验证了数据卷共享机制有效,实现了多个容器间共享同一数据存储,适用于数据库备份、迁移等场景。
  • 执行命令:ls,查看是否继承了源容器db_data的数据卷挂载目录
  • 执行命令:cd dbdata
  • 执行命令:cat love.txt
  • 执行命令:exit

5.3 数据迁移

5.3.1 备份数据卷

  1. 创建容器dbstore1,备份数据卷

    • 执行命令:docker run -v /dbdata --name dbstore1 ubuntu /bin/bash,进入容器后,执行命令:ls
    • 结果说明 :执行命令成功启动名为 dbstore1 的 Ubuntu 容器,通过 -v /dbdata 将宿主机的 /dbdata 目录挂载至容器内,实现数据持久化。容器以交互模式运行并进入 bash 环境,验证了绑定挂载配置正确,可安全用于数据库等需要共享存储的应用场景。
    • 执行命令:cd dbdata
    • 执行命令:echo "Weclome to Docker World~" > welcome.txt
    • 执行命令:exit
  2. 新建容器,从dbstore1上挂载数据卷,挂载到本地目录,然后打包备份

    • 执行命令:docker run --rm --volumes-from dbstore1 -v "$(pwd)":/backup ubuntu tar zcvf /backup/backup.tar.gz /dbdata

    • 结果说明 :命令成功执行,将 dbstore1 容器中挂载的 /dbdata 目录打包为 backup.tar.gz,并保存到宿主机当前目录。tar 提示"Removing leading '/'"属正常行为,表示已去除绝对路径前缀以避免解压时覆盖系统文件,备份文件已生成,验证了基于 --volumes-from 的数据卷备份机制有效。

    • 执行命令:ll backup.tar.gz

5.3.2 还原数据卷

  1. 新建容器dbstore2,恢复备份好的数据卷
    • 执行命令:docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
  2. 解压gz包,释放到对应目录
    • 执行命令:docker run --rm --volumes-from dbstore2 -v "$(pwd)":/backup ubuntu bash -c "cd /dbdata && tar zxvf /backup/backup.tar.gz --strip 1"
    • 结果说明 :命令成功执行,通过 --volumes-from dbstore2 挂载数据卷,并将宿主机当前目录挂载为容器内 /backup。进入容器后切换至 /dbdata 目录,解压 backup.tar.gz 文件并使用 --strip 1 去除路径前缀,实现备份文件的正确还原,验证了跨容器数据恢复流程的有效性。
  3. 新建临时容器,验证数据是否恢复
    • 执行命令:docker run -it --rm --volumes-from dbstore2 ubuntu /bin/bash
    • 执行命令:cat dbdata/welcome.txt
    • 结果说明 :通过创建临时容器并使用 --volumes-from dbstore2 挂载其数据卷,成功进入容器环境。执行 cat /dbdata/welcome.txt 查看文件内容,输出为 "Welcome to Docker World!",验证了备份数据已正确恢复至 /dbdata 目录,说明数据持久化与恢复流程完整有效。

3. 实战总结

  • 本次实战全面掌握了 Docker 的四种数据管理方式:普通数据卷适用于容器间持久化共享;绑定挂载便于开发调试与宿主机文件同步;tmpfs 适合敏感或临时数据;数据卷容器则为数据库等场景提供解耦的数据存储方案。通过 --volumes-from 成功实现跨容器数据备份与恢复,验证了 Docker 在数据生命周期管理中的灵活性与可靠性。同时,结合 docker volume 命令与宿主机路径检查,确保了数据存储的可见性与可控性。整个流程体现了容器化应用中"计算无状态、数据有持久"的最佳实践,为生产环境的数据安全与迁移奠定了坚实基础。
相关推荐
H²D2 小时前
真!docker离线部署GLPI资产管理系统
docker·容器·webview
susu10830189112 小时前
ubuntu系统删除 Docker 启动的所有容器、卸载 Docker 以及清理 Docker 相关保留路径
ubuntu·docker·eureka
南山nash2 小时前
docker存储卷详解
运维·docker·容器
幺零九零零2 小时前
Docker底层-Cgroup
运维·docker·容器
卜锦元2 小时前
Golang后端性能优化手册(第四章:异步处理与消息队列)
开发语言·后端·docker·容器·性能优化·golang·团队开发
不学懂K8S不改名2 小时前
docker可视化工具(Portainer)
运维·docker·容器
我爱学习好爱好爱2 小时前
Docker Compose 一键部署 Prometheus + Alertmanager + Grafana 完整监控方案
docker·grafana·prometheus
阿郎_20113 小时前
window10的wsl安装配置ubuntu22.04和docker
运维·windows·ubuntu·docker·容器
小汐睡着了3 小时前
Docker镜像源-error
运维·docker·容器