Docker 入门教程(七):容器数据卷

文章目录

  • Docker 入门教程(七):容器数据卷
    • 一、为什么需要数据卷?
    • 二、三种挂载方式
    • 示例:MySQL 数据持久化
    • 三、数据卷容器模式(旧式技术)

Docker 入门教程(七):容器数据卷


一、为什么需要数据卷?

容器默认的写层具有两个关键缺点:

  • 不持久:容器一旦被删除,数据也随之丢失
  • 不可共享:每个容器的数据互相隔离

为了解决这个问题,Docker 提供了数据卷(Volume)机制,将数据从容器中解耦出来,形成独立、持久、可复用的数据存储空间。


二、三种挂载方式

类型 命令示例 挂载路径(宿主机) 特点 推荐场景
匿名卷 -v /data /var/lib/docker/volumes/<随机ID> 无需管理、自动创建,易失 临时数据
具名卷 -v myvolume:/data /var/lib/docker/volumes/myvolume/_data 可复用、可管理、自动创建 持久存储
绑定挂载 -v /host/path:/data 指定宿主机目录 显式路径、高灵活、强耦合 本地开发、配置挂载、热更新
  1. 匿名卷
docker run -v /data busybox
  • 容器内部路径为 /data
  • Docker 自动为它分配一个 volume ID,并挂载在宿主机 /var/lib/docker/volumes/
  • 无法通过名字复用,容器删了就不再容易访问
  1. 具名卷
docker volume create mydata
docker run -v mydata:/data busybox
  • 创建并挂载一个名字叫 mydata 的卷
  • 卷数据存放在 /var/lib/docker/volumes/mydata/_data/
  • 即使容器删除,数据仍然保留,可被其他容器复用
  1. Bind Mount(绑定挂载)
docker run -v $(pwd)/html:/usr/share/nginx/html nginx
  • 将宿主机当前目录下的 html 目录,映射进容器内的 Nginx 静态文件目录
  • 数据实时同步,适合开发联调
  • 不推荐在生产环境使用(权限 & 路径耦合问题)
容器路径 /data

匿名卷      → /var/lib/docker/volumes/<随机ID>/_data
具名卷      → /var/lib/docker/volumes/myvolume/_data
绑定挂载    → /home/user/mydata  (由你决定)

示例:MySQL 数据持久化

默认情况下,运行 MySQL 容器时数据保存在容器写层中,容器删除后数据也会丢失。

示例:具名卷持久化数据库

docker volume create mysql-data

docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:5.7
  • 数据将保存在卷 mysql-data
  • 容器删除后,数据仍保留在 /var/lib/docker/volumes/mysql-data/_data

验证数据:

docker exec -it mysql mysql -uroot -p123456

三、数据卷容器模式(旧式技术)

在 Docker Compose 出现前,数据卷容器是一种用于数据共享的经典方法。

原理

使用一个专门的容器来管理卷,再让其他容器通过 --volumes-from 挂载它的卷。

示例:

# 创建数据卷容器
docker create -v /data --name datacontainer busybox

# 在其他容器中挂载它的卷
docker run --volumes-from datacontainer busybox ls /data

特点:

  • 数据容器本身无需运行(create 即可)
  • 可集中管理卷
  • 不推荐新项目使用(已被具名卷 + Compose 替代)

你可能感兴趣的:(Docker(for科研er),docker,java,eureka)