一文详解Docker数据卷(volume)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一文详解Docker数据卷(volume)

基本介绍

docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了。而且,如果不进行数据卷挂载的话,对容器配置文件进行修改需要进入容器内部修改,十分麻烦,我们对容器为了能够保存数据并且方便修改,在docker容器中使用卷。

卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点。

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录,它们的修改是双向同步的,类似于vue中的双向绑定。多个容器也可以绑定到相同的数据卷目录上

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

两个作用:

  • 持久化数据
  • 共享数据

一个特点:

  • 即时生效
  • 卷的更新不影响镜像
  • 即使容器停止或被删除,卷默认也一致存在

数据卷操作命令

数据卷操作的基本语法:

docker volume [COMMAND]

语法解析:docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作

文档中提供的COMMAND有5个:

  •    create 创建一个数据卷(volume)
  •    inspect 显示一个或多个数据卷(volume)的信息
  •    ls 列出所有的数据卷(volume)
  •    prune 删除全部未使用的数据卷(volume)
  •    rm 删除一个或多个指定的数据卷(volume)

创建数据卷

docker volume create 数据卷名称
# 示例:
docker volume create html

查看数据卷创建数据卷

docker volume ls

查看数据卷详细信息

docker volume inspect 数据卷名称
# 示例:
docker volume inspect html

删除全部未使用的数据卷

docker volume prune 数据卷名称
# 示例:
docker volume prune html

删除一个或多个指定的数据卷

docker volume rm  数据卷名称
# 示例:
docker volume rm  html

注意:所有docker容器内的卷,没有指定目录的情况下在/var/lib/docker/volumes/xxxx/_data

数据卷挂载

容器挂载数据卷时,数据卷可以存在也可以不存在,数据卷不存在的话,会自动去创建数据卷。

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:

docker run \
  --name mn \
  -v html:/root/html \
  -p 8080:80
  nginx \

这里的-v就是挂载数据卷的命令:

  • -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中

以修改Nginx主页内容为例:

第一步: 创建容器并挂载数据卷到容器内的HTML目录

# 解释部分
                  # \是命令换行符 
docker run \            # 创建并运行一个容器
  --name myNginx \          # 给容器个名字叫myNginx
  -v html:/usr/share/nginx/html \ # 把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中
  -p 80:80 \            # 把宿主机的80端口映射到容器内的80端口
  -d \                # 后台运行
  nginx \;              # 需要启动的镜像名称
# 可直接复制部分   
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

第二步:查看数据卷所在的位置

docker volume inspect html            # 查看html数据卷,指向的宿主机中的具体文件夹位置

此时html数据卷的Mountpoint就已经指向宿主机的/var/lib/docker/volumes/html/_data目录。

第三步:在宿主机中进入html数据卷所在位置,并修改HTML内容

# 进入Mountpoint指向的目录
cd /var/lib/docker/volumes/html/_data
# 修改Nginx主页的index.html文件
vi index.html

注意点:

  • 一个容器可以挂载多个目录,一个目录也可以被多个容器挂载。
  • 如果创建容器时忘记挂载,是无法再去挂载数据卷的。只能删除容器,再创建新容器时挂载数据卷。

   覆盖关系:

  • 数据卷中没有文件时,会将容器目录中的文件挂载到数据卷中。
  • 数据卷中有文件时,会将数据卷中的文件覆盖容器目录中的文件。

本地磁盘挂载 (直接挂载模式)

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

  • 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
  • 直接挂载模式:宿主机目录 ---> 容器内目录

磁盘挂载的语法:

# 语法方面其实也就只有-v 参数有区别,其它都是没区别的
# 注意:宿主机文件挂载容器内文件的操作,使用数据卷是做不到的
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]    

在这里我们演示使用磁盘挂载MySql的数据保存目录和MySql的配置文件。

第一步、拉取镜像

docker pull mysql:5.7.25

第二步:准备宿主机中的文件目录

myLocal.cnf# -p 创建多级目录
mkdir -p /mysql/data  # 创建存放mysql数据的目录
mkdir -p /mysql/conf  # 创建存放mysql配置文件的目录
cd /mysql/conf      # 进入/mysql/conf目录
touch myLocal.cnf   # 创建本地mysql配置文件,这个文件名称可以自定义

第三步:进行挂载

docker run \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -p 3306:3306 \
  -v /mysql/conf/myLocal.cnf:/etc/mysql/conf.d \
  -v /mysql/data:/var/lib/musql \
  -d \
  mysql:5.7.25
docker run \                     # 创建并运行一个容器
  --name mysql \                   # 给容器个名字叫mysql
  -e MYSQL_ROOT_PASSWORD=root \          # 设置mysql登录,密码为root
  -p 3306:3306                   # 把宿主机3306端口和容器的3306端口相关联
  -v /mysql/conf/myLocal.cnf:/etc/mysql/conf.d \ # 宿主myLocal.cnf文件挂载到容器conf.d文件
  -v /mysql/data:/var/lib/musql \          # 宿主data目录挂载到容器mysql目录
  -d \                       # 后台运行
  mysql:5.7.25                   # 需要启动的镜像名称

数据卷挂载和磁盘挂载的优缺点

数据卷挂载方式:使用数据卷挂载的方式,Docker会自动在宿主机上帮我们创建数据卷对应的真实目录。容器挂载时只需要挂载到数据卷上,而不用关心数据卷指向的真实目录在哪里。即使将来容器被删除了,数据卷中或者宿主机挂载到容器的目录中的内容是不会随着容器的删除而丢失的。

  • 优点:这种方式相当于把挂载全部交给Docker本身处理,方便快捷。
  • 缺点:真实挂载目录由Docker生成,目录较深,不方便查找。

磁盘挂载方式:直接挂载到宿主机目录上,不再有中间的数据卷,而是容器和宿主机的直接交互。

  • 优点:目录和文件更好找也更好维护,并且能直接把目录或者文件挂载到容器上。
  • 缺点:目录和文件需要我们自行创建和维护。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
66 5
|
17天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
56 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
7天前
|
关系型数据库 数据管理 应用服务中间件
【赵渝强老师】Docker的数据持久化
在生产环境中使用Docker时,为了实现数据的持久化和共享,可以通过数据卷(Data Volumes)和数据卷容器(Data Volume Containers)两种方式来管理数据。数据卷是一个独立于容器的挂载目录,可以跨多个容器共享和重用。数据卷容器则是一种特殊容器,用于维护数据卷,便于数据迁移和共享。本文通过示例详细介绍了这两种方法的使用步骤。
|
21天前
|
Docker 容器
docker中查看已创建的数据卷
【10月更文挑战第16天】
34 3
|
21天前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
23 2
|
21天前
|
Docker 容器
docker中创建命名数据卷
【10月更文挑战第16天】
15 2
|
22天前
|
存储 JSON 数据格式
docker中查看数据卷
【10月更文挑战第15天】
15 2
|
22天前
|
存储 Docker 容器
docker中使用命名数据卷
【10月更文挑战第15天】
12 2
|
22天前
|
存储 Docker 容器
docker中创建命名数据卷
【10月更文挑战第15天】
24 2
|
23天前
|
存储 Docker 容器
docker中挂载现有目录作为数据卷
【10月更文挑战第14天】
15 1