容器中的volume卷

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本实验介绍了容器中Volume卷的挂载和使用

容器中的volume卷


1. 创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息

2. Volume挂载简介

在上面的实验中我们为大家介绍了如何在容器中挂载文件和文件夹,这种采用绝对路径,直接挂载宿主机中的文件或者文件夹的方法又叫bind mount。这种方式比较适合将宿主机中的文件共享到容器中的场景。

除此之外docker还提供了另一种volume的方式进行挂载。这种方式通常会先在宿主机中通过docker volume命令创建一个具有名称的volume,然后再将这个volume挂载到容器中。

相比较于bind mount方式,这种方式在使用的时候完全使用docker命令,并不需要向bing mount方式那样依赖于宿主机的绝对目录,主要用于将容器中的数据持久化保存到宿主机中。

  1. 创建volume

在使用volume之间,通常需要先通过docker volume create命令创建volume。该命令的格式为docker volume create [volume名],和bind mount方式不同的是,volume创建之后默认并没有内容。这里我们创建名为file-vol的volume

docker volume create file-vol
  1. 挂载volume

在volume创建好之后,我们就可以通过docker run 的-v参数进行挂载。在使用-v参数挂载volume时,用volume名称代替宿主机路径即可。这里我们创建并启动一个busyboxy容器,并将file-vol挂载到/file目录。

在容器创建之后,我们向volume挂载的文件夹中写入一个文件/file/text。验证挂载成功。

docker run -itd --name vol1 -v file-vol:/file busybox
docker exec vol1 sh -c "echo '向volume中写入文件' > /file/text"
docker exec vol1 ls /file
docker exec vol1 cat /file/text

  1. 查看volume信息

当我们在容器的挂载点中保存数据之后,数据文件会被写入到volume中,这时我们可以通过docker volume inspect或者docker inspect来查看volume的信息。

docker volume inspect file-vol

3. Volume的持久化

在上一个小节中我们介绍了volume的基本用法。在容器中我们使用volume的主要作用,是为容器中的文件提供一种持久化的保存方法。

在前面讲解容器基本用法的时候,我们了解到每一个容器都是一个轻量级的虚拟机,在容器中创建的文件和宿主机以及其他容器并没有关系。如果容器被删除了,那么容器上的文件也就都丢失了。但是在某些情况下,我们在容器中存放了有价值的文件,比如数据库,邮件服务器,文件备份等。这个时候我们就希望能有一种即使容器被销毁了文件还可以存在的技术。这就是volume持久化的由来。

  1. 删除容器

接下来我们来验证volume的持久化能力。我们停止并删除刚才创建的容器vol1。在删除之后我们查看名为file-vol的volume。我们会发现容器的删除并不会影响volume的存在。

docker stop vol1
docker rm -f vol1
docker volume inspect file-vol

  1. 重用volume

然后我们再创建一个新的容器vol2,并将file-vol挂载到另一个目录/file-other上。由于之前的容器把数据存储在了volume中,因此新容器中的/file-other目录中保存vol1容器中的数据。

docker run -itd --name vol2 -v file-vol:/file-other busybox
docker exec vol2 ls /file-other
docker exec vol2 cat /file-other/text

  1. volume的多重绑定

如同容器可以使用多个端口绑定,容器在启动时也可以使用多个-v参数绑定多个volume,同时一个volume也可以同时绑定到多个容器中。在容器绑定volume之后,我们还可以通过docker inspect命令通过容器筛选Mounts字段查看volume的信息。

docker volume create ext-vol
docker run -itd --name vol3 -v ext-vol:/ext -v file-vol:/file busybox 
docker inspect -f "{{json .Mounts}}" vol3 | jq

4. Volume的常用命令

在前面的小节中我们学习了volume的持久化,本小节我们再来学习一下volume相关的一些1命令

  1. 查看整体磁盘占用

在docker中,占用磁盘的对象包括容器镜像,容器,volume等,我们还可以通过docker system df -v命令可以查看所有对象的的磁盘占用。

如果docker的镜像,容器,或者volume对象较多,则可以使用-f参数添加过滤器来筛选具体某一个volume的信息。下面的命令可以筛选出名为file-vol的volume的过滤器的信息。

docker system df -v
docker system df -v --format=\
'{{range .Volumes}}{{if eq .Name "file-vol"}}\
{{.Name}} - {{.Size}}\n{{end}}{{end}}'

  1. 自动创建volume

当我们使用docker run 创建容器并使用-v挂载volume的时候,如果需要加载的volume还没有被创建,则docker run会自动创建volume。

docker run -itd --name vol4 -v auto-vol:/auto busybox 
docker inspect auto-vol

  1. volume的自动删除

docker也提供了删除所有当前没有被挂载的volume的指令docker volume prune,需要注意的是使用此指令时需要小心,防止数据被误删除!下面的代码可以删除全部的容器,并清空所有的volume。下面的例子我们演示了删除所有的容器,并且删除所有的volume

docker rm -f $(docker ps -aq) 
docker volume prune -a
docker volume ls

5. 在MySQL中使用Volume

上面的小节中,我们学习了volume的相关知识,本小节中我们来演示一个通过volume管理MySQL容器的例子。

  1. volume的自动创建

事实上当我们在使用docker run -v 创建数据挂载时,如果没有预先创建volume,docker会自动创建对应的volume,如果用户连volume名称都没有指定,docker会自动为volume分配名称。

接下来我们直接创建名为mysql1的mysql容器,在容器创建成功后接入mysql控制台。

docker run -itd --name mysql1 -v db-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=[MYSQL密码] mysql
docker exec -it mysql1 mysql -uroot -p
[MYSQL密码]

  1. 操作数据库

在一个MySQL服务中,可以包含多个数据库,每一个数据库中又可以包含多个数据表。每一个数据表中又可以包含多个数据行。

接下来我们再控制台中通过CREATE DATABASE创建一个新数据库ali_db,创建数据库之后需要通过USE命令选中要操作的数据库,然后通过CREATE TABLE命令在ali_db中添加一个数据表ali_tab,接下来使用INSERT INTO在数据表中添加一条记录。最后使用SELECT命令查询数据表中的记录。

CREATE DATABASE ali_db;
USE ali_db;
CREATE TABLE ali_tab (`name` VARCHAR(100));
INSERT INTO ali_tab VALUES('aliyun');
SELECT * FROM ali_tab;
exit

  1. 重用MySQL数据库

接下来我们删除mysql1容器,删除之后在创建另一个名为mysql2的mysql容器。mysql2容器创建成功后进入mysql控制台,在控制台中通过USE命令选择数据库,然后用SELECT命令查看数据记录。会发现数据库中记录仍存存在。

docker rm -f mysql1
docker run -itd --name mysql2 -v db-vol:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=abc123456 mysql
docker exec -it mysql2 mysql -uroot -p
[MYSQL密码]

USE ali_db;
SELECT * FROM ali_tab;
exit

实验地址:https://developer.aliyun.com/adc/scenario/d1f14afe76224e4caa40df04c359b994

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
关系型数据库 MySQL 数据库
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
201 0
|
存储 Kubernetes 应用服务中间件
k8s教程(pod篇)-容器共享volume
k8s教程(pod篇)-容器共享volume
208 0
|
Linux Docker 容器
Docker Review - 使用docker volume数据卷实现容器内的数据与宿主机同步
Docker Review - 使用docker volume数据卷实现容器内的数据与宿主机同步
275 0
|
存储 Kubernetes 前端开发
Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
769 0
|
Linux Docker 容器
docker挂载volume的用户权限问题,理解docker容器的uid
docker挂载volume的用户权限问题,理解docker容器的uid目录遇到的问题原因容器共享宿主机的uid如果不指定user,容器内部默认使用root用户来运行容器内部用户的权限与外部用户相同一定要确保容器执行者的权限和挂载数据卷对应一个更加明显的demo参考docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题。
2686 0
|
Docker 容器
Docker中未指定挂载点容器间volume卷的数据共享
一 背景 在实际使用过程中,我们可能会经常遇到容器间数据共享的情况,怎么处理呢?通过 docker 命令中的一些选项,我们即可完成容器间的数据共享。 二 实验步骤 2.1 创建容器 容器一:gysl-1 [root@dev ~]# docker run -it --rm --name gysl-1.
1266 0
|
Web App开发 Docker 容器
volume 方式使用 Secret - 每天5分钟玩转 Docker 容器技术(157)
本节讨论如何以 volume 方式使用 secret。
1719 0
|
Kubernetes Docker 容器
hostPath Volume - 每天5分钟玩转 Docker 容器技术(148)
hostPath Volume 将 Docker Host 文件系统的目录 mount 到 Pod 的容器。
2080 0
|
Ubuntu 测试技术 Shell
提升Docker效率的小操作——用volume实现容器和主机之间共享数据 [转载]
对于Docker来说,创建一个容器实际上非常简单:您只需要拉取一个镜像,并将其部署成容器就可以了。但是这个容器该如何保存数据呢?换言之,您要如何处理这些数据呢?又或者说,您要如何在容器之间共享这些数据呢?
2887 0