Docker容器数据卷与数据卷容器

news2025/1/17 3:17:08

文章目录

    • 什么是容器数据卷
    • 使用数据卷
    • 使用 docker 安装 mysql
    • 匿名和具名挂载
    • 数据卷容器

什么是容器数据卷

Docker理念回顾
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够
持久化的!
就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!
所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成
新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行
不通的!
为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除
而丢失了!

Docekr作用

卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此
能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂
载的数据卷。

Docker特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据卷

容器中直接使用命令来添加

# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash

查看数据卷是否挂载成功 docker inspect 容器id

在这里插入图片描述

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

在这里插入图片描述

测试容器停止退出后,主机修改数据是否会同步!

  • 停止容器
  • 在宿主机上修改文件,增加些内容
  • 启动刚才停止的容器
  • 然后查看对应的文件,发现数据依旧同步!ok

在这里插入图片描述

使用 docker 安装 mysql

思考:mysql 数据持久化的问题!
搜索镜像

 docker search mysql
NAME               DESCRIPTION               STARS       
mysql               MySQL is a widely used, open-source   relation…  9488  

拉取镜像

 docker pull mysql:5.7
5.7: Pulling from library/mysql
54fec2fa59d0: Already exists
bcc6c6145912: Pull complete
951c3d959c9d: Pull complete
05de4d0e206e: Pull complete
319f0394ef42: Pull complete
d9185034607b: Pull complete
013a9c64dadc: Pull complete
e745b3361626: Pull complete
03145d87b451: Pull complete
3991a6b182ee: Pull complete
62335de06f7d: Pull complete
Digest:
sha256:e821ca8cc7a44d354486f30c6a193ec6b70a4eed8c8362aeede4e9b8d74b8ebb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

启动容器

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

使用本地的sqlyog连接测试一下 3310

查看本地的 /home/mysql 目录

 pwd
/home/mysql/data
 ls
.. ... . test  # 可以看到我们刚刚建立的mysql数据库在本地存储着

删除mysql容器

 docker rm -f mysql01 
# ls
.. ... . test    # 可以看到我们刚刚建立的mysql数据库在本地存储着

删除容器,然后发现远程连接失败!

通过Docker File 来添加(了解)

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。
我们在这里,先体验下,后面我们会详细讲解 DockerFile !

我们在宿主机 /home 目录下新建一个 docker-test-volume文件夹

mkdir docker-test-volume

在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷

VOLUME["/dataVolumeContainer1","/dataVolumeContainer2","/dataVolumeContainer3"]

出于可移植和分享的考虑,我们之前使用的 -v 主机目录:容器目录 这种方式不能够直接在DockerFile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有宿主机上都存在这样的特定目录

编写DockerFile文件

vim dockerfile1
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "-------end------"
CMD /bin/bash

build后生成镜像,获得一个新镜像 kuangshen/centos注意最后有个.

docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen/centos .

在这里插入图片描述
启动容器

docker run -it 0e97e1891a3d /bin/bash

在容器内执行 ls -l

[root@f5824970eefc /] ls -l
total 56
lrwxrwxrwx  1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x  2 root root 4096 May 11 11:55 dataVolumeContainer1  # 数据卷目录
drwxr-xr-x  2 root root 4096 May 11 11:55 dataVolumeContainer2  # 数据卷目录
drwxr-xr-x  5 root root  360 May 11 11:55 dev
drwxr-xr-x  1 root root 4096 May 11 11:55 etc
drwxr-xr-x  2 root root 4096 May 11  2019 home

问题:通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢?

我们在数据卷中新建一个文件

[root@f5824970eefc dataVolumeContainer1] pwd
/dataVolumeContainer1
[root@f5824970eefc dataVolumeContainer1] touch container.txt
[root@f5824970eefc dataVolumeContainer1] ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 11:58 container.txt

查看下这个容器的信息

 docker inspect 0e97e1891a3d

查看输出的Volumes 发现看不到

"Volumes": {
  "/dataVolumeContainer1": {},
  "/dataVolumeContainer2": {}
},

其实这个卷在主机对应的默认位置

在这里插入图片描述

注意:如果访问出现了 cannot open directory: Permission denied
解决办法:在挂载目录后多加一个 --privileged=true参数即可

匿名和具名挂载

匿名挂载

docker run -d -P --name nginx01 -v /etc/nginx nginx  # -v 容器内路径

匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护

docker volume ls

具名挂载

docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx #-v 卷名:/容器内路径

查看挂载的路径

docker volume inspect nginxconfig
[
 {
    "CreatedAt": "2020-05-13T17:23:00+08:00",
    "Driver": "local",
    "Labels": null,
    "Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
    "Name": "nginxconfig",
    "Options": null,
    "Scope": "local"
 }
]

怎么判断挂载的是卷名而不是本机目录名?不是/开始就是卷名,是/开始就是目录名

指定容器对我们挂载出来的内容的读写权限

# ro: readonly
# rw: readwrite
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为
数据卷容器。
我们使用上一步的镜像:kuangshen/centos 为模板,运行容器 docker01,docker02,docker03,他
们都会具有容器卷

"/dataVolumeContainer1"
"/dataVolumeContainer2"

我们来测试下,容器间传递共享

先启动一个父容器docker01,然后在dataVolumeContainer2新增文件

在这里插入图片描述
在这里插入图片描述
退出不停止:ctrl+P+Q

创建docker02让它继承docker01 --volumes-from

 docker run -it --name docker02 --volumes-from docker01 kuangshen/centos

查看有哪些文件

cd /dataVolumeContainer2
ls
docker01.txt

我们创建 docker02.txt

touch docker02.txt
ls
docker01.txt docker02.txt

创建docker03 让它继承docker01 --volumes-from

docker run -it --name docker03 --volumes-from docker01 kuangshen/centos

查看有哪些文件

cd /dataVolumeContainer2
ls
docker01.txt docker02.txt

我们创建 docker03.txt

touch docker03.txt
ls
docker01.txt docker02.txt docker03.txt

回到docker01发现可以看到 02 和 03 添加的共享文件

docker attach docker01
 ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txt

删除docker01,docker02 修改后docker03还能不能访问

docker rm -f docker01
docker01
docker attach docker02
ls -l         
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txt
 touch docker02-update.txt
 ls -a
. .. docker01.txt docker02.txt docker02-update.txt docker03.txt
 docker attach docker03
 ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:29 docker02-update.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txtl+P+Q 退出容器

删除docker02 ,docker03还能不能访问

docker ps
CONTAINER ID    IMAGE          
95164598b306    kuangshen/centos
ea4c82779077    kuangshen/centos
docker rm -f docker02
docker02
docker attach docker03
ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:29 docker02-update.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txt
touch docker03-update.txt

新建docker04继承docker03,然后再删除docker03,看下是否可以访问!

在这里插入图片描述

cd dataVolumeContainer2
 ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:29 docker02-update.txt
-rw-r--r-- 1 root root 0 May 11 13:32 docker03-update.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txt
# 查看当前运行的容器
 docker ps
CONTAINER ID    IMAGE           NAMES
2119f4f23a92    kuangshen/centos     docker04
95164598b306    kuangshen/centos     docker03
# 继续删除docker03
docker rm -f docker03
docker03
docker attach docker04
ls -l
total 0
-rw-r--r-- 1 root root 0 May 11 13:20 docker01.txt
-rw-r--r-- 1 root root 0 May 11 13:22 docker02.txt
-rw-r--r-- 1 root root 0 May 11 13:29 docker02-update.txt
-rw-r--r-- 1 root root 0 May 11 13:32 docker03-update.txt
-rw-r--r-- 1 root root 0 May 11 13:24 docker03.txt

得出结论:
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
存储在本机的文件则会一直保留!

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

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

相关文章

【寒假每日一题】DAY.6 有序序列的合并

牛客网例题:点我做题 描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围: 1 ≤ n,m ≤ 1000,序列中的值满足0≤val≤30000输入描述: 输入包含三行,第一行包含两个正整…

微信小程序开发起步

一、小程序与普通网页开发的区别 1)运行环境不同。网页运行在浏览器环境中,小程序运行在微信环境中。 2)API不同。由于运行环境不同,所以小程序中无法调用DOM和BOM的API,但是小程序可以调用微信环境提供的各种API&am…

zabbix的安装部署,一看就会

目录 1、系统组成 2、采集模式 3、监控类型 4、相关术语 5、安装部署 1、系统组成 2、采集模式 监控系统数据采集的工作模式可以分为 被动模式(从服务器端到客户端采集数据,对应的英文单词是pull) 主动模式 (客户端主动上报…

java基于springboot的新生报到系统app新生报到安卓app新生入学报到小程序加论文

简介 本项目主要是新生报到系统,包含的新生入学流程的功能:新生可以在app里提交预报到日期确认报到,查看自己的学费缴费记录,更改自己的银行卡号,查看课表,查看寝室,查看自己的专业班级等个人信…

CubeMX配置:定时器中断及串口配置

本文通过CubeMX配置F103RCT6的定时器中断和串口。 文章目录1 引入2 配置过程2.1 配置时钟过程2.2 配置串口过程2.3 定时器中断配置3 生成工程代码4 测试串口及定时器中断周期5 总结1 引入 拿到一个STM32控制器,在啥也没有的情况下从零开始写软件,博主习…

Java K 个一组翻转链表

K 个一组翻转链表困难给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的…

电视为何降价至200元依然没人买?爱奇艺给出了答案

近日爱奇艺提高降低会员的服务内容,消费者要享受到将内容投放到电视就要买更贵的会员服务,引发热议,此举或许能解释国内消费者为何如今不买电视了。2022年电视行业可谓是一个相当惨淡的行业,量价齐跌,随着2022年底的到…

计算机视觉OpenCv学习系列:第二部分、图像操作

第二部分、图像操作第一节、图像读取与显示1.图像理解2.图像读取与显示3.代码练习与测试第二节、图像色彩空间转换1.图像色彩空间2.函数说明与解释3.代码练习与测试第三节、图像对象的创建与赋值1.图像对象属性2.图像对象创建与赋值3.代码练习与测试第四节、图像像素的读写操作…

SpringBoot——关于controller参数校验

参数校验主要使用两个标签Validated和Valid; Valid是Hibernate的注解校验,Validated是spring的,是Valid的增强;这两个标签也有一些不同之处,Valid可以标注在成员属性上也可以嵌套校验,而Validated不行&…

Node.js 操作MySQL数据库

在讲Node.js中引入mysql模块之前先讲一下关于MySQL数据库,首先是关于MySQL数据库的安装和mysql服务以及对mysql命令和可视化工具的一个基本使用;那么在这里已经准备好了关于MySQL数据库的内容了: MySQL 数据库安装详细 : MySQL数…

redis主从复制,一主多仆启动流程

文章目录一、安装redis二、复制修改配置文件三、添加conf配置文件四、开启主从复制五、薪火相传六、反客为主7、哨兵模式一、安装redis redis安装笔记 https://blog.csdn.net/G_GUi/article/details/128361131 二、复制修改配置文件 把redis.conf复制到一个新建文件夹里面&a…

安卓手机还有这么多神仙玩法,关键只有少数人知道

随着“智能手机”的快速更新迭代,手机系统逐渐融入了许多实用功能;今年Android手机市场竞争相当激烈,各大手机品牌都争先恐后地向消费者展示自己的新机型。今天我就来给大家分享几个只有安卓手机才有的隐藏黑科技功能,每个功能都非…

cocos creator新手教程:第003节3D模型的基本概念

3.1 计算机如何制作一个3D模型 讲述这个问题之前,我们先来看下现实生活中我们要做一个模型,应该如何做呢?首先我们要把模型的形状给雕刻构建出来,现实生活中的物体都是由分子组成的连续的表面,计算机是离散的无法做到这…

【jQuery】常用API——尺寸、位置操作

一、jQuery 尺寸 以上参数为空&#xff0c;则是获取相应值&#xff0c;返回的是数字型。如果参数为数字&#xff0c;则是修改相应值。参数可以不必写单位。 <style>div {width: 200px;height: 200px;background-color: pink;padding: 10px;border: 15px solid red;margin…

在Windows中安装Mysql数据库(shawn安装成功记录)

一、下载安装包 首先去官网下载mysql安装包 下载网址:https://dev.mysql.com/downloads/mysql/ 下载Windows系统版本,如下图 注意版本必须是8.xx, 5开头的版本不适合本教程   点击下载,选择自己的文件路径,C盘非C盘都可以(我没有放C盘),路径中不要出现中文…

【蓝桥杯简单篇】Python组刷题日寄Part08

刷题日记&#xff1f;刷题日寄&#xff01; 萌新备战蓝桥杯python组 &#x1f339; 发现有需要纠正的地方&#xff0c;烦请指正&#xff01; &#x1f680; 欢迎小伙伴们的三连关注&#xff01; 往期系列&#xff1a; 【蓝桥杯简单篇】Python组刷题日寄Part01 【蓝桥杯简单篇】…

SCRM开源营销平台MarketGo-创建员工活码

一、背景介绍 客户需求&#xff1a;企业在做营销活动的时候&#xff0c;会有大量的客户需要添加企业微信的联系方式。这样就有两个问题&#xff1a; 一个企业微信账号添加太多会受到企业微信的限制&#xff1b;如果有多个企业微信的账号&#xff0c;添加的客户的数量也不平均…

如何给PPT文件添加水印?

我们在制作PPT的时候&#xff0c;有时候需要在幻灯片上加入logo&#xff0c;或者特定的大小、颜色等一致的文字标题&#xff0c;而幻灯片通常都是很多页数的&#xff0c;如果一张张幻灯片来添加&#xff0c;那就很费功夫。 这种情况&#xff0c;我们就可以选择通过“幻灯片母版…

SSL/TLS协议详解 - https为什么比http更安全

概述 首先纠正一个错误&#xff0c;可能很多初学者都以为HTTPS跟HTTP一样&#xff0c;都属于应用层协议。但其实HTTPS并不是一个单独的协议。HTTPS是安全版本的HTTP&#xff0c;简单理解 HTTPS HTTP SSL/TLS&#xff0c;即HTTPS就是使用SSL/TLS协议对HTTP报文进行了加密处理…

一不小心进入“决赛圈”,没“阳过”的怎么办?

前两天看到一个央视新闻&#xff0c;说河南新冠病毒感染率接近90%&#xff0c;流行毒株是奥密克戎BA.5.2&#xff0c;数字让我挺吃惊的&#xff1a;真有这么多人感染了&#xff1f; 如果是这样&#xff0c;我就属于那幸运的10%了&#xff0c;没有经历过刀片嗓&#xff0c;水泥鼻…