Docker数据卷(Volume)

这篇具有很好参考价值的文章主要介绍了Docker数据卷(Volume)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker数据卷(Volume)

一、数据卷概念

数据卷是宿主机中的一个目录或者文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。

一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

简单来说,数据卷本质其实是共享文件夹,是宿主机与容器之间数据共享的桥梁。

数据卷的作用:

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。

二、数据卷的配置方式

1、语法格式
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
  • 目录必须是绝对路径
  • 如果宿主机目录不存在,会自动创建
  • 可以挂载多个数据卷(直接继续跟 -v 参数)
#在创建启动容器时挂载数据卷
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
aba73cea46edcd2a30c7a5ba7d782b3c263270f9281684084fff878b00d9b42d

可以在宿主机挂载的目录中创建一个文件或者目录,然后进入容器内查看是否同步数据。

2、挂载方式
  • 匿名挂载:-v 容器内路径
  • 具名挂载:-v 数据卷名:容器内路径
  • 指定路径挂载:-v /宿主内路径:容器内路径

说明:匿名挂载只需要填写容器内路径,Docker 会默认帮我们创建匿名数据卷进行映射和挂载。一般使用具名挂载和指定路径挂载。具名挂载会在 /var/lib/docker/volumes/ 目录下创建对应的数据卷目录;而匿名挂载生成的目录名则是随机的。

#指定路径挂载
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
#具名挂载
[root@localhost opt]# docker run -id --name test1 -v my_data:/root/test_data centos:7 /bin/bash
[root@localhost opt]# docker volume inspect my_data
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
        "Name": "my_data",
        "Options": {},
        "Scope": "local"
    }
]

#查看已有的容器数据卷
[root@localhost opt]# docker volume ls
DRIVER              VOLUME NAME
local               6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local               a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local               e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local               my_data
local               test
#匿名挂载
[root@localhost opt]# docker run -id --name test3 -v /root/test_data centos:7 /bin/bash
c7bd0c7aa231847042cac9c4ef827b3bbd281144e79f230f9c30b1d8d52a3e5f
[root@localhost opt]# docker volume ls
DRIVER              VOLUME NAME
local               4ee1d7e862c36848a7ab57af9dd79c0577e46c4545a05b70dd96203466d27303
local               6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local               a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local               e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local               my_data
local               test
[root@localhost opt]# docker volume inspect 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f/_data",
        "Name": "6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f",
        "Options": {},
        "Scope": "local"
    }
]
3、volume 的基本使用

docker volume 命令:

  • create:创建数据卷
  • inspect:查看数据卷元数据
  • ls:查看数据卷列表
  • prune:删除所有未使用的卷
  • rm:删除数据卷
#创建一个自定义容器
[root@localhost opt]# docker volume create my_data
#查看所用容器卷
[root@localhost opt]# docker volume ls
#查看指定容器卷信息
[root@localhost opt]# docker volume inspect
#删除容器卷
[root@localhost opt]# docker volume rm
4、MySQL数据卷挂载实战

1)搜索和下载镜像的步骤就省去了

2)创建启动镜像

[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
8bace46562e55239fe7689b638be1eabaf416cc0c3093e009feac292af0779ca

3)进行验证,我们先进入容器创建一个新的数据库以及表,再插入一条数据,然后退出容器

[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> use test;
Database changed

mysql> create table t_test(id int,name varchar(255));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_test values(1,"huhai");
Query OK, 1 row affected (0.06 sec)

mysql> select * from t_test;
+------+-------+
| id   | name  |
+------+-------+
|    1 | huhai |
+------+-------+
1 row in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit

4)然后我们将这个容器给停止之后删除,再创建一个相同路径的数据卷进行挂载,查看是否有我们已经有的数据

[root@localhost opt]# docker stop my_mysql
my_mysql
[root@localhost opt]# docker rm my_mysql
my_mysql
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
e208b09a924d9849b2f4cca225e3d51ac59f00f1ee64f11b2ba134183f170c76
[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test;
Database changed

mysql> select * from t_test;
+------+-------+
| id   | name  |
+------+-------+
|    1 | huhai |
+------+-------+
1 row in set (0.00 sec)

mysql> exit
Bye
bash-4.2# exit
exit

三、迁移与备份

​ Docker 实际应用中,我们会安装很多容器,然后进行配置。试想一下,一台 Linux 服务器的容器怎么转移到另一台 Linux 服务器?这就涉及到了迁移与备份,我们可以将容器先保存为镜像,然后将镜像保存为压缩包,其他地方需要时可以将这个压缩包转回镜像。大概分为以下三种情况:

  • 将开发环境下的 Docker 中对应的容器持久化为镜像
  • 将镜像保存为一个压缩包,发送到生产环境服务器中
  • 生产环境中需要将压缩包–>镜像–>容器
1、容器保存为镜像

1)命令:docker commit

2)作用:将容器保存为镜像

3)语法格式:docker commit 容器名称(或容器ID) 镜像名称:镜像标签

如果不写镜像标签则默认为 latest

[root@localhost opt]# docker commit my_mysql my_mysql:1.0
sha256:1f381fd1b9c929034e5f454e005b0a74535cbcce5406b7b8ea6c8e218ae11886
[root@localhost opt]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
my_mysql                1.0                 1f381fd1b9c9        6 seconds ago       495 MB
docker.io/tomcat        latest              1dad8c5497f9        4 weeks ago         474 MB
docker.io/mysql         5.7                 d410f4167eea        5 weeks ago         495 MB
docker.io/openjdk       8                   b273004037cc        5 months ago        526 MB
docker.io/hello-world   latest              feb5d9fea6a5        15 months ago       13.3 kB
docker.io/centos        7                   eeb6ee3f44bd        16 months ago       204 MB
2、镜像保存为tar包

1)命令:docker save

2)作用:将镜像保存为 tar 包

3)语法:docker save -o tar包名 镜像名称(或镜像ID)

-o 代表输出到的文件

可以指定tar包的路径,即在tar包前面加路径

镜像后面可以跟镜像标签

#不加路径则默认在当前路径下创建tar包
[root@localhost opt]# docker save -o my_mysql.tar my_mysql
[root@localhost opt]# ll
总用量 900220
......
-rw-------  1 root root 510828544 112 10:45 my_mysql.tar
drwxr-xr-x  4 root root      4096 111 17:44 mysql
......
#加对应路径
[root@localhost opt]# docker save -o ~/my_mysql2.tar my_mysql
[root@localhost opt]# ll ~
总用量 498904
......
-rw-------  1 root root 510828544 112 10:48 my_mysql2.tar
drwxr-xr-x. 2 root root      4096 1216 16:28 公共
......
3、tar包恢复为镜像

1)命令:docker load

2)作用:恢复镜像

3)语法:docker load -i tar包

-i 代表指定导入的文件文章来源地址https://www.toymoban.com/news/detail-713331.html

#首先删除创建的容器
[root@localhost opt]# docker rm my_mysql 
my_mysql
#然后删除刚才备份的镜像
[root@localhost opt]# docker rmi my_mysql:1.0
#通过tar包恢复镜像
[root@localhost opt]# docker load -i my_mysql.tar 
bd3382c8b69e: Loading layer [==================================================>] 10.75 kB/10.75 kB
Loaded image: my_mysql:1.0
#创建启动容器
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 my_mysql:1.0
1fb2a85039f89050d8c85c2edb34032a0633e927a38b3a6bcaef7c3949ee0f68

到了这里,关于Docker数据卷(Volume)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows下docker compose方式挂载数据卷volume遇到的问题

    例子一,windows 下docker desk top部署TDengine td-compose.yml 运行docker-compose 问题1: 配置文件映射卷,但没有自己生成配置文件反而报错。 解决方案:bind mount直接挂载目录的方式必须将配置文件先复制下来宿主机,因为它是按宿主机文件同步。 问题2: 部署后出现UDF一直提示重启

    2024年02月10日
    浏览(25)
  • Docker数据管理之三种方式- 数据卷(Volumes)- 挂载主机目录(Bind mounts)- 数据卷容器(Data Volume Containers)

    文章主人公:帅哥BUG😎 文章路人: 路人  🤨   路人  😛 😎: docker在容器中管理数据主要有三种方式哦~ 🤨:  啊!,我记得docker在容器中管理数据主要方式是这两种吧  - 数据卷(Volumes) - 挂载主机目录(Bind mounts)      😛:  额,主要的方式是这两种?我怎么记得是这

    2024年02月05日
    浏览(54)
  • docker学习(六)卷Volume

    docker学习(一)docker 概述 docker学习(二)docker 安装部署 docker学习(三)常用命令 docker学习(四)使用 commit 制作镜像 docker学习(五)使用 Dockerfile 制作镜像 docker学习(六)卷 Volume docker学习(七)docker daemon docker学习(八)HTTP/HTTPS 代理 docker学习(九)docker 调试 docker学习

    2024年02月12日
    浏览(28)
  • docker 的volume 是个什么概念

    在Docker中,Volume(卷)是一种用于在容器和主机之间共享和持久化数据的机制。Volumes允许在容器之间或容器与主机之间共享文件,并且数据在容器的生命周期中是持久的。这是因为容器的文件系统是临时的,容器被删除后文件系统中的数据也会被清除,而Volume提供了一种解决

    2024年02月22日
    浏览(31)
  • Docker Volume - 目录挂载以及文件共享

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数

    2024年02月20日
    浏览(32)
  • Docker Volume 看这一篇就够了

    默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着: 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。 容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。 写入容

    2024年02月02日
    浏览(78)
  • 解析Docker与docker-compose中volume参数的使用

    目录 数据卷Volume的概念 数据挂载的实现方式 宿主机路径挂载在docker/docker-compose中的使用 卷标映射挂载在docker/docker-compose中的使用 A.匿名挂载 B.具名挂载 参考文献: 在docker内有个“数据卷持久化”的概念,也就是我们常说的“数据挂载”。它的作用是,将宿主机上的数据与

    2024年02月01日
    浏览(33)
  • Dockers数据卷Volume

    在 Docker 中,数据卷(Volume)是一种持久化存储数据的方法,可以在容器和主机之间共享数据,并且可以保持数据的持久性。使用数据卷可以方便地将数据从一个容器传递到另一个容器,也可以使得容器中的数据在容器删除后仍然保留。 以下是一个详细的示例代码,展示如何

    2024年04月28日
    浏览(22)
  • 【博客609】docker volume挂载本机文件出现不同步的问题解决

    docker volume挂载本机文件,在宿主机修改文件之后,容器内部不会同步生效,没有发生对应的修改,需要重启容器才可以正常同步。 启动一个busybox容器,挂载一个测试文件: 在容器里查看文件内容: 修改宿主机上的文件: 在 docker 里面查看是否发生同步修改: 发现我们在外

    2023年04月12日
    浏览(65)
  • 14.3.4 【Linux】使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

    想像一个情况,你有个目录未来会使用到大约 5T 的容量,但是目前你的磁盘仅有 3T,问题是,接下来的两个月你的系统都还不会超过 3T 的容量, 不过你想要让用户知道,就是他最多有 5T 可以使用就是了!而且在一个月内你确实可以将系统提升到 5T 以上的容量! 你又不想要

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包