由来

Docker 是将应用和环境打包成一个镜像。

这样,数据就不应该保存在容器中,否则容器删除,数据就会丢失,有着非常大的风险。

为此,容器和主机之间需要有一个数据共享技术,使得在 Docker 容器中产生的数据能够同步到本地。

这就是数据卷技术。其本质上是一个目录挂载,将容器内的目录挂载到主机上。

使用

命令方式

语法:

docker run -v 主机目录:容器目录

查看主机 /home 目录:

[root@sail ~]# ls /home
admin f2 f3 sail test.java

以交互模式启动 centos 镜像:

docker run -it -v /home/ceshi:/home centos /bin/bash
[root@sail ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@ec95646b1a4c /]#

新开一个窗口查看容器详情:

Mounts 下的 Source 即为设置的主机目录、Destination 即为设置的容器目录,他们已经绑定在了一起。

在主机中查看 /home

[root@sail /]# cd /home
[root@sail home]# ls
admin ceshi f2 f3 sail test.java

主机上的 /home 下已经有了 ceshi 目录。说明容器一经启动,就会在主机生成对应的挂载目录。

在容器中的 /home 下新建一个文件:

[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
[root@ec95646b1a4c home]# touch test.java
[root@ec95646b1a4c home]# ls
test.java

查看主机的 ceshi 目录:

[root@sail home]# cd ceshi
[root@sail ceshi]# ls
test.java

此时主机中的 ceshi 目录下也有了这个文件。

关闭容器:

[root@ec95646b1a4c home]# exit
exit

修改主机中 /home/ceshi/test.java 文件的内容:

[root@sail ceshi]# vim test.java
# 此处编辑文件过程省略
[root@sail ceshi]# cat test.java
hello sail

重启容器:

docker start ec95646b1a4c
[root@sail ~]# docker start ec95646b1a4c
ec95646b1a4c
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec95646b1a4c centos "/bin/bash" 19 minutes ago Up 5 seconds charming_cartwright

查看 /home 下的文件:

docker exec -it ec95646b1a4c /bin/bash
[root@sail ~]# docker exec -it ec95646b1a4c /bin/bash
[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
test.java
[root@ec95646b1a4c home]# cat test.java
hello sail

此时容器中的文件也更改了。

由此可见,数据卷技术实现的是双向同步

权限设置

在使用命令方式设置卷时,还可以指定权限,以此保证数据安全。

参数:

  • ro(readonly):只读。
  • rw(readwrite):可读可写。

以数据卷只读权限启动镜像:

docker run -it -v /home/sail:/home:ro centos /bin/bash
[root@sail mysql]# docker run -it -v /home/sail:/home:ro centos /bin/bash

新建文件测试:

touch test.java
[root@02ef70c94920 home]# touch test.java
touch: cannot touch 'test.java': Read-only file system

容器内部该目录是没有写入权限的。

以数据卷可读可写的权限启动镜像:

docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz jdk-8u301-linux-x64.rpm test.java

新建文件测试:

docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz jdk-8u301-linux-x64.rpm test.java

容器内部该目录写入是没有问题的。

前面我们没有指定权限也可以写入,由此可见,数据卷默认是具有读写权限的。

具名挂载

启动镜像时只定义主机卷名称,不指定挂载目录:

docker run -it -v my-centos:/home centos /bin/bash
[root@sail mysql]# docker run -it -v my-centos:/home centos /bin/bash
[root@3cf74e9e6973 /]#

查看目前挂载的卷(使用 Ctrl + P + Q 不退出容器的情况下回到主机目录):

docker volume ls
[root@sail mysql]# docker volume ls
DRIVER VOLUME NAME
local my-centos

查看卷的详情:

docker volume inspect my-centos
[root@sail mysql]# docker volume inspect my-centos
[
{
"CreatedAt": "2021-12-20T16:55:35+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-centos/_data",
"Name": "my-centos",
"Options": null,
"Scope": "local"
}
]

卷挂载在 /var/lib/docker/volumes/卷名/_data 目录下。

在没有指定主机挂载目录的情况下,会默认挂载到该目录。

由于指定了卷名,所以这种方式称为具名挂载。

匿名挂载

启动镜像时只指定容器目录:

docker run -it -v /home centos /bin/bash
[root@sail mysql]# docker run -it -v /home centos /bin/bash

查看目前挂载的卷:

docker volume ls
[root@sail mysql]# docker volume ls
DRIVER VOLUME NAME
local 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940

查看卷的详情:

docker volume inspect 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940
[root@sail mysql]# docker volume inspect 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940
[
{
"CreatedAt": "2021-12-20T17:05:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940/_data",
"Name": "159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940",
"Options": null,
"Scope": "local"
}
]

卷也是挂载在 /var/lib/docker/volumes/xxx/_data 目录下。

在没有指定主机挂载目录的情况下,会默认挂载到该目录。

由于没有指定卷名,所以这种方式称为匿名挂载

只有指定主机目录的情况下会挂载到指定目录,否则都会挂载到默认目录

实战

mysql数据同步

数据库中的数据极为重要,必须同步到主机,否则将会有非常大的数据丢失风险。

这里以 mysql 镜像为例演示数据同步的过程。

启动 mysql 镜像:

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@sail ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
ffbb094f4f9e: Pull complete
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
c7b24c3f27af: Pull complete
6fc26ff6705a: Pull complete
bec5cdb5e7f7: Pull complete
6c1cb25f7525: Pull complete
Digest: sha256:d1cc87a3bd5dc07defc837bc9084f748a130606ff41923f46dec1986e0dc828d
Status: Downloaded newer image for mysql:5.7
a016e564d977550e475474556cfd033fb1c731002381bc9f9544c63fccb7f60c

其中 -e 为环境配置。安装启动 mysql 需要配置密码。

使用docker inspect查看挂载情况:

已经生成了两个目录的挂载。

查看主机同步的目录:

[root@sail ~]# cd /home
[root@sail home]# ls
admin ceshi f2 f3 mysql sail test.java
[root@sail home]# cd mysql
[root@sail mysql]# ls
conf data

主机已经同步了容器挂载的目录。

使用数据库管理工具连接测试(这里使用 IDEA 自带的数据库工具):


参考

https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0

https://www.bilibili.com/video/BV1kv411q7Qc?spm_id_from=333.999.0.0

版本

CentOS 7.6

Docker 20.10.11

Docker 11 数据卷的更多相关文章

  1. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  2. Docker学习笔记 - Docker的数据卷

    一.什么是数据卷? 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数据 ...

  3. docker基础---数据卷volumes

    1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...

  4. docker之数据卷管理

    转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...

  5. Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷(Data Volumes):容 ...

  6. docker定义数据卷及数据卷的备份恢复

    前言:生产环境中使用docker时,往往需要对数据进行持久化(只有把容器导出为镜像,才能够保存写的数据,否则容器删除或者停止,所有数据都会没有),或者需要在多个容器之间进行数据共享,这必然涉及容器的数 ...

  7. docker.[7] 数据卷容器

    docker.[7] 数据卷容器 挂在数据卷容器的方法: # docker run --volumes-from [Container Name]

  8. docker.[6] 数据卷

    docker.[6] 数据卷 操作指令: # docker run -v /data1:/data2 -i -t centos /bin/bash 参数说明: data1 : 这里指的是宿主机的目录( ...

  9. docker挂载数据卷

    1.Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷,简单的理解就是将数据持久化的工具. 2.在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们 ...

  10. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

随机推荐

  1. SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448

    SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...

  2. 第130篇:BOM(window对象)

    好家伙,本篇为<JS高级程序设计>第十二章"BOM"学习笔记   什么是BOM? BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种 ...

  3. Netty笔记(1) - Netty概述 和 框架结构

    概述 基于NIO 的框架,目的是简化开发NIO的工作量 异步的 ,基于事件驱动的网络应用程序框架,用以快速开发高性能.高可靠性的网络 IO 程序 Netty 是目前最流行的 NIO 框架,Netty ...

  4. RPA能否创造新业态?如何优化组织结构?如何助力疫情中的企业?

    RPA能否创造新业态?如何优化组织结构?如何助力疫情中的企业? 从<爱,死亡和机器人>探讨强人工智能时代的RPA发展 文/王吉伟 本周四,王吉伟频道参加了私域流量社群的一个直播活动. 活动 ...

  5. 如何获取拼多多推流码并使用OBS进行直播-疯狂URL

    简介 拼多多直播在PC端可以用多多视频|多多直播端进行开播,它的功能类似于常见的抖音直播助手和快手直播伴侣等等客户端.此教程测试时间 2023-7-12,第三方随时可能会升级,无法保证时效,建议不要升 ...

  6. matlab修改读取mat文件后的变量名

    代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...

  7. pod的拉取和重启策略

    在Kubernetes中,Pod的拉取策略和重启策略可以通过YAML配置文件来定义. Pod的拉取策略 Pod的拉取策略指的是Kubernetes在创建或重启Pod时,如何获取Pod所需的容器镜像.这 ...

  8. Python 动态网页Fetch/XHR爬虫——以获取NBA球员信息为例

    Python 动态网页Fetch/XHR爬虫--以获取NBA球员信息为例 动态网页抓取信息,一般利用F12开发者工具-网络-Fetch/XHR获取信息,实现难点有: 动态网页的加载方式 获取请求Url ...

  9. Python | Flask 解决跨域问题

    Python | Flask 解决跨域问题 系列文章目录 目录 系列文章目录 前言 使用步骤 1. 引入库 2. 配置 1. 使用 CORS函数 配置全局路由 2. 使用 @cross_origin ...

  10. epoll和ractor的粗浅理解

    我们继续上篇的文章继续更新我们的代码. 首先就是介绍一下epoll的三个函数. epoll_create epoll_ctl epoll_wait 如何去理解这3个函数,我是这样去理解这个函数, 就像 ...