Docker数据卷详解

news2024/9/23 19:25:37

文章目录

  • 数据卷
    • 1 cp命令
    • 2 数据卷
      • 2.1 数据卷类型
      • 2.2 宿主机数据卷
      • 2.3 命名的数据卷
      • 2.4 匿名数据卷
      • 2.5 清理数据卷
      • 2.6 数据卷容器

数据卷

​ 当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

​ 通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

​ 特点:1,数据卷可以在容器之间共享或重用数据;2, 数据卷中的更改可以立即生效;3,数据卷中的更改不会包含在镜像的更新中;4, 数据卷默认会一直存在,即使容器被删除;5, 数据卷的生命周期一直持续到没有容器使用它为止。

​ 容器中的管理数据主要有两种方式:

​ 数据卷:Data Volumes 容器内数据直接映射到本地主机环境

​ 数据卷容器:Data Volume Containers 使用特定容器维护数据卷

1 cp命令

​ **docker cp 😗*用于容器与宿主机之间的数据拷贝。使用的语法如下:

宿主机文件复制到容器内 
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH 
容器内文件复制到宿主机 
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

​ 将宿主机中的文件拷贝到容器中:

[root@localhost ~]# docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
602f3c3e2b27e0b678a43084b38af9bc7112b8f5118a2348998a20e76d329001
[root@localhost ~]# ll
总用量 4
-rw-------. 1 root root 1718 227 17:13 anaconda-ks.cfg
[root@localhost ~]# echo "this is copy to nginx" > index.html
[root@localhost ~]# docker cp index.html nginx:/usr/share/nginx/html/index.html

​ 访问http://192.168.43.106/发现页面内容已修改。

​ 将容器中的文件拷贝到宿主机中,下面是将nginx.conf拷贝到当前目录:

[root@localhost ~]# docker cp nginx:/etc/nginx/nginx.conf .
[root@localhost ~]# ls -lrt
总用量 12
-rw-r--r--. 1 root root  646 929 2020 nginx.conf
-rw-------. 1 root root 1718 227 17:13 anaconda-ks.cfg
-rw-r--r--. 1 root root   22 622 11:11 index.html

2 数据卷

​ 数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器。

​ 注意事项:

​ 挂载数据卷,最好是通过run而非create/start创建启动容器,create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以。docker官网推荐尽量进行目录挂载,不要进行文件挂载。

2.1 数据卷类型

​ 有三种数据卷类型:

​ 1,宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount);

​ 2, 命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。

​ 3,匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。

​ 数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,只是第一种是在宿主机内的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/。

2.2 宿主机数据卷

​ bind mounts:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统目录或文件中。除了docker之外的进程也可以任意对他们进行修改。

​ 当使用bind mounts时,宿主机的目录或文件被挂载到容器中。容器将按照挂载目录或文件的绝对路径来使用或修改宿主机的数据。宿主机中的目录或文件不需要预先存在,在需要的使用会自动创建。

​ 使用bind mounts在性能上是非常好的,但这依赖于宿主机有一个目录妥善结构化的文件系统。

​ 使用bind mounts的容器可以在通过容器内部的进程对主机文件系统进行修改,包括创建,修改和删除重要的系统文件和目录,这个功能虽然很强大,但显然也会造成安全方面的影响,包括影响到宿主机上Docker以外的进程。

​ 注意:

​ 1,如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。

​ 2,如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。如果原来容器中的目录有数据,那么原始数据会被隐藏掉。

​ 操作指令:

docker run -v /宿主机绝对路径目录:/容器内目录 镜像名

​ 通过下面的例子演示一下宿主机数据卷的使用:

[root@localhost ~]# docker pull mysql:5.7.31
[root@localhost mysql]# mkdir -p /data/mysql
[root@localhost mysql]# cd /data/mysql
[root@localhost mysql]# vim my.cnf

​ 在my.cnf中编辑下面的内容:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
#collection-server=utf8_unicode_ci
#collation-server=utf8_general_ci
skip-character-set-client-handshake
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1

​ 执行下面指令启动mysql:

[root@localhost mysql]# docker run -p 3306:3306 --name study-mysql -v /data/mysql:/etc/mysql -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='!QAZ@WSX#EDC' -d mysql:5.7.31
1c125daa9c19327ebff010911efcdf39ee30fa7e5e33a9cd257350f875bbfb40
[root@localhost mysql]# docker ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
1c125daa9c19        mysql:5.7.31          "docker-entrypoint.s…"   8 seconds ago       Up 7 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   study-mysql

​ 连接数据库,并在里面新建一个test的数据库并库里面新建一张表student:

在这里插入图片描述

​ 接着我们进入到宿主机的/data/mysql目录,发现新建的数据库和表信息都在里面,此时如果删除mysql容器,重新启动数据不会丢失:

[root@localhost data]# cd /data/mysql/data

在这里插入图片描述

​ 容器目录权限:

通过 -v 容器内路径: 
ro rw 改变读写权限 ro:readonly 只读 rw:readwrite 可读可写 
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 
例如: 
docker run -itd -p 81:80 --name nginx01 -v /data/nginx1:/usr/share/nginx/html:ro nginx:1.19.3-alpine
docker run -itd -p 82:80 --name nginx02 -v /data/nginx1:/usr/share/nginx/html:rw nginx:1.19.3-alpine
ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

2.3 命名的数据卷

​ 下面介绍命名数据卷的使用,下面指令创建了一个名为dream21th-volumn的数据卷:

[root@localhost nginx1]# docker run -itd -p 81:80 --name nginx03 -v dream21th-volumn:/usr/share/nginx/html:ro nginx:1.19.3-alpine
4d4331b6a55bbb12f01b5075c743b86719c82417175299f4c4fc363c60755d98
[root@localhost nginx1]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
4d4331b6a55b        nginx:1.19.3-alpine   "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds        0.0.0.0:81->80/tcp   nginx03
[root@localhost nginx1]# docker volume ls
DRIVER              VOLUME NAME
local               dream21th-volumn
[root@localhost nginx1]# docker volume inspect dream21th-volumn
[
    {
        "CreatedAt": "2022-06-22T16:16:06+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/dream21th-volumn/_data",
        "Name": "dream21th-volumn",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost nginx1]# cd /var/lib/docker/volumes/dream21th-volumn/_data
[root@localhost _data]# ll
总用量 8
-rw-r--r--. 1 root root 494 929 2020 50x.html
-rw-r--r--. 1 root root 612 929 2020 index.html

​ 通过修改数据卷目录里面的内容,可以修改页面上的展示。

2.4 匿名数据卷

[root@localhost _data]# docker run -itd -p 82:80 --name nginx04 -v /usr/share/nginx/html nginx:1.19.3-alpine
2e9b3db72931c5c4a544a28b1740929f91899d9cd4b2cb2f0e426ae0c52e393d
[root@localhost _data]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
2e9b3db72931        nginx:1.19.3-alpine   "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        0.0.0.0:82->80/tcp   nginx04
[root@localhost _data]# docker volume ls
DRIVER              VOLUME NAME
local               3e210278786cb024f0008ac1d1b86b7ecb9f94d406a59f6fe81bf680e6894f96
[root@localhost _data]# docker volume inspect 3e210278786cb024f0008ac1d1b86b7ecb9f94d406a59f6fe81bf680e6894f96
[
    {
        "CreatedAt": "2022-06-22T16:35:03+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/3e210278786cb024f0008ac1d1b86b7ecb9f94d406a59f6fe81bf680e6894f96/_data",
        "Name": "3e210278786cb024f0008ac1d1b86b7ecb9f94d406a59f6fe81bf680e6894f96",
        "Options": null,
        "Scope": "local"
    }
]

​ 删除镜像后,匿名数据卷还会存在。

2.5 清理数据卷

​ 删除上面创建的容器后会,发现数据卷仍然存在,我们就需要去清理它,不然会占用我们的资源。

[root@localhost _data]# docker volume prue

2.6 数据卷容器

​ 基础镜像:

docker pull centos:7.8.2003 
docker pull nginx:1.19.3-alpine

​ 相关指令:

docker run --volumes-from

​ 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

​ 发现创建好的数据卷容器是处于停止运行的状态,因为使用 —volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

在这里插入图片描述

root@localhost _data]# docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html  centos:7.8.2003
Unable to find image 'centos:7.8.2003' locally
7.8.2003: Pulling from library/centos
9b4ebb48de8d: Pull complete 
Digest: sha256:8540a199ad51c6b7b51492fa9fee27549fd11b3bb913e888ab2ccf77cbb72cc1
Status: Downloaded newer image for centos:7.8.2003
74f09d3de685d00de8438916aa6c2fc1019a9685ca3863a410528e561114232f
[root@localhost _data]# docker run -itd --name nginx05 -p 85:80 --volumes-from data-volume nginx:1.19.3-alpine
b5ee6142aa07632d8cd78ae7fd918d7f406d2d29cf19840f0156d603d092bf5d
[root@localhost _data]# cd /data/nginx
[root@localhost nginx]# echo "1222222" >index.html
[root@localhost nginx]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS               
74f09d3de685        centos:7.8.2003       "/bin/bash"              3 minutes ago        Exited (0) 3 minutes ago                        data-volume

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1360495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkphp学习04-控制器定义

控制器,即 controller,控制器文件存放在 controller 目录下; 如果想改变系统默认的控制器文件目录,可以在 config 下 route.php 配置: 将controller修改为controller123,就会报错,说明这个配置…

Tecplot 各版本安装指南

Tecplot下载链接 https://pan.baidu.com/s/1XbzjHnho8zIF7eC4KBFmgA?pwd0531 1.鼠标右击【Tecplot 360 EX 2023(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Tecplot 360 EX 2023(64bit)】。①解压前:需要先关闭“所…

C# 使用匿名管道进行本地进程间通信

目录 写在前面 代码实现 客户端进程 服务端进程 调用示例 写在前面 相对于命名管道通讯方式而言,匿名管道开销更小,更轻松便捷;缺点就是无法进行网络通讯,只能在本机使用,应用场景相对狭窄;适合于本地…

数据结构之哈希——学习笔记

今天看网课学习了哈希的数据结构,写下这一篇博客记录自己的学习过程。 1.哈希简介: 我们发现某些时候映射到小集合的时候会同时有多个值映射到一个下标里面,所以接下来是这种情况的解决方案1: 我们考虑当两个数字映射之后的结果…

用js计算 m-n 之间所有数的和

<script>let mprompt(输入小值)let nprompt(输入大值)function fn(min,max){let sum0for(let imin;i<max;i){sumi}return sum}let allfn(m,n)console.log(和&#xff1a;${all})</script> 效果&#xff1a;

Docker一键极速安装Nacos,并配置数据库!

1 部署方式 1.1 DockerHub javaedgeJavaEdgedeMac-mini ~ % docker run --name nacos \ -e MODEstandalone \ -e JVM_XMS128m \ -e JVM_XMX128m \ -e JVM_XMN64m \ -e JVM_MS64m \ -e JVM_MMS64m \ -p 8848:8848 \ -d nacos/nacos-server:v2.2.3 a624c64a1a25ad2d15908a67316d…

51单片机定时/计数器相关知识点

51单片机定时/计数器相关知识点 结构组成 51单片机的定时/计数器中有两个寄存器&#xff1a; T0&#xff1a;低位&#xff1a;TL0&#xff08;字节地址8AH&#xff09;高位&#xff1a;TH0&#xff08;字节地址8CH&#xff09;T1&#xff1a;低位&#xff1a;TL1&#xff08…

【java】期末复习知识点

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 填空题封装包主类开发过程的改变interfaceabstract class访问控制关键字继承多态object 类Java I/O(输入/输出)异常线程和进程创建线程的两种基本方法 编程题Hello World编写Swing程序&#xff0c;显示一个空白窗口 填空题…

代码随想录-刷题第四十八天

198. 打家劫舍 题目链接&#xff1a;198. 打家劫舍 思路&#xff1a;当前房屋偷与不偷取决于前一个房屋和前两个房屋是否被偷了。这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系&#xff0c;那么这种依赖关系都是动规的递推公式。动态规划五步曲&#xff1a;…

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

噬菌体序列分析工具PhaVa的使用和使用方法

github: 25280841/PhaVa: Adapting the phasefinder approach for identifying phase variation to long reads (github.com) 挺简单的&#xff0c;这里就不翻译了&#xff0c;大家看着直接用吧。 PhaVa PhaVa is an approach for finding potentially Phase Variable invert…

11.2 Linux串口驱动框架

tty 驱动程序框架 tty 驱动程序从下往上分别是设备驱动层、行规程、终端虚拟化、TTY I/O层&#xff0c;它们的功能如下&#xff1a; 设备驱动层&#xff1a;用于驱动设备&#xff0c;如串口、显示器、键盘等。行规程&#xff1a;用于处理控制字符、回显输入数据、缓存输入数据…

状态机(有限状态机(Finite State Machine, FSM)、推进自动机(Pushdown Automata)、并发状态机、分层状态机)

文章目录 状态机&#xff08;State Machine&#xff09;定义与组成定义组成状态&#xff08;States&#xff09;事件&#xff08;Events&#xff09;转换&#xff08;Transitions&#xff09;初始状态&#xff08;Initial State&#xff09; 状态机的类型有限状态机&#xff08…

Spark MLlib简介与机器学习流程

在大数据领域&#xff0c;机器学习是一个关键的应用领域&#xff0c;可以用于从海量数据中提取有价值的信息和模式。Apache Spark MLlib是一个强大的机器学习库&#xff0c;可以在分布式大数据处理环境中进行机器学习任务。本文将深入介绍Spark MLlib的基本概念、机器学习流程以…

MediaPipeUnityPlugin Win10环境搭建(22年3月的记录,新版本已完全不同,这里只做记录)

https://github.com/homuler/MediaPipeUnityPlugin You cannot build libraries for Android with the following steps. 1、安装msys2配置系统环境变量Path添加 C:\msys64\usr\bin 执行 pacman -Su 执行 pacman -S git patch unzip 2、安装Python3.9.10 勾选系统环境变量 …

LINUX服务器防火墙nf_conntrack问题一例

一、故障现象 业务反馈服务异常,无法响应请求&#xff0c;从系统日志 dmesg 或 /var/log/messages 看到大量以下记录&#xff1a;kernel: nf_conntrack: table full, dropping packet. 二、问题分析 业务高峰期服务器访问量大&#xff0c;内核 netfilter 模块 conntrack 相关参…

Docker 发布自定义镜像到公共仓库

Docker 发布自定义镜像到公共仓库 引言 Docker 是一种轻量级、便携式的容器化技术&#xff0c;可以使应用程序在不同环境中更加可移植。在本文中&#xff0c;我们将学习如何使用 Docker 从公共仓库拉取 Nginx 镜像&#xff0c;定制该镜像&#xff0c;添加自定义配置文件&…

1.4 SPEEDING UP REAL APPLICATIONS

我们从并行化应用程序中可以期待什么样的速度&#xff0c;这取决于应用程序中可以并行化的部分。如果可并行化部分所花费时间的百分比为30%&#xff0c;则并行部分的100倍加速将使执行时间减少不超过29.7%。整个应用程序的加速速度将仅为1.4倍左右。事实上&#xff0c;即使在并…

C语言编译器(C语言编程软件)完全攻略(第二十六部分:C-Free使用教程(使用C-Free编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十六、C-Free使用教程&#xff08;使用C-Free编写C语言程序&#xff09; 1、安装C-Free 5.0 C-Free 是一款国产的Windows下的C/C IDE&#xff0c;最新版本是 5.0&#xff0c;整个软件才 14M&#xff0c;非常轻巧&#xff0c;安装…

vue3项目中axios的常见用法和封装拦截(详细解释)

1、axios的简单介绍 Axios是一个基于Promise的HTTP客户端库&#xff0c;用于浏览器和Node.js环境中发送HTTP请求。它提供了一种简单、易用且功能丰富的方式来与后端服务器进行通信。能够发送常见的HTTP请求&#xff0c;并获得服务端返回的数据。 此外&#xff0c;Axios还提供…